GDB是大多數hackers的首選,阻止GDB依附到應用的常規辦法是:
1 2 3 4 5 6 7 8 9 10 11 |
#import <sys/ptrace.h> int 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真實的執行環境是沒有sys/ptrace.h丟擲的。雖然 ptrace 方法沒有被丟擲, 但是不用擔心,我們可以通過dlopen拿到它。
dlopen: 當path 引數為0是,他會自動查詢 $LD_LIBRARY_PATH,$DYLD_LIBRARY_PATH, $DYLD_FALLBACK_LIBRARY_PATH 和 當前工作目錄中的動態連結庫。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#import <dlfcn.h> #import <sys/types.h> typedef 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])); } } |