大家知道,通常iOS中下載的ipa包可以通過解壓縮,最后獲得可執(zhí)行的Mach-O文件。
一、判斷可執(zhí)行文件是否被加密
方法1:通過終端命令來查看
otool -l QQ | grep crypt
//class-dump出來的qqHeaders文件夾中頭文件如果只有一個,通常也是被加密的
class-dump -H QQ -o qqHeaders
//輸出的cryptid如果為0則未加密,為1則被加密
otool -l QQ | grep crypt

方法2:通過MachOView來查看

方法3:Hopper Disassembler解析不出來的,也是被加密的。
二、脫殼
一旦發(fā)現(xiàn)可執(zhí)行文件是被加密過的,那就需要先進行脫殼操作,將原始的可執(zhí)行文件給剝離出來。通常我們采用的都是硬脫殼方式,即暴力脫殼,也不需要將程序運行到內(nèi)存中再進行操作。
硬脫殼是有工具的,一般用Clutch工具和dumpdecrypted工具,接下來我們逐個解釋。
1、Clutch工具
Clutch下載地址
通過Clutch可以將裝在手機上的應用進行脫殼操作,所以需要安裝到手機上。為了方便在終端上直接操作,通常會將Clutch工具拖到/usr/bin目錄下(建議給下載下來的Clutch后綴版本號去掉)。如果登錄到手機后,在終端敲入Clutch出現(xiàn)權(quán)限不足的問題,可以給其添加可執(zhí)行的權(quán)限chmod +x /usr/bin/Clutch即可。

如上圖箭頭所指,成功脫殼后,會自動將文件打包成一個.ipa文件,終端里也會輸出這個.ipa文件的具體路徑,導出到電腦上即可使用 。這個.ipa里面包含的就是已經(jīng)解密成功的可執(zhí)行文件,即脫殼操作完成。我們可以通過前面所說的otool指令來驗證一下,查看這個.ipa的crypt值是否真的為0。

有圖有真相,我沒有胡說哈??
2、dumpdecrypted工具
dumpdecrypted下載地址

(1)首先將dumpdecrypted.c編譯成動態(tài)庫
進入dumpdecrypted.c文件所在的目錄,終端輸入make指令進行編譯,會自動執(zhí)行其目錄中的Makefile文件內(nèi)部的指令,生成對應的動態(tài)庫文件

(2)將生成的dumpdecrypted.dylib動態(tài)庫文件拷貝到iPhone上(如果是root用戶,建議放到/var/root目錄)

(3)終端進入dumpdecrypted.dylib所在的目錄,使用環(huán)境變量DYLD_INSERT_LIBRARIES將動態(tài)庫注入到需要脫殼的可執(zhí)行文件中(可執(zhí)行文件的路徑可以通過ps -A查看獲?。?br>
具體操作命令:DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可執(zhí)行文件路徑
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib "/var/mobile/Containers/Bundle/Application/5A97A551-4E9B-4E57-B065-E1DC913B1FC9/Jiu_Kuai_Jiu copy.app/Jiu_Kuai_Jiu copy"
當前文件/var/root下新生成的Jiu_Kuai_Jiu copy.decrypted文件就是脫殼后的可執(zhí)行文件,用otool指令驗證一下就知道了。