iOS ptrace 对 APP进行反调试处理

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

一般使用

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

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

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

然后就是代码部分了

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 调试器究竟是怎么工作的?如何阻止一个进程attach(挂载)到app上以及又如何破解这些保护(所谓反调试和反反调试...
    blueshadow阅读 7,190评论 8 10
  • 前提 众所周知,iOS系统安全性非常高,很少出现漏洞,几乎不会中毒。大家认为苹果系统的封闭性会使iOS APP安全...
    小枫123阅读 1,525评论 0 10
  • layout: wikititle: iOS逆向分析笔记categories: Reverse_Engineeri...
    超哥__阅读 11,456评论 3 16
  • [转]浅谈LLDB调试器文章来源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc阅读 2,734评论 2 6
  • 我还是很喜欢你。 八月底了我从湖北到内蒙古还不满十天 四年了我们依旧纠缠不清藕断丝连 2013年高一与你相遇,那时...
    深海铃阅读 236评论 0 0

友情链接更多精彩内容