iOS App Hack過程

? ? 首先,你需要有一臺越獄的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í)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容