加殼
將打包好的ipa文件上傳到App Store后會(huì)對可執(zhí)行文件進(jìn)行加殼,我們下載到iPhone的APP就是加殼后的App。所謂加殼,就是利用特殊算法,對可執(zhí)行文件的編碼進(jìn)行改變(壓縮、加密),以達(dá)到保護(hù)程序代碼的目的。
對于不加殼的APP,可執(zhí)行文件執(zhí)行的時(shí)候是直接在內(nèi)存中裝載可執(zhí)行文件。而對于加殼后的APP,可執(zhí)行文件已加密,ldyd無法直接在內(nèi)存中裝載可執(zhí)行文件,此時(shí)加密的可執(zhí)行文件實(shí)際上包裹了一層殼,兩者合成了一個(gè)可執(zhí)行的殼程序,在內(nèi)存中裝載該殼程序并解密執(zhí)行真正的可執(zhí)行文件。
脫殼
所謂脫殼,就是摘掉殼程序,將未加密的可執(zhí)行文件還原出來。脫殼有硬脫殼和動(dòng)態(tài)脫殼2種方法。
硬脫殼:殼程序執(zhí)行解密算法得到可執(zhí)行文件。
動(dòng)態(tài)脫殼:當(dāng)殼程序運(yùn)行在內(nèi)存中時(shí),直接將殼程序解密好的可執(zhí)行文件從內(nèi)存中導(dǎo)出。
使用MachOView查看Mach-O可執(zhí)行文件,在Load Commands下有一個(gè)LC_ENCRYPTION_INFO_64,里面的Crypt ID若為0說明未加密,若為其他數(shù)字則說明被加密過。也可以使用otool工具使用命令行:otool -l Mach-O文件 | grep crypt。

未脫殼的微信Mach-O文件的cyptid為1,很明顯的是加殼的。
Clutch
Clutch是iOS硬脫殼常用的一種工具,從https://github.com/KJCracks/Clutch/releases下載最新版,并放到iPhone的/usr/bin目錄下,注意若提示/usr/bin/Clutch: Permission denied,可以使用chmod +x /usr/bin/Clutch修改權(quán)限。
1、使用“Clutch -i”列出已安裝的APP。

2、輸入APP序號或者Bundle Id進(jìn)行脫殼操作。例如:Clutch -d 8。
很可惜,用這個(gè)工具試了好多APP都脫殼失敗。
dumpdecrypted
dumpdecrypted也是iOS硬脫殼常用的一種工具。從https://github.com/stefanesser/dumpdecrypted下載源代碼,在源代碼目錄執(zhí)行make命令,獲取dylib動(dòng)態(tài)庫文件。將dylib文件拷貝到iPhone上,建議放在/var/root目錄。然后使用終端進(jìn)入dylib所在目錄,使用環(huán)境變量DYLD_INSERT_LIBRARIES將dylib注入到需要脫殼的可執(zhí)行文件:DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib可執(zhí)行文件。
iOS12以上需要對dumpdecrypted.dylib進(jìn)行重簽名,可以使用“l(fā)did -S dumpdecrypted.dylib”命令在iPhone上對其進(jìn)行重簽名。

很可惜,由于我的Xcode版本過高再次脫殼失敗。若想使用dumpdecrypted進(jìn)行脫殼,需要讓Xcode SDK版本與越獄手機(jī)的iOS SDK版本一致。此時(shí)可以去下載一個(gè)能與越獄iPhone對應(yīng)的老版本的Xcode。然后打開終端執(zhí)行命令“sudo xcode-select -s 老版本Xcode所在目錄/Contents/Developer”。
還有一種方法,修改下載的dumpdecrypted目錄下的makefile,然后重新 make。具體修改:在 GCC_BASE 最后加上 -miphoneos-version-min=12.0 或更低版本,并對新生成的dumpdecrypted.dylib進(jìn)行重簽名。
frida-iOS-dump
frida-iOS-dump是一種動(dòng)態(tài)脫殼的方法,它需要讓待脫殼的APP運(yùn)行起來。
1、在越獄iPhone上安裝AFC2、AppSync這兩個(gè)依賴。并確保已經(jīng)安裝了SSH。
2、Mac端安裝Python3,然后使用命令“sudo pip3 install frida-tools”安裝frida-tools,因?yàn)閒rida-tools依賴frida,因此不需要單獨(dú)下載frida,直接安裝frida-tools就自動(dòng)會(huì)安裝上frida。
3、從https://github.com/AloneMonkey/frida-ios-dump/tree/3.x下載frida-ios-dump,在frida-ios-dump所在目錄下使用“sudo pip3 install -r ./requirements.txt --upgrade”命令安裝相關(guān)依賴庫。
4、使用命令“brew install usbmuxd”安裝usbmuxd,然后輸入“iproxy 2222 22”切換遠(yuǎn)程連接的端口號,并登錄到越獄iPhone。
5、越獄iPhone打開要脫殼的APP使其保持運(yùn)行,然后回到Mac終端,在frida-ios-dump所在目錄下使用命令“./dump.py 待脫殼APP包名”進(jìn)行脫殼。

此時(shí),將得到一個(gè)脫殼后的ipa文件,將其中的Mach-O文件取出,再次使用otool查看。

可以看到cryptid已經(jīng)為0了,說明已經(jīng)將AppStore加的那個(gè)殼給脫掉了。
然而,當(dāng)滿心歡喜的使用class-dump想導(dǎo)出頭文件時(shí),發(fā)現(xiàn)報(bào)錯(cuò);使用Hopper Disassembler時(shí)也只比未脫殼前要多一些可利用的匯編代碼。騰訊爸爸還是做了很多代碼混淆等程序加固工作的。