獲取APP的類結構信息
來自專欄 逆向開發
之前介紹了怎麼操作越獄的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目錄。
這樣使用clutch:
./Clutch -? --查看選項./clutch -i --查看可以破解的軟體./clutch -d x --根據序號來破解某個APP
破解完,clutch會提示破解後的ipa包所在的目錄。把ipa拷貝到電腦,就可以classdump了。
另一個分析類結構的工具是dumpdecrypted。
之所以引入dumpdecrypted,主要是因為小程發現:
使用最新的clutch2.0.4-debug,未能破解微信6.5.12版本。
甚至於,微信6.5.x版本,運行後,ps aux都找不到進程信息。
那怎麼辦呢?
最簡單的辦法,其實是,使用手機上的pp助手、愛思之類的工具,安裝一個微信,這個微信就已經砸殼的了;或者,在電腦上通過上網或助手工具,下載一個微信ipa,一般也是解密了的。
如果非要用dumpdecrypted來弄一下,也是可以。小程把辦法貼在下面,讀者可以在需要時再閱讀。
生成dumpdecrypted.dylib:
git clone https://github.com/stefanesser/dumpdecryptedcd dumpdecryptedmake --生成dumpdecrypted.dylib
在手機cydia上搜索Filza,並安裝。
利用Filza找出微信的安裝路徑。(不能使用cycript,因為進程id都找不到。)
比如,微信安裝目錄:/var/mobile/Containers/Bundle/Application/4777DEE2-6805-45F7-B3D0-CB4277DD5389/WeChat.app
拷貝dumpdecrypted.dylib到手機:
scp dumpdecrypted.dylib root@xx.xx.xx.xx:/
啟動微信,ssh到手機,cd到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跟arm64otool -l WeChat.decrypted | grep cryptWeChat.decrypted (architecture armv7): cryptoff 16384 cryptsize 55377920 cryptid 1WeChat.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工具的使用,難度係數為低。小程覺得,只要能用class-dump就行,其它內容都是次要的。
推薦閱讀:
※細數iOS上的那些安全防護
※目前有哪些公司將Swift作為iOS客戶端主要開發語言?
※iPhone7更新到iOS11發現按鍵喚醒有時候會失效?
※為什麼IOS下的播放器,對ass字幕的支持都不怎麼樣呢?
※ARKit 的原理與最佳實踐