iOS逆向?qū)W習(xí)之五(加殼?脫殼?)

加殼

通常我們從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)行加密

image
  • 使用otool命令行也可以查看Load Commands
otool -l 可執(zhí)行文件路徑 | grep crypt

由于Load Commands內(nèi)容較多,所以通過crypt關(guān)鍵字進(jìn)行檢索

image

脫殼

既然無法通過加殼后的程序?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
image
  • 通過App序號(hào)或者bundle ID進(jìn)行脫殼操作
Clutch -d 2
Clutch -d com.gemd.iting
image
  • 脫殼成功之后,在<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
image

dumpdecrypted

dumpdecrypted配置

點(diǎn)擊下載dumpdecrypted工具

  • 下載好源代碼后,在源代碼目錄執(zhí)行make指令進(jìn)行編譯,獲得dylib動(dòng)態(tài)庫文件
image
  • 將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í)行文件的完整路徑

image
  • 執(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í)行文件中的所有頭文件了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 加殼脫殼基本概念 使用dumpdecrypted工具進(jìn)行iOSApp脫殼 一 加殼脫殼基本概念 一 什么是加殼? ...
    當(dāng)前明月閱讀 4,848評(píng)論 15 8
  • 加殼 什么是加殼?利用特殊的算法,對(duì)可執(zhí)行文件的編碼進(jìn)行改變(比如壓縮、加密),以達(dá)到保護(hù)程序代碼的目的 脫殼 什...
    Rathen閱讀 557評(píng)論 0 0
  • 加殼 什么是加殼?我們的ipa文件上傳appstore,蘋果會(huì)給我們做一個(gè)加密,其實(shí)我們運(yùn)行在內(nèi)存中的過程是一個(gè)加...
    目前運(yùn)行時(shí)閱讀 1,560評(píng)論 0 2
  • Cycript簡介 Cycript是Objective-C++、ES6(JavaScript)、Java等語法的混...
    斑駁的流年無法釋懷閱讀 901評(píng)論 0 0
  • 什么是加殼? 利用特殊的算法,對(duì)可執(zhí)行文件的編碼進(jìn)行改變(比如壓縮、加密),以達(dá)到保護(hù)程序代碼的目的。 什么是脫殼...
    迷心迷閱讀 874評(píng)論 2 1

友情鏈接更多精彩內(nèi)容