1氨鹏、iOS App運(yùn)行的步驟為:
用戶點(diǎn)擊 -> load(各種framework和dylib, 包含MobileLoader加載的cydia dylib) -> main -> UIApplicationMain -> AppDelegate -> UIWindow -> ViewControllers -> ...
2、占得先機(jī)hook檢測函數(shù)
對于App廠商而言蝗岖,App越獄檢測可能出現(xiàn)在main或以后的任何環(huán)節(jié)晦雨,為了掌控一切架曹,占得先機(jī)很有必要。
經(jīng)過實(shí)測闹瞧,發(fā)現(xiàn)+[NSObject load]中進(jìn)行hook居然比dylib的入口函數(shù)還快绑雄!
static __attribute__((constructor)) void _logosLocalInit() {
? ? // TODO:
printf("DYLIB START RUNNING.");
}
那么,猜想+[NSObject load] hook 可以占得先機(jī)奥邮。
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上新建一個(gè)App,然后結(jié)合tweak進(jìn)行調(diào)試驗(yàn)證漠烧。