- 砸殼
- class-dump
- 搭建越獄開發(fā)環(huán)境 Theos
- 配置越獄開發(fā)調(diào)試的 iOS 設(shè)備 Theos 環(huán)境
- 動態(tài)分析-Logify
- Theos 創(chuàng)建 tweak
- 動態(tài)分析-lldb
- 參考資料
<a name="crack"></a>砸殼
為了砸殼钻洒,我們需要使用到 dumpdecrypted设凹,這個工具已經(jīng)開源并且托管在了 GitHub 上面浪蹂,我們需要進(jìn)行手動編譯羡榴。步驟如下:
-
從 GitHub 上 clone 源碼:
$ cd ~/iOSReverse $ git clone git://github.com/stefanesser/dumpdecrypted/
-
編譯 dumpdecrypted.dylib:
$ cd dumpdecrypted/ $ make
執(zhí)行完 make
命令之后立由,在當(dāng)前目錄下就會生成一個 dumpdecrypted.dylib
,這個就是我們等下要使用到的砸殼工具舌仍。(注意可能需要更改 makefile
的配置铃拇,以適應(yīng)不同架構(gòu)的處理器和不同版本的 iPhone sdk
)。
有了砸殼工具之后俩垃,下一步就需要找到待砸的獵物了励幼,這里就以微信為例子欢策,來說明如何砸掉微信的殼,并導(dǎo)出它的頭文件赏淌。
-
使用 ssh 連上你的 iOS 系統(tǒng)(需要在越獄機器上安裝
OpenSSH
)# 注意將 IP 換成你自己 iOS 系統(tǒng)的 IP $ ssh root@192.168.1.107
-
連上之后踩寇,使用
ps
配合grep
命令來找到微信的可執(zhí)行文件$ ps -e | grep WeChat 4557 ?? 5:35.98 /var/mobile/Containers/Bundle/Application/944128A6-C840-434C-AAE6-AE9A5128BE5B/WeChat.app/WeChat 4838 ttys000 0:00.01 grep WeChat
在這里,因為我們已經(jīng)知道微信的應(yīng)用名就叫 WeChat六水,所以可以直接進(jìn)行關(guān)鍵字搜索俺孙。那如果我們不知道想要找到應(yīng)用名稱叫什么該怎么辦呢?可以在 App Store 下載該 app 的 IPA 包掷贾,解壓查看 Payload 下擴展名為
.app
的文件名睛榄,這就是我們需要查找的進(jìn)程注意:如果輸入 ps 之后,系統(tǒng)提示沒有這個命令想帅,那就需要到 cydia 當(dāng)中安裝 adv-cmds 包场靴。
-
使用 Cycript 找到目標(biāo)應(yīng)用的 Documents 目錄路徑。
Cycript 是一款腳本語言港准,可以看成是 Objective-JavaScript旨剥,它最好用的地方在于,可以直接附加到進(jìn)程上浅缸,然后直接測試函數(shù)的效果轨帜。關(guān)于 cycript 的更詳細(xì)介紹可以看它的官網(wǎng).
安裝 cycript 也很簡單,直接在 cydia 上搜索 cycript 并安裝就可以了衩椒。裝完之后就可以來查找目標(biāo)應(yīng)用的 Documents 目錄了:
$ cycript -p WeChat cy# NSHomeDirectory() @"/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD"
可以看到蚌父,我們打印出了應(yīng)用的 Home 目錄,而 Documents 目錄就是在 Home 的下一層毛萌,所以在我這里 Documents 的全路徑就為
/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents
注意:可以使用 Ctrl + D 來退出 cycript
-
將 dumpdecrypted.dylib 拷到 Documents 目錄下:
# 注意將 IP 和路徑換成你自己 iOS 系統(tǒng)上的 # 注意本步是在電腦端進(jìn)行的操作 $ scp ~/iOSReverse/dumpdecrypted/dumpdecrypted.dylib root@192.168.1.107:/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents
-
砸殼
$ cd /var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents # 后面的路徑即為一開始使用 ps 命令找到的目標(biāo)應(yīng)用可執(zhí)行文件的路徑 $ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/944128A6-C840-434C-AAE6-AE9A5128BE5B/WeChat.app/WeChat
完成后會在當(dāng)前目錄生成一個 WeChat.decrypted 文件苟弛,這就是砸殼后的文件。之后就是將它拷貝到 OS X 用 class-dump 來導(dǎo)出頭文件啦阁将。(可以使用 scp 命令拷貝到 OS X 下)
$ mkdir ~/iOSReverse/WeChat # 注意替換 IP和路徑 $ scp root@192.168.1.107:/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents/WeChat.decrypted ~/iOSReverse/WeChat/
<a name="class-dump"></a>class-dump
class-dump 是一個工具膏秫,它利用了 Objective-C 語言的運行時特性,將存儲在 Mach-O 文件中的頭文件信息提取出來冀痕,并生成對應(yīng)的 .h 文件荔睹。可以在其 class-dump 官網(wǎng)下載言蛇,在個人目錄下新建一個 bin 目錄僻他,并將其添加到 PATH 路徑中,然后將下載后的 class-dump-3.5.dmg 里面的 class-dump 可執(zhí)行文件復(fù)制到該 bin 目錄下腊尚,賦予可執(zhí)行權(quán)限:
$ mkdir ~/bin
$ vim ~/.bash_profile
# 編輯 ~/.bash_profile 文件吨拗,并添加如下一行
export PATH=$HOME/bin/:$PATH
# 將 class-dump 拷貝到 bin 目錄后執(zhí)行下面命令
$ chmod +x ~/bin/class-dump
使用 class-dump
使用 class-dump 來將微信的頭文件導(dǎo)出:
$ mkdir ~/iOSReverse/WeChat/Headers
$ cd ~/iOSReverse/WeChat/
$ class-dump -S -s -H WeChat.decrypted -o Headers/
注意使用 class-dump 仍然只導(dǎo)出 CDStructures.h 一個文件(或者沒有文件),則可能架構(gòu)選擇錯誤,或者使用的
dumpcrypted
編譯sdk
不對考慮下面類似的命令來指定砸殼文件的架構(gòu)
class-dump --arch armv7 dajietiao.decrypted -H -o ./heads/
<a name="theos_pc"></a>搭建越獄開發(fā)環(huán)境 Theos
安裝 Xcode 和 Command Line Tools
-
安裝 dpkg
$ brew install dpkg
-
從 Github 下載 Theos
打開命令行劝篷,進(jìn)行如下操作:
$ export THEOS=/opt/theos # 如果之前已經(jīng)安裝過 theos哨鸭,請先刪除,然后下載最新版 $ rm -rf $THEOS $ sudo git clone --recursive https://github.com/theos/theos.git $THEOS
-
配置ldid
$ git clone git://git.saurik.com/ldid.git $ cd ldid $ git submodule update --init $ ./make.sh $ cp -f ./ldid $THEOS/bin/ldid
或者直接從這兩個地址下載
-
配置 Theos 環(huán)境
編輯
~/.bash_profile
文件娇妓,在末尾添加下面這幾句像鸡,注意替換 example.local 為與本地計算機同處一個 Wi-Fi 環(huán)境的 iOS 設(shè)備的 IP 地址。編輯完以后重啟命令行終端哈恰。export THEOS=/opt/theos export PATH=$THEOS/bin:$PATH export THEOS_DEVICE_IP=example.local THEOS_DEVICE_PORT=22
-
添加 substrate 庫到 Theos 中
# 可以通過 brew install wget 安裝 wget $ wget http://apt.saurik.com/debs/mobilesubstrate_0.9.6011_iphoneos-arm.deb $ mkdir substrate $ dpkg-deb -x mobilesubstrate_*_iphoneos-arm.deb substrate $ mv substrate/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate $THEOS/lib/libsubstrate.dylib $ mv substrate/Library/Frameworks/CydiaSubstrate.framework/Headers/CydiaSubstrate.h $THEOS/include/substrate.h
<a name="theos_ios"></a>配置越獄開發(fā)調(diào)試的 iOS 設(shè)備 Theos 環(huán)境
安裝 Theos 及其依賴只估。(詳情查看參考資料 3)
-
添加下列源到 cydia source 中。
安裝
Perl
,Theos
,iOS ToolChain
<a name="logify"></a>動態(tài)分析-Logify
配置越獄開發(fā)環(huán)境 OK 之后着绷,經(jīng)常在分析 app 的時候會用到 logify蛔钙。
神器 Logify ,它是 theos 的一個模塊荠医,作用就是根據(jù)頭文件自動生成 tweak吁脱,生成的 tweak 會在頭文件的所有方法中注入 NSLog 來打印方法的入?yún)⒑统鰠ⅲ浅_m合追蹤方法的調(diào)用和數(shù)據(jù)傳遞.
根據(jù)此前砸殼后 class_dump 出來的頭文件彬向,找到我們感興趣的頭文件比如說 BaseMsgContentViewController 在終端執(zhí)行如下命令:
$ logify.pl /path/to/BaseMsgContentViewController.h > /out/to/Tweak.xm
輸出的tweak文件中帶百分號的關(guān)鍵字兼贡,例如 %hook、%log幢泼、%orig 都是 mobilesubstrate 的 MobileHooker 模塊提供的宏紧显,其實也就是把 method swizzling 相關(guān)的方法封裝成了各種宏標(biāo)記,使用起來更簡單缕棵,大家想要更深入了解各種標(biāo)記,可以google一下logos語言
<a name="tweak"></a>Theos 創(chuàng)建 tweak
上面我們用 logify 生成了一個 tweak 代碼涉兽,我們要把它安裝到手機上招驴,首先需要使用 theos 進(jìn)行編譯,安裝了 theos 之后枷畏,在終端輸入 nic.pl别厘,會讓我們配置一些信息。
比如首先是選擇項目模版當(dāng)然是 tweak 啦拥诡,然后是項目名稱触趴、作者,后面兩個選項要注意:
- 首先是 bundle filter渴肉,這個需要填你需要注入的目標(biāo) app 的 bundle id冗懦,MobileLoader 模塊會根據(jù)它來尋找你的 tweak 的注入目標(biāo)
- 最后是 list id applications to terminate upon installation,這里指定當(dāng) tweak 安裝成功之后仇祭,需要 kill 的進(jìn)程披蕉,比如我們要 hook 微信,這里就填微信的二進(jìn)制文件名就可以了,為什么要 kill 没讲? 因為我們的插件是需要在 app 啟動時加載進(jìn)去的眯娱,如果不重啟app,插件是不會生效的爬凑。
把上面 logify 生成的 tweak 文件覆蓋到當(dāng)前目錄徙缴,并用文本編輯器打開 makefile 文件
最后在終端進(jìn)入項目目錄,輸入 make package install
命令
期間會讓你輸入設(shè)備的 ssh 密碼嘁信,越獄機器的默認(rèn) ssh 密碼是 alpine娜搂。
然后打開 Xcode 的 Windows->Devices 選中要調(diào)試的 iOS 設(shè)備,將隱藏的控制臺打開吱抚。這樣我們就可以看到 app 運行時輸出的日志了百宇。(不知道如何操作的查看 參考資料 7)
由于我們使用 logify 生成的 tweak 可以打印每個函數(shù)的入?yún)⒑统鰠ⅲ赃\行到相應(yīng)的函數(shù)的時候秘豹,可以在控制臺看到相應(yīng)的日志携御。
<a name="lldb"></a>動態(tài)分析-lldb
通過將我們砸殼的文件比如 WeChat.decrypted 拋給 hopper 解析,我們可以方便的反編譯代碼既绕。查看反編譯代碼的時候我們會想對對應(yīng)的代碼進(jìn)行調(diào)試啄刹。當(dāng)需要在 app 中設(shè)置斷點進(jìn)行調(diào)試的時候,就需要遠(yuǎn)程連接到 iOS 設(shè)備凄贩,使用 lldb 進(jìn)行調(diào)試誓军。具體配置參看 參考資料 4
在 iOS 設(shè)備上使用下面這句命令開啟 WeChat 的調(diào)試
$ debugserver *:19999 -a WeChat
在計算機終端上運行下面的命令,連接到遠(yuǎn)程 iOS 設(shè)備調(diào)試
$ lldb
$ process connect connect://deviceIP:19999
調(diào)試的時候一些有用的命令
# 查看 app 運行的內(nèi)存基地址
$ image list -o -f
# 基地址加上函數(shù)的偏移地址(可以通過 hopper 查看疲扎,注意 hopper 剛開始讓我們配置的架構(gòu)選項)就是相應(yīng)代碼段的內(nèi)存實際地址
$ br s -a '0X00000000000E800+0x00000001017d7c6c'