我們日常開發提交給Appstore發布的App,都經過官方保護而加密,這樣可以保證機器上跑的應用是蘋果審核過的,也可以管理軟件授權。經過App Store加密的應用,我們無法通過Hopper等反編譯靜態分析,也無法Class-Dump,在逆向分析過程中需要對加密的二進制文件進行解密才可以進行靜態分析,這一過程就是大家熟知的砸殼(脫殼)
一、Clutch
由KJCracks開發的一款開源砸殼工具。
具體操作
1、使用Clutch,下載最新的release版本,可得到一個名為Clutch-2.0.4
的胖二進制文件。
2、通過usb登錄越獄設備。
3、通過命令scp -P 12345 Clutch-2.0.4 root@localhost:/usr/bin
將其拷貝到越獄設備的指定目錄下。
可通過mv Clutch-2.0.4 Clutch
對其重命名。
4、查看Clutch
的可執行權限。沒有的話就chmod +x Clutch
添加權限即可。
5、進入到越獄設備的命令行操作界面。通過Clutch
命令可查看相關命令幫助信息。
Dyoung5s:~ root# pwd
/var/root
Dyoung5s:~ root# Clutch
Usage: Clutch [OPTIONS]
-b --binary-dump <value> Only dump binary files from specified bundleID
-d --dump <value> Dump specified bundleID into .ipa file
-i --print-installed Print installed applications
--clean Clean /var/tmp/clutch directory
--version Display version and exit
-? --help Display this help and exit
-n --no-color Print with colors disabled
6、Clutch -i
顯示可砸殼的應用列表。
Dyoung5s:~ root# Clutch -i
Installed apps:
1: 微博國際版 <com.weibo.international>
2: 淘寶-雙十二購物,移動生活社區 <com.taobao.taobao4iphone>
3: 今日頭條極速版 <com.ss.iphone.article.lite>
4: QQ <com.tencent.mqq>
5: DingTalk <com.laiwang.DingTalk>
6: 酷狗音樂-就是歌多 <com.kugou.kugou1002>
7: 抖音短視頻 <com.ss.iphone.ugc.Aweme>
8: 愛思助手 <com.diary.mood>
7、Clutch -d 4
選擇要砸殼的應用,并進行砸殼,成功后有如下提示。將其拷貝出來即可。我們也可以通過otool -l
查看其cryptid
字段以驗證是否砸殼成功。
二、dumpdecrypted
通過建立一個名為dumpdecrypted.dylib的動態庫,插入目標應用實現脫殼。
1、下載dumpdecrypted,并通過make
命令編譯生成dylib
庫。
2、通過命令
scp -P 12345 dumpdecrypted.dylib root@localhost:~/
將動態庫拷貝越獄設備的指定目錄。3、通過ps -A
查看當前進程,并通過如下命令將其動態庫插入到指定進程中。即可生成對應進程應用的MachO
文件。
//后面加上的進程路徑。
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/A8CC18F5-9213-482E-B145-C36EFE9ACED0/DingTalk.app/DingTalk
三、frida-ios-dump
安裝
1、下載pip
sudo easy_install pip
2、通過pip
下載frida_tools
sudo -H pip install frida_tools
//如果報下圖中的錯誤則更換為另外一條命令。
sudo pip install six --upgrade --ignore-installed six
3、直接clone
frida-ios-dump到本地目錄,進入目錄可發現dump.py
腳本文件。
4、修改dump.py
文件中的如下信息,確保與越獄設備信息匹配。
5、在越獄設備中添加https://build.frida.re
源,并且安裝Frida
插件.
dump應用
將脫殼應用在設備上置于運行狀態。進入腳本所在文件夾,通過./dump.py 微信
便可成功脫殼應用。成功后會在執行終端命令的地方生成ipa包。
以上dump時的操作可寫成腳本,將frida-ios-dump
文件夾放置sh腳本文件的同級目錄中。編寫腳本,并配置環境變量即可。
//腳本內容:
dump.py的路徑 $1
遇到的一些坑:
1、No module named xxx
。 通過pip install --user xxx
下載即可。
2、from scp import xxx
,同上執行pip install --user xxx
即可。
3、生成ipa,存放到腳本文件所在文件夾時沒有寫的權限。可直接對文件夾執行sudo chmod -R 777 文件夾路徑
即可。
四、lldb手動dump
準備
1、在手機中配置好debugserver
。
2、通過以下命令導出需要dump應用的可執行文件到當前路徑。xxxx代表應用進程路徑。
scp -P 12345 root@localhost:xxxx ./
3、查看瘦身后的可執行文件的加密信息。并記錄。
● otool -l Aweme_arm64 | grep cry
cryptoff 16384
cryptsize 52527104
cryptid 1
分析:
cryptoff
:指加密文件的頭所對應的偏移。這個數字之前代表著可執行文件的header。
cryptsize
: 加密的數據長度,我們需要把這段時間拷貝出來。
實操
1、開啟debugserver
服務,依附到我們想要dump應用的進程中。
debugserver *:9393 -a Aweme
2、電腦進入lldb
調試環境,連接到對應的debugserver
端口。
process connect [connect://localhost:9393](connect://localhost:9393)
3、通過image list
指令拿到可執行文件的頭地址,加上之前的cryptoff
得到需要拷貝數據的起始地址。
4、按字節讀取內存中的可執行文件,并拷貝到電腦。(耗時動作)
//--force:按字節讀取。
//0x00000001000c4000+16384:需要拷貝內容的起始地址。
//52527104:需要拷貝內容的大小。
//./decrypted.bin : 在當前目錄下生成一個名為decrypted.bin的二進制包。
memory read --force --outfile ./decrypted.bin --binary --count 52527104 0x00000001000c4000+16384
5、將二進制文件包替換之前拷貝出來的可執行文件中的對應部分,得到一個新的可執行文件。
//dd:用指定大小的文件寫到另一個文件當中。
//bs:一個一個字節寫入
//conv:指定轉換文件的方式。
dd seek=16384 bs=1 conv=notrunc if=./decrypted.bin of=./Aweme_arm64
6、通過otool -l
查看新的可執行文件,得知cryptid
仍為1,這里是因為我們并沒有對header
文件作修改,所以字段的值仍保持之前加密的鍵值。但是可執行文件的內容卻被我們解密了的。可以通過class-dump
驗證。
7、通過Mach0View
修改cryptid
的值為0。如果不修改class-dump
會不成功。因為這個工具首先會拿到header
獲取cryptid
的值,如果是已加密的話就會放棄后面的dump工作了。
8、通過class-dump -H Aweme_arm64 -o ./AwemeHeaders
能導出應用的頭文件,便可證明lldb手動脫殼成功。
補充
frida_tools的一些使用
1、配置端口映射。
通過frida-ps
列出當前應用進程。
通過usb連接好手機后,通過frida-ps -U
列出usb設備的應用進程。
2、通過
frida -U 微信
附加進程到微信。3、執行
ObjC
可拿到附加進程應用的所有Object-C
對象。
插入自定義動態庫到指定應用
通過這樣的操作,進程沒有被污染,在以后的每次執行時候不會執行我們所插入的動態庫的方法。這里只相當于一次性插入。上文的dumpdecrypted便是用到了這樣的原理。
1、使用Xcode
生成framework
文件。通過以下命令拷貝到越獄設備中。
scp -r -P 12345 DyInsert.framework/ root@localhost:~/
2、通過以下命令將動態庫插入到指定進程即可。
DYLD_INSERT_LIBRARIES=DyInsert.framework/DyInsert /var/mobile/Containers/Bundle/Application/4560ADA4-9AE4-4E9D-BE84-ABF666B12A7A/WeChat.app/WeChat