利用Xcode逆向的原理 和 逆向防护

一、利用XCode进行逆向的原理:

  • XCode真机调试的简单流程:
  1. 编译:Clang -> IR ... -> IR -> 汇编 -> Mach-O
  2. 打包成 */Products/xxx.app
  3. 签名(原理是苹果私钥三重数字签名)
  4. 安装到真机,并验证签名
  • 懂得基本原理即可利用XCode来逆向别人app
  • 逆向原理:
  1. 既然XCode是生成一个*/Products/xxx.app安装进手机,那我可以建一个壳工程,用待逆向的已脱壳的WeChat.app 去替换 这个壳工程的*/Products/xxx.app
  2. 替换完后,将WeChat.app重签名成壳工程的包名、证书、描述文件,即可在我手机上运行

注:这两步可以添加编译脚本完成(XCode自带的Run Script),利用上一篇文章提到的XCode环境变量

二、防逆向调试 与 反防调试

  • XCode调试原理:
  1. lldb 给 debugServer 发调试命令(如:image list命令查看ASLR)
  2. debugServer 可以依附到 指定进程、端口号
  3. debugServer 暂停住 依附的进程,读取寄存器信息,反馈给 lldb
  • 防调试原理:
  • debugServer 之所以能调试app,是依赖操作系统提供的ptraceAPI,ptrace能依附到进程上卡住进程
  • 既如此,只要禁止 debugServer 依附到 进程上、或者禁止 debugServer 卡住进程即可(或其他中间环节)
  • 正好 系统ptraceAPI提供了方法去禁止依附到 进程上
  • 实现代码:
//项目中调用 `ptrace(31, 0, 0, 0);` 即可防止项目被别人调试
#define    PT_DENY_ATTACH    31
int ptrace(int _request, pid_t _pid, caddr_t _addr, int _data);
  • 反防调试原理:(针对ptrace)

方法1(太难):分析Mach-O获得ptrace代码位置,从Mach-O的__TEXT段移除ptrace代码
方法2(常用):开了ptrace防调试,调试时进程会crash,利用lldb添加ptrace符号断点,获取代码位置,利用hook移除ptrace代码

三、利用XCode逆向 与 利用theos逆向 比较

1、XCode逆向方便太多:

  • 非越狱手机即可逆向
  • 能直接利用XCode断点调试 (当然可能需要hook干掉 ptrace防调试)
  • 利用XCode查看页面布局Hierarchy

2、theos逆向:

  • 必须使用越狱手机
  • 必须用脚本建立 lldb 与 debugServer的连接,指定端口号
  • 必须会使用 lldb 指令(但此时因为包已替换,XCode加断点也只能通过breakpoint set
  • 必须通过Reveal查看图形化页面布局Hierarchy

3、显然XCode逆向更实用更便捷,同时,GitHub有大神提供全套逆向工具MonkeyDev
但使用theos你能学到更多底层知识,知其所以然(比如你可能会经历学习ssh、Cycript、Mach-O、ASLR、lldb、命令行工具、dylib注入...)

你可能感兴趣的:(利用Xcode逆向的原理 和 逆向防护)