二进制和资源文件自检

我们把自己的程序发布到 app store,但是不能保证每一个用户都是从 app store 下载官方 app,也不能保证每一个用户都不越狱。 换句话说,我们无法保证程序运行环境在 MAC 管控策略下就绝对的安全。 所以,在有些情况下,尤其是和钱有关系的 app ,我们有必要在和服务器通信时,让服务器知道客户端到底是不是官方正版的 app 。

何以判断自己是不是正版 app 呢? hackers 们破解你的 app ,无非就 2 个地方可以动,1 个是二进制,1 个是资源文件。

二进制都重新编译过了自然肯定是盗版……

有些低级的 hackers 喜欢修改人家的资源文件然后贴上自己的广告,或者给用户错误的指引……修改资源文件是不需要重新编译二进制的。

因此,我们有必要在敏感的请求报文中,增加正版应用的二进制和资源文件的标识,让服务器知道,此请求是否来自正版的未经修改的 app 。 在沙盒中,我们可以读到自己程序的二进制,也可以读到资源文件签名文件,这两个文件都不算大,我们可以对其取 md5 值然后以某种组合算法得到一个标记字符串,然后发给服务器。

我封装了相关文件的读取地址

@implementation WQPathUtilities

+ (NSString *)directory:(NSSearchPathDirectory)dir

{

NSArray *paths = NSSearchPathForDirectoriesInDomains(dir, NSUserDomainMask, YES);

NSString *dirStr = [paths objectAtIndex:0];

return dirStr;

}

+ (NSString *)documentsDirectory

{

return [WQPathUtilities directory:NSDocumentDirectory];

}

+ (NSString *)cachesDirectory

{

return [WQPathUtilities directory:NSCachesDirectory];

}

+ (NSString *)tmpDirectory

{

return NSTemporaryDirectory();

}

+ (NSString *)homeDirectory

{

return NSHomeDirectory();

}

+ (NSString *)codeResourcesPath

{

NSString *excutableName = [[NSBundle mainBundle] infoDictionary][@"CFBundleExecutable"];

NSString *tmpPath = [[WQPathUtilities documentsDirectory] stringByDeletingLastPathComponent];

NSString *appPath = [[tmpPath stringByAppendingPathComponent:excutableName]

stringByAppendingPathExtension:@"app"];

NSString *sigPath = [[appPath stringByAppendingPathComponent:@"_CodeSignature"]

stringByAppendingPathComponent:@"CodeResources"];

return sigPath;

}

+ (NSString *)binaryPath

{

NSString *excutableName = [[NSBundle mainBundle] infoDictionary][@"CFBundleExecutable"];

NSString *tmpPath = [[WQPathUtilities documentsDirectory] stringByDeletingLastPathComponent];

NSString *appPath = [[tmpPath stringByAppendingPathComponent:excutableName]

stringByAppendingPathExtension:@"app"];

NSString *binaryPath = [appPath stringByAppendingPathComponent:excutableName];

return binaryPath;

}

@end

md5方法:

#import "CommonCrypto/CommonDigest.h"

+(NSString *)md5WithString:(NSString *)string

{

const charchar *cStr = [string UTF8String];

unsigned char result[CC_MD5_DIGEST_LENGTH];

CC_MD5(cStr, strlen(cStr), result);

return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",

result[0], result[1], result[2], result[3],

result[4], result[5], result[6], result[7],

result[8], result[9], result[10], result[11],

result[12], result[13], result[14], result[15]

] lowercaseString];

}

这样做就 100% 安全了吗?

答案是:不……

所谓魔高一尺,道高一丈,不过也能阻止一些低级的 hack 手段了~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:原文---念茜的博客 我们把自己的程序发布到app store,但是不能保证每一个用户都是从app store...
    richar_阅读 3,712评论 0 0
  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 8,153评论 0 7
  • 先说一下:MD5加密可破解,每一个原密码对应一个不变的MD5加密的密码效果: MD5加密demo 密码: c1j2...
    IIronMan阅读 7,206评论 2 32
  • # ios常用的一些判断 ## 根据日起计算是周几 ``` + (NSString*)weekdayStringF...
    呵呵你妹521阅读 4,578评论 1 4
  • 技术无极限,从菜鸟开始,从源码开始。 由于公司目前项目还是用OC写的项目,没有升级swift 所以暂时SDWebI...
    充满活力的早晨阅读 14,330评论 0 2