iOS開(kāi)發(fā)判斷手機(jī)是否越獄

本文中主要整理介紹三種親測(cè)好用的檢測(cè)越獄的方式

1.通過(guò)越獄后增加的越獄文件判斷

判斷這些文件是否存在,讓文件添加到數(shù)組中,遍歷數(shù)組,如果存在任何一個(gè)文件,就認(rèn)為是越獄了

- (BOOL)isJailBreak {
    NSArray *jailbreak_tool_paths = @[
        @"/Applications/Cydia.app",
        @"/Library/MobileSubstrate/MobileSubstrate.dylib",
        @"/bin/bash",
        @"/usr/sbin/sshd",
        @"/etc/apt"
    ];
    for (int i=0; i<jailbreak_tool_paths.count; i++) {
        if ([[NSFileManager defaultManager] fileExistsAtPath:jailbreak_tool_paths[i]]) {
            NSLog(@"The device is jail broken!");
            return YES;
        }
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
}

2.是否能打開(kāi)cydia這個(gè)協(xié)議頭

- (BOOL)isJailBreak {
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
        NSLog(@"The device is jail broken!");
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
}
IMG_6999.PNG

前兩種方式檢測(cè)的代碼通過(guò)越獄的手機(jī)通過(guò)安裝上面??這個(gè)插件開(kāi)啟屏蔽檢測(cè)就能輕松繞過(guò),而下面??第三種方法測(cè)試開(kāi)啟后無(wú)法繞過(guò),所以更推薦第三種。

3.越獄后的手機(jī)是可以獲取到手機(jī)內(nèi)安裝的所有應(yīng)用程序的,如果可以獲取到就說(shuō)明越獄了

- (BOOL)isJailBreak {
    if ([[NSFileManager defaultManager] fileExistsAtPath:@"User/Applications/"]) {
        NSLog(@"The device is jail broken!");
        NSArray *appList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"User/Applications/" error:nil];
        NSLog(@"appList = %@", appList);
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
}

真正使用的時(shí)候,為了保證判斷的準(zhǔn)確性,可以3種方法結(jié)合起來(lái)判斷,只要有一個(gè)方法返回yes,就認(rèn)為是越獄。然后就可以進(jìn)行 exit(0); 操作。

當(dāng)然了,攻擊者可以直接通過(guò)替換系統(tǒng)的fileExistsAtPath函數(shù),讓他一直返回false,從而繞過(guò)軟件路徑的檢測(cè)。這時(shí)候就需要一些C語(yǔ)言的函數(shù)去做更加精確的檢測(cè)。
雖然這里用到的是C語(yǔ)言檢測(cè)函數(shù),但這些函數(shù)被hook的可能性也是存在的,比如fishhook。。
如果真有大佬手動(dòng)hook這些函數(shù)或者直接修改二進(jìn)制的話,那也沒(méi)啥好防的,大佬們隨便吧。。

所以也印證了那句話:沒(méi)有絕對(duì)的安全,你唯一能做的就是拖延攻擊者的腳步。

對(duì)于這些函數(shù),不建議單獨(dú)寫方法,容易被hook掉,所以最好是寫在不能被hook的函數(shù)里,比如

application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

誰(shuí)TM會(huì)hook程序的初始化函數(shù)。。

另外越獄檢測(cè)函數(shù)最好不要出現(xiàn)Jailbreak,或者canijailbreak,或者AntiJailbreak這種字段,很容易被定位到。

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

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