iOS逆向開發(2):獲取APP的類宣告 | class-dump | dumpdecrypted | clutch
之前介紹了怎麼操作越獄的iOS裝置(以下簡稱為手機),但簡單操作手機並不是目標,小程的目標是手機上特定的APP,比如微信、淘寶、QQ音樂等等,因為小程可以從這些APP上拿到一些有用的資訊或資源--比如,“微信的那個頁面是用什麼控制元件來佈局的?”、“QQ音樂的歌手頭像,能批量地拿到嗎?”,等等。
很明顯,如果你知道目標APP的所有類的宣告,你就可能直接觀察到,或者推導到一些有用的資訊。實際上,把目標APP的類資訊拿到,是至關重要的一步,因為這一步的成功讓你有了分析的資料,進而決定了後續的動作,比如借鑑目標APP的實現方案,或者進一步做注入的工作。
為了感性一點,小程先貼上一個APP的部分類的結構資訊,然後來簡單看看,可以分析到什麼。
這是“花椒直播”APP的視訊編碼類:

花椒直播的某個類
現在的直播主要是看美女,不過這不是重點。重點是,直播是要開播的,開播就要錄影,然後要把視訊編碼,再推到伺服器。而這個類,就是“視訊編碼”的關鍵類(通過注入就能證實)。可以直接看到,它是用AVAssetWriter來實現視訊編碼的,也就是我們經常說的“硬體編碼”,而不是用libx264之類的第三方庫來做視訊編碼。還可以看到,在編碼初始化時,指定了解析度與位元速率,如果有必要,我們能查出是什麼值。
這是“花椒直播”APP的崩潰彙報類(疑似):

