theos反越獄檢測的一種hook方案

1、iOS App運行的步驟為:

用戶點擊 -> load(各種framework和dylib, 包含MobileLoader加載的cydia dylib) -> main -> UIApplicationMain -> AppDelegate -> UIWindow -> ViewControllers -> ...

2、占得先機hook檢測函數(shù)

對于App廠商而言,App越獄檢測可能出現(xiàn)在main或以后的任何環(huán)節(jié),為了掌控一切,占得先機很有必要。

經(jīng)過實測,發(fā)現(xiàn)+[NSObject load]中進行hook居然比dylib的入口函數(shù)還快!

static __attribute__((constructor)) void _logosLocalInit() {

? ? // TODO:

printf("DYLIB START RUNNING.");

}

那么,猜想+[NSObject load] hook 可以占得先機。

3、簡單測試

部分代碼如下:

#pragma mark - Hook before ready.

@interfaceNSObject(SuperHooker)

@end

@implementationNSObject(SuperHooker)

+ (void)load

{

? ? staticdispatch_once_t once;

? ? dispatch_once(&once, ^{

? ? ? ? rebind_symbols((structrebinding[9]){

? ? ? ? ? ? {"fork", replaced_fork, (void*)&original_fork},

? ? ? ? ? ? {"stat", replaced_stat, (void*)&original_stat},

? ? ? ? ? ? {"access", replaced_access, (void*)&original_access},

? ? ? ? ? ? {"fopen", replaced_fopen, (void*)&original_fopen},

? ? ? ? ? ? {"dlopen", replaced_dlopen, (void*)&original_dlopen},

? ? ? ? ? ? {"dladdr", replaced_dladdr, (void*)&original_dladdr},

? ? ? ? ? ? {"dlsym", replaced_dlsym, (void*)&original_dlsym},

? ? ? ? ? ? {"dlopen_preflight", replaced_dlopen_preflight, (void*)&original_dlopen_preflight},

? ? ? ? ? ? {"dyld_get_image_name", replaced_dyld_get_image_name, (void*)&original_dyld_get_image_name}

? ? ? ? },9);

????printf("NSObject load RUNNING.");

? ? });

}

@end

可以在Xcode上新建一個App,然后結(jié)合tweak進行調(diào)試驗證。

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

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