一靖秩、利用XCode進(jìn)行逆向的原理:
- XCode真機(jī)調(diào)試的簡單流程:
- 編譯:Clang -> IR ... -> IR -> 匯編 -> Mach-O
- 打包成
*/Products/xxx.app
- 簽名(原理是蘋果私鑰三重數(shù)字簽名)
- 安裝到真機(jī),并驗證簽名
- 懂得基本原理即可利用XCode來逆向別人app
- 逆向原理:
- 既然XCode是生成一個
*/Products/xxx.app
安裝進(jìn)手機(jī),那我可以建一個殼工程霜威,用待逆向的已脫殼的WeChat.app 去替換 這個殼工程的*/Products/xxx.app
- 替換完后,將WeChat.app重簽名成殼工程的包名房维、證書狼速、描述文件,即可在我手機(jī)上運(yùn)行
注:這兩步可以添加編譯腳本完成(XCode自帶的
Run Script
)酝蜒,利用上一篇文章提到的XCode環(huán)境變量
二誊辉、防逆向調(diào)試 與 反防調(diào)試
- XCode調(diào)試原理:
- lldb 給 debugServer 發(fā)調(diào)試命令(如:
image list
命令查看ASLR)- debugServer 可以依附到 指定進(jìn)程、端口號
- debugServer 暫停住 依附的進(jìn)程亡脑,讀取寄存器信息堕澄,反饋給 lldb
- 防調(diào)試原理:
- debugServer 之所以能調(diào)試app邀跃,是依賴操作系統(tǒng)提供的
ptrace
API,ptrace能依附到進(jìn)程上卡住進(jìn)程- 既如此蛙紫,只要禁止 debugServer 依附到 進(jìn)程上拍屑、或者禁止 debugServer 卡住進(jìn)程即可(或其他中間環(huán)節(jié))
- 正好 系統(tǒng)
ptrace
API提供了方法去禁止依附到 進(jìn)程上
- 實現(xiàn)代碼:
//項目中調(diào)用 `ptrace(31, 0, 0, 0);` 即可防止項目被別人調(diào)試
#define PT_DENY_ATTACH 31
int ptrace(int _request, pid_t _pid, caddr_t _addr, int _data);
- 反防調(diào)試原理:(針對ptrace)
方法1(太難):分析Mach-O獲得ptrace代碼位置,從Mach-O的__TEXT段移除ptrace代碼
方法2(常用):開了ptrace防調(diào)試坑傅,調(diào)試時進(jìn)程會crash丽涩,利用lldb添加ptrace符號斷點,獲取代碼位置裁蚁,利用hook移除ptrace代碼
三矢渊、利用XCode逆向 與 利用theos逆向 比較
1、XCode逆向方便太多:
- 非越獄手機(jī)即可逆向
- 能直接利用XCode斷點調(diào)試 (當(dāng)然可能需要hook干掉 ptrace防調(diào)試)
- 利用XCode查看頁面布局Hierarchy
2枉证、theos逆向:
- 必須使用越獄手機(jī)
- 必須用腳本建立 lldb 與 debugServer的連接矮男,指定端口號
- 必須會使用 lldb 指令(但此時因為包已替換,XCode加斷點也只能通過
breakpoint set
)- 必須通過Reveal查看圖形化頁面布局Hierarchy
3室谚、顯然XCode逆向更實用更便捷毡鉴,同時,GitHub有大神提供全套逆向工具MonkeyDev
但使用theos你能學(xué)到更多底層知識秒赤,知其所以然(比如你可能會經(jīng)歷學(xué)習(xí)ssh猪瞬、Cycript、Mach-O入篮、ASLR陈瘦、lldb、命令行工具潮售、dylib注入...)