iOS ptrace 对 APP进行反调试处理

今天有一个需求,需要对项目进行反调试处理  查看了很多的博客,终于找到了,大多写的不是很全.我总结下.

一般使用

    ptrace_ptr(PT_DENY_ATTACH,0,0,0);来反调试。

首先要在工程的main.m类中导入头文件#include,

我查找了几篇博客都没写这个,导致了很多错误.

然后就是代码部分了

typedefint(*ptrace_ptr_t)(int_request,pid_t_pid,caddr_t_addr,int_data);

void* dlopen(constchar* pathname,intmode );

#if !defined(PT_DENY_ATTACH)

#define PT_DENY_ATTACH31

#endif  // !defined(PT_DENY_ATTACH)

voiddisable_gdb() {

    void* handle =dlopen(0,RTLD_GLOBAL|RTLD_NOW);

    ptrace_ptr_tptrace_ptr =dlsym(handle,"ptrace");

    ptrace_ptr(PT_DENY_ATTACH,0,0,0);

    dlclose(handle);

}

最后在 main 函数中调用

intmain(intargc,char* argv[]) {

    /**防止GDB挂起*/

#ifndef DUBUG

    disable_gdb();

#endif

    @autoreleasepool {

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

    }

}

不过还有反反调试,可以破解反调试的.

1,ptrace这个函数很容易修改,几种破解方式

运行时期,断点ptrace,直接返回 :

通过tweak,替换disable_gdb函数

在二进制文件中 ,修改 PT_DENY_ATTACH的31,改成 任意一个值,如PT_ATTACH 0.

2,开发者要达到反调试的目的,必然是在某个地方(大多数还是在main函数)执行了ptrace(PT_DENY_ATTACH, 0, 0, 0)。所以反反调试的思路非常简单,就是阻止这个执行的发生。

既然lldb有-w这个选项来等待一个进程的启动,你可以使用lldb来捕获到一个进程的启动并在程序执行到ptrace命令之前修改或忽略PT_DENY_ATTACH命令。

命令行执行:➜ ~ sudo lldb -n "helloptrace" -w。这里用sudo是因为lldb的一个bug,当你让lldb等待某个进程的启动时不用sudo会出错。

找到上述项目的二进制文件,拖到命令行中执行,然后lldb就应该能够成功attach上去:

➜  ~ sudo lldb -n"helloptrace"-w(lldb) process attach --name"helloptrace"--waitforProcess 8336 stopped* thread#1, stop reason = signal SIGSTOPframe#0: 0x0000000109522b9a dyld`__ioctl + 10dyld`__ioctl:->  0x109522b9a <+10>: jae    0x109522ba4              ; <+20>    0x109522b9c <+12>: mov    rdi, rax    0x109522b9f <+15>: jmp    0x109522325              ; cerror    0x109522ba4 <+20>: retExecutable modulesetto"/Users/gogleyin/Library/Developer/Xcode/DerivedData/helloptrace-bjtaxdebpzdyraaogpbcrihdgwku/Build/Products/Debug/helloptrace".Architecturesetto: x86_64h-apple-macosx.

创建如下断点:

(lldb) rb ptrace -s libsystem_kernel.dylib

continue继续执行后你就会在ptrace函数将要执行时停下来。你可以用lldb来让程序不执行那个函数并提前返回:

(lldb) thread return 0

continue继续执行,一个反反调试就达成了!虽然程序进入了ptrace函数,但你是告诉lldb让它提前返回使得函数逻辑没有得到执行。

参考博客:

链接:https://www.jianshu.com/p/75776311ae36

链接:https://www.jianshu.com/p/13e90ec55234

链接:https://segmentfault.com/a/1190000012216003

你可能感兴趣的:(iOS ptrace 对 APP进行反调试处理)