什么是加殼?
利用特殊的算法,對可執行文件的編碼進行改變(比如壓縮、加密),以達到保護程序代碼的目的。
什么是脫殼?
摘掉殼程序,將未加密的可執行文件還原出來(有些人也稱為“砸殼”)。
脫殼主要有2種方法:硬脫殼、動態脫殼。
- 硬脫殼
直接對加殼程序執行解密算法,解出原來的程序。 - 動態脫殼
將加殼程序在內存中跑起來,從內存中導出解密后的原來的程序。
如何驗證可執行文件是否已經脫殼?
查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID的值,0代表未加密。
通過otool命令行也可以:otool -l 可執行文件路徑 | grep crypt 。
iOS中的脫殼工具
- 下載最新的Release版
- 建議去掉版本號,改名為Clutch
- 將Clutch文件拷貝到iPhone的/usr/bin目錄
- 如果在iPhone上執行Clutch指令,權限不夠,賦予“可執行的權限”
- 列出已安裝的APP:Clutch -i
- 輸入APP序號或者Bundle Id進行脫殼操作:Clutch -d APP序號或BundleId
- 脫殼成功后會生成一個ipa文件,通常在路徑var/mobile/Documents/Dumped路徑下。
- 下載源代碼,然后在源代碼目錄執行make指令進行編譯,獲得dylib動態庫文件
- 將dylib文件拷貝到iPhone上(如果是root用戶,建議放/var/root目錄)
- 終端進入dylib所在的目錄
- 使用環境變量DYLD_INSERT_LIBRARIES將dylib注入到需要脫殼的可執行文件(可執行文件路徑可以通過ps -A查看獲取)
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可執行文件路徑 - .decrypted文件就是脫殼后的可執行文件
注意:在使用過程中,可能會遇到對dylib所在的文件夾權限不夠造成的錯誤。
解決方案:將dylib放在用戶所在文件夾,比如如果是root用戶,請將dylib放在/var/root目錄,如果是mobile用戶,請將dylib放在/var/mobile目錄。