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)試驗證。