一、利用XCode进行逆向的原理:
- XCode真机调试的简单流程:
- 编译:Clang -> IR ... -> IR -> 汇编 -> Mach-O
- 打包成
*/Products/xxx.app
- 签名(原理是苹果私钥三重数字签名)
- 安装到真机,并验证签名
- 懂得基本原理即可利用XCode来逆向别人app
- 逆向原理:
- 既然XCode是生成一个
*/Products/xxx.app
安装进手机,那我可以建一个壳工程,用待逆向的已脱壳的WeChat.app 去替换 这个壳工程的*/Products/xxx.app
- 替换完后,将WeChat.app重签名成壳工程的包名、证书、描述文件,即可在我手机上运行
注:这两步可以添加编译脚本完成(XCode自带的
Run Script
),利用上一篇文章提到的XCode环境变量
二、防逆向调试 与 反防调试
- XCode调试原理:
- lldb 给 debugServer 发调试命令(如:
image list
命令查看ASLR)- debugServer 可以依附到 指定进程、端口号
- debugServer 暂停住 依附的进程,读取寄存器信息,反馈给 lldb
- 防调试原理:
- debugServer 之所以能调试app,是依赖操作系统提供的
ptrace
API,ptrace能依附到进程上卡住进程- 既如此,只要禁止 debugServer 依附到 进程上、或者禁止 debugServer 卡住进程即可(或其他中间环节)
- 正好 系统
ptrace
API提供了方法去禁止依附到 进程上
- 实现代码:
//项目中调用 `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注入...)
网友评论