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/dumpdecryptedcd 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工具的使用,其它内容都是次要的。
這是有價值的嗎?
原文位址
https://www.cnblogs.com/freeself/p/10640998.html