加殼
通常我們從App Store下載的應用,拿到安裝包之後,通過class-dump匯出標頭檔案的時候,會發現無法匯出標頭檔案,原因就是App Store對我們上傳的App進行了加殼操作。
什麼是加殼?
利用特殊的演算法,對可執行檔案的編碼進行改變(比如壓縮、加密),以達到保護程式程式碼的目的
- 未加殼,我們App的可執行檔案一旦執行,那麼可執行檔案中的程式碼會被裝載到記憶體中
- 加殼後,可執行檔案中的所有程式碼被加密之後就無法使用ldyd進行載入了,所以在可執行檔案外部包了一層殼程式,殼程式可以直接執行。殼程式的作用就是使用解密演算法對我們的可執行檔案進行解密操作,解密完成之後就會去執行檔案,將程式碼裝載進記憶體中。
如何判斷程式被加殼(加密)?
- 使用MachOView載入可執行檔案,檢視Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID,0表示未加密,>=1表示已加密
這裡的Crypt ID表示加密工具型別,如果為1,表示使用編號為1的加密工具進行加密
- 使用otool命令列也可以檢視Load Commands
otool -l 可執行檔案路徑 | grep crypt
複製程式碼
由於Load Commands內容較多,所以通過crypt關鍵字進行檢索
脫殼
既然無法通過加殼後的程式匯出我們所需要的標頭檔案資訊,那麼我們就需要對程式進行脫殼操作
什麼是脫殼?
摘掉殼程式,將未加密的可執行檔案還原出來
怎麼進行脫殼?
脫殼方式有兩種,硬脫殼和動態脫殼。
- 硬脫殼就是直接將殼程式通過執行解密演算法得到我們所需要的可執行檔案,在iOS中,一般使用硬脫殼。
- 動態脫殼是指將程式執行之後,直接從記憶體中匯出我們所需要的可執行檔案
脫殼工具
iOS中常用的脫殼工具有Clutch和dumpdecrypted
Clutch
可以點選下載Clutch最新Release版本
Clutch配置
- 下載最新的Release版本,將Clutch-2.0.4改名為Clutch
- 使用以下命令將Clutch檔案拷貝到iPhone上的/usr/bin目錄,當然,也可以使用ifunBox直接拖拽
scp -P 10088 ./Clutch root@localhost:/usr/bin
複製程式碼
- 如果在iPhone上執行Clutch命令提示無許可權,則需要為Clutch增加執行許可權
chmod +x /usr/bin/Clutch
複製程式碼
Clutch使用
- 遠端連線iPhone後,通過以下指令列出當前已安裝的可以進行脫殼的App
Clutch -i
複製程式碼
- 通過App序號或者bundle ID進行脫殼操作
Clutch -d 2
Clutch -d com.gemd.iting
複製程式碼
- 脫殼成功之後,在/private/var/mobile/Documents/Dumped/路徑下就能找到脫殼成功後的ipa檔案
路徑當中的/private/var是iPhone中的真實路徑,iPhone的/var是/private/var的替身
- 將脫殼後的ipa包匯入到Mac上,找到其中的Mach-O檔案,使用otool命令檢視Load Commands可以發現Crypt ID為0
dumpdecrypted
dumpdecrypted配置
點選下載dumpdecrypted工具
- 下載好原始碼後,在原始碼目錄執行make指令進行編譯,獲得dylib動態庫檔案
- 將dylib檔案拷貝到iPhone上(如果是root使用者,建議放在/var/root目錄)
dumpdecrypted使用
- 終端進入dylib所在位置,使用環境變數DYLD_INSERT_LIBRARIES將dylib注入到需要脫殼的可執行檔案
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可執行檔案路徑
複製程式碼
可以通過ps -A檢視可執行檔案的完整路徑
-
執行完成之後,在/var/root目錄下會生成.decrypted檔案,這就是脫殼之後的可執行檔案。現在使用otool命令檢視Load Commands可以發現Crypt ID為0。
-
最後使用class-dump就可以匯出可執行檔案中的所有標頭檔案了。