GDB,IDE是大多数hackers的首选,阻止GDB依附到应用的常规办法是:
. #import <sys/ptrace.h>
.
. int main(int argc, charchar *argv[])
. {
. #ifndef DEBUG
. ptrace(PT_DENY_ATTACH,,,);
. #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 和 当前工作目录中的动态链接库.
. #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(, RTLD_GLOBAL | RTLD_NOW);
. ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
. ptrace_ptr(PT_DENY_ATTACH, , , );
. dlclose(handle);
. }
.
. int main(int argc, charchar *argv[])
. {
. #ifndef DEBUG
. disable_gdb();
. #endif
. @autoreleasepool {
. return UIApplicationMain(argc, argv, nil, NSStringFromClass([WQMainPageAppDelegate class]));
. }
. }