iOS逆向開發(2):獲取APP的類聲明 | class-dump | dumpdecrypted

之前介紹了怎麼操作越獄的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工具的使用,其它內容都是次要的。

這是有價值的嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章