GDB 是大多數(shù) hackers 的首選堪唐,阻止 GDB 依附到應(yīng)用的常規(guī)辦法是:
#importint main(int argc, charchar *argv[])
{
#ifndef DEBUG
ptrace(PT_DENY_ATTACH,0,0,0);
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([WQMainPageAppDelegate class]));
}
}
但遺憾的是沼瘫,iPhone 真實(shí)的運(yùn)行環(huán)境是沒有 sys/ptrace.h 拋出的婿禽。雖然 ptrace 方法沒有被拋出, 但是不用擔(dān)心族扰,我們可以通過 dlopen 拿到它丽惭。
dlopen: 當(dāng) path 參數(shù)為 0 是,他會(huì)自動(dòng)查找
$LD_LIBRARY_PATH, $DYLD_LIBRARY_PATH, $DYLD_FALLBACK_LIBRARY_PATH 和當(dāng)前工作目錄中的動(dòng)態(tài)鏈接庫务蝠。
#import#importtypedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif? // !defined(PT_DENY_ATTACH)
void disable_gdb() {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
dlclose(handle);
}
int main(int argc, charchar *argv[])
{
#ifndef DEBUG
disable_gdb();
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([WQMainPageAppDelegate class]));
}
}