加殼
通常我們從App Store下載的應(yīng)用,拿到安裝包之后,通過class-dump導(dǎo)出頭文件的時(shí)候,會(huì)發(fā)現(xiàn)無法導(dǎo)出頭文件,原因就是App Store對(duì)我們上傳的App進(jìn)行了加殼操作。
什么是加殼?
利用特殊的算法,對(duì)可執(zhí)行文件的編碼進(jìn)行改變(比如壓縮、加密),以達(dá)到保護(hù)程序代碼的目的
- 未加殼,我們App的可執(zhí)行文件一旦執(zhí)行,那么可執(zhí)行文件中的代碼會(huì)被裝載到內(nèi)存中
- 加殼后,可執(zhí)行文件中的所有代碼被加密之后就無法使用ldyd進(jìn)行加載了,所以在可執(zhí)行文件外部包了一層殼程序,殼程序可以直接運(yùn)行。殼程序的作用就是使用解密算法對(duì)我們的可執(zhí)行文件進(jìn)行解密操作,解密完成之后就會(huì)去執(zhí)行文件,將代碼裝載進(jìn)內(nèi)存中。
如何判斷程序被加殼(加密)?
- 使用MachOView加載可執(zhí)行文件,查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID,<font color=red>0</font>表示<font color=red>未加密</font>,<font color=red>>=1</font>表示<font color=red>已加密</font>
這里的Crypt ID表示加密工具類型,如果為1,表示使用編號(hào)為1的加密工具進(jìn)行加密
- 使用otool命令行也可以查看Load Commands
otool -l 可執(zhí)行文件路徑 | grep crypt
由于Load Commands內(nèi)容較多,所以通過crypt關(guān)鍵字進(jìn)行檢索
脫殼
既然無法通過加殼后的程序?qū)С鑫覀兯枰念^文件信息,那么我們就需要對(duì)程序進(jìn)行脫殼操作
什么是脫殼?
摘掉殼程序,將未加密的可執(zhí)行文件還原出來
怎么進(jìn)行脫殼?
脫殼方式有兩種,硬脫殼和動(dòng)態(tài)脫殼。
- 硬脫殼就是直接將殼程序通過執(zhí)行解密算法得到我們所需要的可執(zhí)行文件,在iOS中,一般使用硬脫殼。
- 動(dòng)態(tài)脫殼是指將程序運(yùn)行之后,直接從內(nèi)存中導(dǎo)出我們所需要的可執(zhí)行文件
脫殼工具
iOS中常用的脫殼工具有<font color=red>Clutch</font>和<font color=red>dumpdecrypted</font>
Clutch
可以點(diǎn)擊下載Clutch最新Release版本
Clutch配置
- 下載最新的Release版本,將Clutch-2.0.4改名為Clutch
- 使用以下命令將Clutch文件拷貝到iPhone上的/usr/bin目錄,當(dāng)然,也可以使用ifunBox直接拖拽
scp -P 10088 ./Clutch root@localhost:/usr/bin
- 如果在iPhone上執(zhí)行Clutch命令提示無權(quán)限,則需要為Clutch增加執(zhí)行權(quán)限
chmod +x /usr/bin/Clutch
Clutch使用
- 遠(yuǎn)程連接iPhone后,通過以下指令列出當(dāng)前已安裝的可以進(jìn)行脫殼的App
Clutch -I
- 通過App序號(hào)或者bundle ID進(jìn)行脫殼操作
Clutch -d 2
Clutch -d com.gemd.iting
- 脫殼成功之后,在<font color=red>/private/var/mobile/Documents/Dumped/</font>路徑下就能找到脫殼成功后的ipa文件
路徑當(dāng)中的/private/var是iPhone中的真實(shí)路徑,iPhone的/var是/private/var的替身
- 將脫殼后的ipa包導(dǎo)入到Mac上,找到其中的Mach-O文件,使用otool命令查看Load Commands可以發(fā)現(xiàn)Crypt ID為0
dumpdecrypted
dumpdecrypted配置
點(diǎn)擊下載dumpdecrypted工具
- 下載好源代碼后,在源代碼目錄執(zhí)行make指令進(jìn)行編譯,獲得dylib動(dòng)態(tài)庫文件
- 將dylib文件拷貝到iPhone上(如果是root用戶,建議放在<font color=red>/var/root</font>目錄)
dumpdecrypted使用
- 終端進(jìn)入dylib所在位置,使用環(huán)境變量<font color=red>DYLD_INSERT_LIBRARIES</font>將dylib注入到需要脫殼的可執(zhí)行文件
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可執(zhí)行文件路徑
可以通過ps -A查看可執(zhí)行文件的完整路徑
執(zhí)行完成之后,在<font color=red>/var/root</font>目錄下會(huì)生成.decrypted文件,這就是脫殼之后的可執(zhí)行文件。現(xiàn)在使用otool命令查看Load Commands可以發(fā)現(xiàn)Crypt ID為0。
最后使用class-dump就可以導(dǎo)出可執(zhí)行文件中的所有頭文件了。