花椒崩潰彙報類
可以看到,APP的ID跟版本可能是上報的資訊,那又怎麼樣呢?如果我們想惡作劇,是可以做到不斷的崩潰再啟動再崩潰的,然後修改這兩個資訊的內容,是可以不斷地跟分析資料的技術人員打招呼的。通過給某個產品製造異常,然後給分析異常的人傳送某個明文資訊,是很可能做到的。
以上這個例子,是在得到類的結構資訊後,做出的一些“感性”的分析。
那麼,怎麼樣才能得到類的結構資訊呢?
本文介紹如何獲取目標APP的類的結構資訊。
其實,還是工具的使用。一個叫classdump,另一個叫dumpdecrypted。
一般情況下,使用classdump就可以解決問題。
小程用的是mac電腦。
(一)class-dump
class-dump或class-dump-z,都可以分析出類結構,使用上相似。
(1)獲取
class-dump-z:
wget http://networkpx.googlecode.com/files/class-dump-z_0.2a.tar.gz 解壓後,拷貝到bin目錄: sudo cp mac_x86/class-dump-z /usr/local/bin
class-dump:
http://stevenygard.com/projects/class-dump 查詢並下載,或者直接: 下載 http://stevenygard.com/download/class-dump-3.5.tar.gz 把class-dump拷貝到/usr/local/bin目錄,並chmod +x class-dump。
(2)使用
class-dump-z Payload/QQ.app/QQ > ../../dumpinfo --所有資訊放到一個檔案 class-dump -H Spotify.app -o ../headers--這種方式可以分出不同的檔案 class-dump -A -a Spotify.app > ../../addressinfo --帶有地址資訊 根據函式的地址,可以用gdb或lldb來下斷點除錯。 class-dump也可以指定指令集,比如--arch arm64。
對於小程來說,一般這樣使用class-dump: class-dump -A -a --arch arm64 target.app > ../dumpinfo
這樣可以把所有的類資訊放到dumpinfo檔案,而且每個方法跟變數都是有地址的(方便之後可能進行的動態除錯)。
但需要注意一個問題,classdump只能對沒有加密的APP進行分析,如果APP是加密了的,那classdump是無能為力的(直接提示加密了!)。
哪些APP是加密狀態的呢?有沒有辦法破解呢?
基本上,只有從AppStore下載的APP才是加密了的,其它通過PP助手、愛思等工具拿到的ipa安裝包(實際是壓縮包,裡面有target.app),都是經過了破解。
小程覺得,不用管那麼多,先用classdump來跑一下,如果提示加密,再來考慮破解。
破解的工具是clutch。
應該使用clutch的最新版本,特別是對於ios10.x的系統。
可以在 https://github.com/KJCracks/Clutch/releases 下載(下載-debug版本即可)。
把clutch拷貝到手機的/usr/bin目錄,給許可權:chmod +x clutch
這樣使用clutch:
./Clutch -?--檢視選項 ./clutch -i--檢視可以破解的軟體 ./clutch -d x--根據序號來破解某個APP
破解完,clutch會提示破解後的ipa包所在的目錄。把ipa拷貝到電腦,就可以classdump了。
另一個分析類結構的工具是 dumpdecrypted 。
之所以引入dumpdecrypted,主要是因為小程發現:使用最新的clutch2.0.4-debug,未能破解微信6.5.12版本(也不能成功破解7.0版本)。甚至於,微信6.5.x版本,執行後,ps aux都找不到程序資訊。
那怎麼辦呢?
最簡單的辦法,其實是,使用手機上的pp助手、愛思之類的工具,安裝一個微信,這個微信就已經砸殼的了;或者,在電腦上通過上網或助手工具,下載一個微信ipa,一般也是解密了的。
如果非要用dumpdecrypted來弄一下,也是可以。小程把辦法貼在下面,大家可以在需要時再閱讀。
生成dumpdecrypted.dylib:
git clone https://github.com/stefanesser/dumpdecrypted cd dumpdecrypted make --生成dumpdecrypted.dylib
在手機cydia上搜索Filza,並安裝。利用Filza找出微信的安裝路徑。(不能使用cycript,因為程序id都找不到。)
比如,微信安裝目錄:/var/mobile/Containers/Bundle/Application/4777DEE2-6805-45F7-B3D0-CB4277DD5389/WeChat.app
拷貝dumpdecrypted.dylib到手機:
scp dumpdecrypted.dylib [email protected]:/
啟動微信(重要!),ssh到手機,cd到dumpdecrypted.dylib所在的目錄,執行:
ldid -S dumpdecrypted.dylib
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/4777DEE2-6805-45F7-B3D0-CB4277DD5389/WeChat.app/WeChat
在當前目錄生成WeChat.decrypted檔案,即為破解後的檔案。
scp WeChat.decrypted到pc,先觀察一下這個檔案:
file WeChat.decrypted--可以看到包括兩個指令集:armv7跟arm64 otool -l WeChat.decrypted | grep crypt WeChat.decrypted (architecture armv7): cryptoff 16384 cryptsize 55377920 cryptid 1 WeChat.decrypted (architecture arm64): cryptoff 16384 cryptsize 59883520 cryptid 0 可以看到,armv7是加密了的,而arm64是解密了的,所以在使用class-dump與hopper時,都應該選擇arm64。
提取標頭檔案:
class-dump -A -a --arch arm64 WeChat.decrypted > dumpinfo
dumpinfo裡面為所有標頭檔案資訊,比如:MicroMessengerAppDelegate為AppDelegate類。
(二)效果演示
為了再“感性”一下,小程再貼一下“微信”的類結構,作為後續更多分析的熱身。
微信在每次進入“附近的人”時,都會把手機的位置資訊傳遞給這個類的方法:

設定位置資訊的類與方法
從這裡可以看出,只要注入到紅框內的那個函式,把傳遞進來的位置更換成目標位置(比如定到大平洋),就可以看到你想要的“附近的人”。比如,定位到紐約,可以看到這樣的人:

紐約某個縣的附近的人
要實現這個效果,拿到類結構資訊只是第一步,接下來還要定位目標類(甚至要除錯),再寫hook程式碼。
所謂“萬達高樓平地起”,小程覺得,如果想往一個方向研究,那就應該有耐心,一步一步掌握好知識與技能。
總結一下,本文主要介紹了class-dump工具的使用,其它內容都是次要的。

這是有價值的嗎?