iOS逆向學習之五(加殼?脫殼?)

加殼

一般咱們從App Store下載的應用,拿到安裝包以後,經過class-dump導出頭文件的時候,會發現沒法導出頭文件,緣由就是App Store對咱們上傳的App進行了加殼操做。git

什麼是加殼?

利用特殊的算法,對可執行文件的編碼進行改變(好比壓縮、加密),以達到保護程序代碼的目的github

  • 未加殼,咱們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關鍵字進行檢索bash

脫殼

既然沒法經過加殼後的程序導出咱們所須要的頭文件信息,那麼咱們就須要對程序進行脫殼操做工具

什麼是脫殼?

摘掉殼程序,將未加密的可執行文件還原出來編碼

怎麼進行脫殼?

脫殼方式有兩種,硬脫殼和動態脫殼。加密

  • 硬脫殼就是直接將殼程序經過執行解密算法獲得咱們所須要的可執行文件,在iOS中,通常使用硬脫殼。
  • 動態脫殼是指將程序運行以後,直接從內存中導出咱們所須要的可執行文件

脫殼工具

iOS中經常使用的脫殼工具備Clutchdumpdecryptedspa

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的替身code

  • 將脫殼後的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就能夠導出可執行文件中的全部頭文件了。

相關文章
相關標籤/搜索