? ? 首先,你需要有一臺越獄的iOS手機(jī),這樣你才能獲得root權(quán)限,才能為所欲為;需要一臺Mac機(jī)器,方便你遠(yuǎn)程操作。接著你就需要安裝一打的軟件了,Mac上需安裝:class-dump(導(dǎo)出頭文件),Reveal(分析UI),Hopper Disassembler(靜態(tài)匯編代碼分析),charles(網(wǎng)絡(luò)分析),iFunBox(手機(jī)文件分析),usbmuxd(通過usb轉(zhuǎn)發(fā)網(wǎng)絡(luò)數(shù)據(jù));手機(jī)上需在Cydia商店中安裝:OpenSSH,Reveal Loader(和Mac上Reveal配合使用),vim, python等。
? ? 在你手機(jī)上安裝完想Hack的App后,就可以開工了。
0,說明
? ? 下面所有的"#"步驟都是在SSH中操作的,"$"步驟在Mac上操作。
一,使用dumpdecrypted獲得頭文件
? ? 從github上下載,make編譯,將生成的dumpdecrypted.dylib拷貝到手機(jī)/var/root目錄下。利用Mac上iFunBox獲得App的路徑,然后將dumpdecrypted.dylib文件拷貝到App的Document目錄下。
#cd Document
#DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib App可執(zhí)行文件路徑,
會在當(dāng)前Document目錄下生成xxx.decrypted文件,即該App未加密的可執(zhí)行文件。將該decrypted文件拷到本機(jī),用命令
$class-dump --arch armv7/arm64 -H xxx.decrypted -o 頭文件路徑,
生成所有頭文件。由于decrypted文件為FAT格式,它實際上包了兩種格式的可執(zhí)行文件,armv7和arm64,需要你根據(jù)自己的手機(jī)型號選擇相應(yīng)的格式(我用的iPhone4為armv7格式)。獲得頭文件以后,就可以用Xcode新建一個Project,將所有頭文件都導(dǎo)入Project中,方便查詢。
二,使用Hopper Disassembler v3進(jìn)行靜態(tài)分析(或者使用IDA)
? ? 選擇File -> Read Executable to Assemble打開xxx.decrypted文件,選擇FAT,armv7或aarch64格式,它就開始自動幫你解析arm格式的匯編語言。在最左邊搜索框中搜索你感興趣的類和方法,可以結(jié)合Xcode中的頭文件來使用。下面說說它最強(qiáng)大的功能了,就是可以幫你生成類oc的偽代碼。選擇你關(guān)心的函數(shù),再點選右上角if(b) f(x):圖標(biāo),立刻世界就簡單了很多。
三,使用Reveal分析UI及相關(guān)的類
? ? 如果分析App的話,光看頭文件還是一頭霧水的,如果使用Reveal來分析UI使用的View類和相應(yīng)的Controller類,那世界又簡單了很多。先打開Mac上Reveal軟件,再在手機(jī)上"設(shè)置" -> Reveal -> Enabled Applications中選中你想分析的App,再打開App,稍等片刻,最后在Reveal中選中發(fā)現(xiàn)的App就可以了。如果一直沒有在Reveal中發(fā)現(xiàn)App,要確保手機(jī)和Mac在同一網(wǎng)絡(luò)中,重啟幾次App看看。
四,使用charles分析網(wǎng)絡(luò)通信
? ? 現(xiàn)在幾乎所有的App都是C/S模式的,本地是客戶端,通過網(wǎng)絡(luò)訪問Web Server端。所以想真正了解App的行為,分析網(wǎng)絡(luò)通信是很有必要的。而且絕大多數(shù)的App(除了知名的App如微信外)網(wǎng)絡(luò)封包沒有加密,很容易分析通信過程。
? ? 手機(jī)端只需在Http Proxy中設(shè)置Mac機(jī)IP地址和8888端口即可(charles默認(rèn)端口為8888)。Mac端啟用charles,選擇接受手機(jī)端的連接。
五,使用lldb動態(tài)調(diào)試
? ? 要分析App的關(guān)鍵細(xì)節(jié),就非需要動態(tài)調(diào)試不可了??梢杂肎DB來動態(tài)調(diào)試,但聽說它不太穩(wěn)定(聽說而已,沒有親見),所以還是用debugserver+lldb的方式來調(diào)試了。debugserver和lldb均為Xcode自帶軟件,將debugserver拷貝到手機(jī)上,運(yùn)行
#debugserver *:1234 -a “進(jìn)程名”
Mac上因為直接使用網(wǎng)絡(luò)進(jìn)行調(diào)試速度太慢,使用usbmuxd用usb接口進(jìn)行網(wǎng)絡(luò)包中轉(zhuǎn)
$cd usbmuxd-1.0.8/python-client
$./tcprelay.py 1234:1234
再啟用lldb
$lldb
(lldb)process connect connect://localhost:1234
(lldb)image list -o -f ? ?獲得各個庫的映射起始地址,如果去掉了ASLR的話,你會發(fā)現(xiàn)App映射的起始地址為0x0
(lldb)br s -a 0x3e000 ? 設(shè)置斷點地址
(lldb)po $r0 ? ? ? ? ?在ARM匯編中r0通常存儲的是類的地址,使用po命令會顯示類的description,實際上應(yīng)該是調(diào)用[$r0 description]。
我們可以用po命令來顯示調(diào)用類的所有函數(shù),如po [$r0 length],這可以讓我們做很多事,世界更簡單了。
剩下的就是體力活了。
六,(可選)去掉ASLR
? ? 在使用lldb進(jìn)行動態(tài)調(diào)試時,會遇到一個不大不小的問題,就是因為ASLR的存在,每次App可執(zhí)行文件的起始地址都不一樣,所以動態(tài)調(diào)試的時候各個函數(shù)地址和靜態(tài)分析的地址不一樣。當(dāng)然你可以每次啟動的時候手工計算一下,但也可以一勞永逸解決這個問題,就是修改App頭文件中的一個比特。
? ? 我們使用change_mach_o_flags.py來去掉這個比特。將App的可執(zhí)行文件拷貝到Mac上,運(yùn)行:
$otool -hv xxx ? 查看頭部信息
$python? change_mach_o_flags.py --no-pie xxx
$otool -hv xxx ?再查看頭部信息,會發(fā)現(xiàn)pie已經(jīng)去掉了。
再將可執(zhí)行文件拷貝回手機(jī)。因為是越獄的手機(jī),代碼的完整性檢測功能已經(jīng)名存實亡了。所以修改過的可執(zhí)行文件可以照常執(zhí)行。