离线下载
PDF版 ePub版

念茜 · 更新于 2018-11-28 11:00:43

阻止 GDB 依附

GDB 是大多数 hackers 的首选,阻止 GDB 依附到应用的常规办法是:

#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 和当前工作目录中的动态链接库。

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