阻止 GDB 依附

4 阻止 GDB 依附

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]));
    }
}

Comments