加殼
通常我們從App Store下載的應(yīng)用挪哄,拿到安裝包之后吧秕,通過class-dump導(dǎo)出頭文件的時候,會發(fā)現(xiàn)無法導(dǎo)出頭文件中燥,原因就是App Store對我們上傳的App進(jìn)行了加殼操作寇甸。
什么是加殼?
利用特殊的算法疗涉,對可執(zhí)行文件的編碼進(jìn)行改變(比如壓縮拿霉、加密),以達(dá)到保護(hù)程序代碼的目的
- 未加殼咱扣,我們App的可執(zhí)行文件一旦執(zhí)行绽淘,那么可執(zhí)行文件中的代碼會被裝載到內(nèi)存中
- 加殼后,可執(zhí)行文件中的所有代碼被加密之后就無法使用ldyd進(jìn)行加載了闹伪,所以在可執(zhí)行文件外部包了一層殼程序沪铭,殼程序可以直接運(yùn)行壮池。殼程序的作用就是使用解密算法對我們的可執(zhí)行文件進(jìn)行解密操作,解密完成之后就會去執(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硕旗,表示使用編號為1的加密工具進(jìn)行加密
- 使用otool命令行也可以查看Load Commands
otool -l 可執(zhí)行文件路徑 | grep crypt
由于Load Commands內(nèi)容較多窗骑,所以通過crypt關(guān)鍵字進(jìn)行檢索
脫殼
既然無法通過加殼后的程序?qū)С鑫覀兯枰念^文件信息,那么我們就需要對程序進(jìn)行脫殼操作
什么是脫殼漆枚?
摘掉殼程序创译,將未加密的可執(zhí)行文件還原出來
怎么進(jìn)行脫殼?
脫殼方式有兩種墙基,硬脫殼和動態(tài)脫殼软族。
- 硬脫殼就是直接將殼程序通過執(zhí)行解密算法得到我們所需要的可執(zhí)行文件,在iOS中碘橘,一般使用硬脫殼互订。
- 動態(tài)脫殼是指將程序運(yùn)行之后,直接從內(nèi)存中導(dǎo)出我們所需要的可執(zhí)行文件
脫殼工具
iOS中常用的脫殼工具有<font color=red>Clutch</font>和<font color=red>dumpdecrypted</font>
Clutch
可以點擊下載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序號或者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中的真實路徑桥氏,iPhone的/var是/private/var的替身
- 將脫殼后的ipa包導(dǎo)入到Mac上温峭,找到其中的Mach-O文件,使用otool命令查看Load Commands可以發(fā)現(xiàn)Crypt ID為0
dumpdecrypted
dumpdecrypted配置
點擊下載dumpdecrypted工具
- 下載好源代碼后字支,在源代碼目錄執(zhí)行make指令進(jìn)行編譯凤藏,獲得dylib動態(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>目錄下會生成.decrypted文件,這就是脫殼之后的可執(zhí)行文件∏反疲現(xiàn)在使用otool命令查看Load Commands可以發(fā)現(xiàn)Crypt ID為0蹄梢。
最后使用class-dump就可以導(dǎo)出可執(zhí)行文件中的所有頭文件了。