阻止GDB依附

2014-07-29 Xiaosong Gao 更多博文 » 博客 » GitHub »

Security

原文链接 https://gaoxiaosong.github.io/2014/07/29/prevent-gdb-attach.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


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

#import <sys/ptrace.h>

int main(int argc, char * 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, char * argv[])
{
#ifndef DEBUG
  disable_gdb();
#endif
  @autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([WQMainPageAppDelegate class]));
  }
}