GDB是大多數(shù)hackers的首選骑冗,阻止GDB依附到應(yīng)用的常規(guī)辦法是:
1. #import <sys/ptrace.h>
3. int main(int argc, charchar *argv[])
4. {
5. #ifndef DEBUG
6. ptrace(PT_DENY_ATTACH,0,0,0);
7. #endif
8. @autoreleasepool {
9. return UIApplicationMain(argc, argv, nil, NSStringFromClass([WQMainPageAppDelegate class]));
10. }
11. }
但遺憾的是治泥,iPhone真實(shí)的運(yùn)行環(huán)境是沒(méi)有sys/ptrace.h拋出的搅轿。雖然 ptrace 方法沒(méi)有被拋出, 但是不用擔(dān)心琴昆,我們可以通過(guò)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)鏈接庫(kù).
1. #import <dlfcn.h>
2. #import <sys/types.h>
4. typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
5. #if !defined(PT_DENY_ATTACH)
6. #define PT_DENY_ATTACH 31
7. #endif // !defined(PT_DENY_ATTACH)
9. void disable_gdb() {
10. void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
11. ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
12. ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
13. dlclose(handle);
14. }
16. int main(int argc, charchar *argv[])
17. {
18. #ifndef DEBUG
19. disable_gdb();
20. #endif
21. @autoreleasepool {
22. return UIApplicationMain(argc, argv, nil, NSStringFromClass([WQMainPageAppDelegate class]));
23. }
24. }
--------“不積小流,無(wú)以成江海嗡贺;不積跬步隐解,無(wú)以至千里。 ”--------
(機(jī)會(huì)永遠(yuǎn)是留給那些有準(zhǔn)備的人) ↓ ↓ ↓