二進制和資源文件自檢

我們把自己的程序發(fā)布到 app store,但是不能保證每一個用戶都是從 app store 下載官方 app,也不能保證每一個用戶都不越獄。 換句話說,我們無法保證程序運行環(huán)境在 MAC 管控策略下就絕對的安全。 所以,在有些情況下,尤其是和錢有關系的 app ,我們有必要在和服務器通信時,讓服務器知道客戶端到底是不是官方正版的 app 。

何以判斷自己是不是正版 app 呢? hackers 們破解你的 app ,無非就 2 個地方可以動,1 個是二進制,1 個是資源文件。

二進制都重新編譯過了自然肯定是盜版……

有些低級的 hackers 喜歡修改人家的資源文件然后貼上自己的廣告,或者給用戶錯誤的指引……修改資源文件是不需要重新編譯二進制的。

因此,我們有必要在敏感的請求報文中,增加正版應用的二進制和資源文件的標識,讓服務器知道,此請求是否來自正版的未經(jīng)修改的 app 。 在沙盒中,我們可以讀到自己程序的二進制,也可以讀到資源文件簽名文件,這兩個文件都不算大,我們可以對其取 md5 值然后以某種組合算法得到一個標記字符串,然后發(fā)給服務器。

我封裝了相關文件的讀取地址

@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 手段了~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 注:原文---念茜的博客 我們把自己的程序發(fā)布到app store,但是不能保證每一個用戶都是從app store...
    richar_閱讀 679評論 0 0
  • 先說一下:MD5加密可破解,每一個原密碼對應一個不變的MD5加密的密碼效果: MD5加密demo 密碼: c1j2...
    IIronMan閱讀 2,666評論 2 32
  • # ios常用的一些判斷 ## 根據(jù)日起計算是周幾 ``` + (NSString*)weekdayStringF...
    呵呵你妹521閱讀 1,072評論 1 4
  • 技術無極限,從菜鳥開始,從源碼開始。 由于公司目前項目還是用OC寫的項目,沒有升級swift 所以暫時SDWebI...
    充滿活力的早晨閱讀 12,842評論 0 2
  • 今天我們上了一節(jié)音樂課,
    賈民喆閱讀 189評論 0 0

友情鏈接更多精彩內(nèi)容