鍍金池/ 教程/ iOS/ 二進(jìn)制和資源文件自檢
Hack 實(shí)戰(zhàn)——支付寶 App 手勢(shì)密碼校驗(yàn)欺騙
使用 Reveal 分析他人 App
后臺(tái) daemon 非法竊取用戶(hù) iTunesstore 信息
使用 iNalyzer 分析應(yīng)用程序
越獄檢測(cè)的攻與防
使用 introspy 追蹤分析應(yīng)用程序
廢除應(yīng)用程序的 ASLR 特性
使用 Cycript 修改支付寶 App 運(yùn)行時(shí)
敏感邏輯的保護(hù)方案
Fishhook
使用 class-dump-z 分析支付寶 App
static 和被裁的符號(hào)表
iOS7 的動(dòng)態(tài)庫(kù)注入
二進(jìn)制和資源文件自檢
Hack 實(shí)戰(zhàn)——探究支付寶 App 手勢(shì)密碼
使用 Keychain-Dumper 導(dǎo)出 keychain 數(shù)據(jù)
數(shù)據(jù)擦除
Hack 實(shí)戰(zhàn)——解除支付寶 App 手勢(shì)解鎖錯(cuò)誤次數(shù)限制
Objective-C 代碼混淆
阻止 GDB 依附
基于腳本實(shí)現(xiàn)動(dòng)態(tài)庫(kù)注入
Hack 必備的命令與工具
鍵盤(pán)緩存與安全鍵盤(pán)
數(shù)據(jù)保護(hù) API

二進(jìn)制和資源文件自檢

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

何以判斷自己是不是正版 app 呢? hackers 們破解你的 app ,無(wú)非就 2 個(gè)地方可以動(dòng),1 個(gè)是二進(jìn)制,1 個(gè)是資源文件。

二進(jìn)制都重新編譯過(guò)了自然肯定是盜版……

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

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

我封裝了相關(guān)文件的讀取地址

@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% 安全了嗎?
答案是:不……
所謂魔高一尺,道高一丈,不過(guò)也能阻止一些低級(jí)的 hack 手段了~