在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ iOS/ 越獄檢測(cè)的攻與防
Hack 實(shí)戰(zhàn)——支付寶 App 手勢(shì)密碼校驗(yàn)欺騙
使用 Reveal 分析他人 App
后臺(tái) daemon 非法竊取用戶 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 必備的命令與工具
鍵盤緩存與安全鍵盤
數(shù)據(jù)保護(hù) API

越獄檢測(cè)的攻與防

在應(yīng)用開發(fā)過(guò)程中,我們希望知道設(shè)備是否越獄,正以什么權(quán)限運(yùn)行程序,好對(duì)應(yīng)采取一些防御和安全提示措施。

iOS7 相比之前版本的系統(tǒng)而言,升級(jí)了沙盒機(jī)制,封鎖了幾乎全部應(yīng)用沙盒可以共享數(shù)據(jù)的入口。即使在越獄情況下,限制也非常多,大大增加了應(yīng)用層攻擊難度。比如,在 iOS7 之前,我們可以嘗試往沙盒外寫文件判斷是否越獄,但 iOS7 越獄后也無(wú)該權(quán)限,還使用老方法檢測(cè)會(huì)導(dǎo)致誤判。

那么,到底應(yīng)該如何檢測(cè)越獄呢?攻擊者又會(huì)如果攻破檢測(cè)呢?本文就著重討論一下越獄檢測(cè)的攻與防。

http://wiki.jikexueyuan.com/project/ios-security-defense/images/gongfang.png" alt="gongfang" />

首先,你可以嘗試使用 NSFileManager 判斷設(shè)備是否安裝了如下越獄常用工具:

/Applications/Cydia.app /Library/MobileSubstrate/MobileSubstrate.dylib /bin/bash /usr/sbin/sshd /etc/apt

但是不要寫成 BOOL 開關(guān)方法,給攻擊者直接鎖定目標(biāo) hook 繞過(guò)的機(jī)會(huì)

+(BOOL)isJailbroken{  
    if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]){  
        return YES;  
    }  
    // ...  
}  

攻擊者可能會(huì)改變這些工具的安裝路徑,躲過(guò)你的判斷。

那么,你可以嘗試打開 cydia 應(yīng)用注冊(cè)的 URL scheme:

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){  
     NSLog(@"Device is jailbroken");  
}  

但是不是所有的工具都會(huì)注冊(cè) URL scheme,而且攻擊者可以修改任何應(yīng)用的 URL scheme。

那么,你可以嘗試讀取下應(yīng)用列表,看看有無(wú)權(quán)限獲取:

if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){  
        NSLog(@"Device is jailbroken");  
        NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/"  
                                                                               error:nil];  
        NSLog(@"applist = %@",applist);  
}  

越了獄的設(shè)備是可以獲取到的:

http://wiki.jikexueyuan.com/project/ios-security-defense/images/gongfang2.png" alt="gongfang2" />

攻擊者可能會(huì) hook NSFileManager 的方法,讓你的想法不能如愿。

那么,你可以回避 NSFileManager,使用 stat 系列函數(shù)檢測(cè) Cydia 等工具:

#import <sys/stat.h>  

void checkCydia(void)  
{  
    struct stat stat_info;  
    if (0 == stat("/Applications/Cydia.app", &stat_info)) {  
        NSLog(@"Device is jailbroken");  
    }  
}  

攻擊者可能會(huì)利用 Fishhook 原理 hook 了 stat 。

那么,你可以看看 stat 是不是出自系統(tǒng)庫(kù),有沒有被攻擊者換掉:

#import <dlfcn.h>  

void checkInject(void)  
{  
    int ret ;  
    Dl_info dylib_info;  
    int (*func_stat)(const charchar *, struct stat *) = stat;  
    if ((ret = dladdr(func_stat, &dylib_info))) {  
        NSLog(@"lib :%s", dylib_info.dli_fname);  
    }  
}  

如果結(jié)果不是 /usr/lib/system/libsystem_kernel.dylib 的話,那就 100% 被攻擊了。 如果 libsystem_kernel.dylib 都是被攻擊者替換掉的…… 那也沒什么可防的大哥你隨便吧……

那么,你可能會(huì)想,我該檢索一下自己的應(yīng)用程序是否被鏈接了異常動(dòng)態(tài)庫(kù)。 列出所有已鏈接的動(dòng)態(tài)庫(kù):

#import <mach-o/dyld.h>  

void checkDylibs(void)  
{  
    uint32_t count = _dyld_image_count();  
    for (uint32_t i = 0 ; i < count; ++i) {  
        NSString *name = [[NSString alloc]initWithUTF8String:_dyld_get_image_name(i)];  
        NSLog(@"--%@", name);  
    }  
}  

通常情況下,會(huì)包含越獄機(jī)的輸出結(jié)果會(huì)包含字符串:Library/MobileSubstrate/MobileSubstrate.dylib 。

攻擊者可能會(huì)給 MobileSubstrate 改名,但是原理都是通過(guò) DYLD_INSERT_LIBRARIES注入動(dòng)態(tài)庫(kù)。

那么,你可以通過(guò)檢測(cè)當(dāng)前程序運(yùn)行的環(huán)境變量:

void printEnv(void)  
{  
    charchar *env = getenv("DYLD_INSERT_LIBRARIES");  
    NSLog(@"%s", env);  
}  

未越獄設(shè)備返回結(jié)果是 null ,越獄設(shè)備就各有各的精彩了,尤其是老一點(diǎn)的 iOS 版本越獄環(huán)境。