軟件脫殼,顧名思義,就是對(duì)軟件加殼的逆操作,把軟件上存在的殼去掉(解密)。
砸殼原理
應(yīng)用加殼(加密)
提交給
AppStore發(fā)布的App,都經(jīng)過(guò)官方保護(hù)而加密,這樣可以保證機(jī)器上跑的應(yīng)用是蘋(píng)果審核過(guò)的,也可以管理軟件授權(quán)經(jīng)過(guò)
AppStore加密的應(yīng)用,我們無(wú)法通過(guò)Hopper等反編譯靜態(tài)分析,也無(wú)法Class-Dump在逆向分析過(guò)程中,需要對(duì)加密的二進(jìn)制文件進(jìn)行解密,然后才能進(jìn)行靜態(tài)分析,這一過(guò)程就是大家熟知的砸殼(脫殼)
應(yīng)用砸殼(解密)
- 靜態(tài)砸殼:在已經(jīng)掌握和了解到了殼應(yīng)用的加密算法和邏輯后,在不運(yùn)行殼應(yīng)用程序的前提下,將殼應(yīng)用程序進(jìn)行解密處理。靜態(tài)脫殼的方法難度大,而且加密方發(fā)現(xiàn)應(yīng)用被破解后,就可能會(huì)改用更加高級(jí)和復(fù)雜的加密技術(shù)
- 動(dòng)態(tài)砸殼:從運(yùn)行在進(jìn)程內(nèi)存空間中的可執(zhí)行程序映像(
image)入手,將內(nèi)存中的內(nèi)容進(jìn)行轉(zhuǎn)儲(chǔ)(dump)處理來(lái)實(shí)現(xiàn)脫殼處理。這種方法實(shí)現(xiàn)起來(lái)相對(duì)簡(jiǎn)單,且不必關(guān)心使用的是何種加密技術(shù)
iOS應(yīng)用運(yùn)行原理
在
iOS系統(tǒng)中,應(yīng)用砸殼所使用的都是動(dòng)態(tài)砸殼技術(shù)
Clutch
Clutch是由KJCracks開(kāi)發(fā)的一款開(kāi)源砸殼工具。工具支持iPhone、iPod Touch、iPad,該工具需要使用iOS8.0以上的越獄手機(jī)應(yīng)用。
Clutch屬于命令行工具,適用于完美越獄的設(shè)備。如果是非完美越獄,砸殼時(shí)可能會(huì)出現(xiàn)問(wèn)題
Clutch安裝官網(wǎng)地址:https://github.com/KJCracks/Clutch
直接找到
Release版本
下載最新的
Clutch-2.0.4
使用
file命令,查看Clutch工具file Clutch-2.0.4 ------------------------- Clutch-2.0.4: Mach-O universal binary with 3 architectures: [arm_v7:Mach-O executable arm_v7] [arm_v7s:Mach-O executable arm_v7s] [arm64:Mach-O 64-bit executable arm64] Clutch-2.0.4 (for architecture armv7): Mach-O executable arm_v7 Clutch-2.0.4 (for architecture armv7s): Mach-O executable arm_v7s Clutch-2.0.4 (for architecture arm64): Mach-O 64-bit executable arm64
Clutch是通用二進(jìn)制文件,可以支持不同CPU架構(gòu)的設(shè)備
Clutch使用將
Clutch-2.0.4拷貝到手機(jī)的/var/root目錄下,并且重命名為Clutchscp -P 12345 ./Clutch-2.0.4 root@127.0.0.1:/var/root/Clutch ------------------------- Clutch-2.0.4 100% 1204KB 28.2MB/s 00:00
- 使用
-P參數(shù),指定USB連接的映射端口,傳輸速度更快- 前面是本地文件路徑
- 后面是手機(jī)路徑,
IP地址要和登錄時(shí)設(shè)置的一致- 拷貝的同時(shí),可以修改名稱
- 如果拷貝的是文件夾,增加
-r參數(shù)為
Clutch增加可執(zhí)行權(quán)限chmod +x Clutch查看
Clutch的用法./Clutch ------------------------- Usage: Clutch [OPTIONS] -b --binary-dump <value> Only dump binary files from specified bundleID -d --dump <value> Dump specified bundleID into .ipa file -i --print-installed Print installed applications --clean Clean /var/tmp/clutch directory --version Display version and exit -? --help Display this help and exit -n --no-color Print with colors disabled
-b:僅從指定的bundleID轉(zhuǎn)儲(chǔ)二進(jìn)制文件-d:將指定的綁定文件轉(zhuǎn)儲(chǔ)到.ipa文件中-i:打印安裝的應(yīng)用程序查看安裝的應(yīng)用程序
./Clutch -i ------------------------- 1: 老司機(jī)汽車 <com.driver.feng> 2: 愛(ài)思加強(qiáng)版 <com.pd.A4Player> 3: 微信 <com.tencent.xin>
- 這里列出的軟件,都可以進(jìn)行砸殼
選擇對(duì)
./Clutch -d 3 ------------------------- com.tencent.xin contains watchOS 2 compatible application. It's not possible to dump watchOS 2 apps with Clutch 2.0.4 at this moment. Zipping WeChat.app ASLR slide: 0x1000b0000 Dumping <WeChatNotificationServiceExtension> (arm64) Patched cryptid (64bit segment) Writing new checksum ... DONE: /private/var/mobile/Documents/Dumped/com.tencent.xin-iOS9.0-(Clutch-2.0.4).ipa Finished dumping com.tencent.xin in 44.8 seconds
Clutch同樣使用動(dòng)態(tài)砸殼,所以理論上,砸殼前應(yīng)該啟動(dòng)Clutch發(fā)現(xiàn)目標(biāo)App未啟動(dòng),會(huì)自動(dòng)將其啟動(dòng)- 砸殼成功,給出
.ipa包的路徑將砸殼后的
.ipa包,導(dǎo)出到Mac電腦。解壓出MachO文件,查看加密狀態(tài)otool -l WeChat | grep crypt ------------------------- cryptoff 16384 cryptsize 107446272 cryptid 0
cryptid為0,處于未加密狀態(tài),證明
dumpdecrypted
Github開(kāi)源工具。dumpdecrypted這個(gè)工具就是通過(guò)建立一個(gè)名為dumpdecrypted.dylib的動(dòng)態(tài)庫(kù),插入目標(biāo)應(yīng)用實(shí)現(xiàn)脫殼。
dumpdecrypted和Clutch一樣,都是砸殼領(lǐng)域的經(jīng)典插件。它們同樣歲月滄桑,適用于完美越獄的設(shè)備。如果是非完美越獄,砸殼時(shí)可能會(huì)出現(xiàn)問(wèn)題越獄環(huán)境的代碼注入,可以使用不污染三方應(yīng)用的插件完成。插件只會(huì)影響當(dāng)前進(jìn)程,無(wú)需修改
MachO文件,從而使三方應(yīng)用防護(hù)難度增大在
dyld的源碼中,有一個(gè)DYLD_INSERT_LIBRARIES環(huán)境變量,用于插入動(dòng)態(tài)庫(kù)并執(zhí)行
越獄環(huán)境,將自定義動(dòng)態(tài)庫(kù)插入
WeCath進(jìn)程創(chuàng)建
Inject動(dòng)態(tài)庫(kù),添加InjectCode類打開(kāi)
InjectCode.m文件,寫(xiě)入以下代碼:#import "InjectCode.h" @implementation InjectCode +(void)load { NSLog(@"\n\n\n\n\n??????????\n\n\n\n\n"); } @end編譯項(xiàng)目,生成
Inject.framework
將
Inject.framework拷貝到手機(jī)的/var/root目錄下scp -r -P 12345 ./Inject.framework root@127.0.0.1:/var/root ------------------------- CodeResources 100% 2402 917.0KB/s 00:00 Inject 100% 85KB 6.4MB/s 00:00 Inject.h 100% 424 214.9KB/s 00:00 module.modulemap 100% 93 47.5KB/s 00:00 Info.plist 100% 744 588.3KB/s 00:00
Inject.framework是文件夾,所以需要加上-r參數(shù),讓其循環(huán)拷貝
USB連接手機(jī)usb-5s.sh查看
WeCath進(jìn)程ps -A | grep WeChat ------------------------- 5380 ?? 0:03.70 /var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/WeChat 5388 ttys000 0:00.01 grep WeChat使用
DYLD_INSERT_LIBRARIES,將Inject.framework插入到WeCath進(jìn)程DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/WeChat注入的代碼在
對(duì)
iOS 9.1以上系統(tǒng)的兼容問(wèn)題上述案例,使用
iOS 9.1系統(tǒng)進(jìn)行演示在
iOS 9.1以上系統(tǒng),使用DYLD_INSERT_LIBRARIES插入動(dòng)態(tài)庫(kù),會(huì)提示以下錯(cuò)誤:Killed:9
- 問(wèn)題產(chǎn)生:在
9.1以上系統(tǒng),不允許root用戶插入動(dòng)態(tài)庫(kù)- 解決辦法:需要切換成
mobile用戶,才可執(zhí)行成功
dumpdecrypted安裝官網(wǎng)地址:https://github.com/stefanesser/dumpdecrypted
克隆
dumpdecryptedgit clone https://github.com/stefanesser/dumpdecrypted.git進(jìn)入
dumpdecrypted目錄,執(zhí)行make命令make編譯生成動(dòng)態(tài)庫(kù):
dumpdecrypted.dylib
dumpdecrypted使用將
dumpdecrypted.dylib拷貝到手機(jī)的/var/root目錄下scp -P 12345 ./dumpdecrypted.dylib root@127.0.0.1:/var/root ------------------------- dumpdecrypted.dylib 100% 209KB 13.3MB/s 00:00使用
DYLD_INSERT_LIBRARIES,將dumpdecrypted.dylib插入到WeCath進(jìn)程DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/WeChat ------------------------- objc[5571]: Class MarsReachability is implemented in both /private/var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/Frameworks/mars.framework/mars and /private/var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/Frameworks/matrixreport.framework/matrixreport. One of the two will be used. Which one is undefined. objc[5571]: Class WCLogger is implemented in both /System/Library/Frameworks/WatchConnectivity.framework/WatchConnectivity and /var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/WeChat. One of the two will be used. Which one is undefined. mach-o decryption dumper ... [+] Closing original file [+] Closing dump file在當(dāng)前目錄下,導(dǎo)出
WeChat.decrypted文件,是砸殼后的MachO文件將
WeChat.decrypted文件,導(dǎo)出到Mac電腦otool -l WeChat.decrypted | grep crypt ------------------------- WeChat.decrypted: cryptoff 16384 cryptsize 107446272 cryptid 0
cryptid為0,處于未加密狀態(tài),證明導(dǎo)出的WeChat.decrypted砸殼成功
使用
dumpdecrypted工具,要求Xcode SDK與越獄設(shè)備iOS SDK版本一致例如:對(duì)
iOS 9.1的設(shè)備插入dumpdecrypted.dylib,就要使用老版本的Xcode對(duì)dumpdecrypted進(jìn)行make否則在插入
dumpdecrypted.dylib時(shí),會(huì)出現(xiàn)以下錯(cuò)誤DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/WeChat ------------------------- dyld: Symbol not found: ___chkstk_darwin Referenced from: dumpdecrypted.dylib Expected in: /usr/lib/libSystem.B.dylib in dumpdecrypted.dylib Trace/BPT trap: 5
frida-ios-dump
該工具基于frida提供的強(qiáng)大功能,通過(guò)注入js實(shí)現(xiàn)內(nèi)存dump,然后通過(guò)python自動(dòng)拷貝到電腦生成ipa文件。
frida-ios-dump支持眾多版本的系統(tǒng),非完美越獄的環(huán)境也可使用,是目前最常用、最穩(wěn)定的砸殼工具
pip安裝
pip的安裝和python版本有關(guān),python安裝使用pip,而python3安裝使用pip3查看
python版本python --version ------------------------- Python 2.7.16查看
python3版本python3 --version ------------------------- Python 3.8.2查看
pip版本pip -V查看
pip3版本pip3 -V使用
easy_install命令,安裝pipsudo easy_install pip使用
easy_install的方式,我沒(méi)有安裝成功。pip和pip3都嘗試過(guò),安裝后一直提示版本問(wèn)題,無(wú)法使用
這里介紹另一種方式,使用
get-pip克隆
get-pipgit clone https://github.com/pypa/get-pip.git來(lái)到
public目錄下
使用
python3執(zhí)行get-pip.py腳本,安裝pip3python3 get-pip.py
frida安裝在
iOS設(shè)備,安裝frida打開(kāi)
Cydia,添加源:https://build.frida.re安裝
Frida
在
Mac電腦,安裝fridasudo pip3 install frida-tools可能會(huì)出現(xiàn)警告:
you may want sudo's -H flag
- 目錄不歸當(dāng)前用戶所有。請(qǐng)檢查該目錄的權(quán)限和所有者,需要
sudo的-H標(biāo)志
sudo -H:set-home將HOME變量設(shè)為目標(biāo)用戶的主目錄sudo -H pip3 install frida-tools出現(xiàn)
Uninstalling a distutils installed project (six)提示,執(zhí)行以下命令:sudo pip3 install frida --upgrade --ignore-installed six
frida使用查看
Mac電腦的進(jìn)程frida-ps ------------------------- PID Name 17799 360壓縮大師 5668 AccessibilityVisualsAgent 602 AirPlayUIAgent 381 AppSSOAgent 13006 Code ...
USB連接設(shè)備,查看手機(jī)上的進(jìn)程frida-ps -U ------------------------- PID Name 5574 Cydia 5480 iTunes 5569 老司機(jī)汽車 6318 郵件 ...進(jìn)入
frida -U 微信輸出
[iPhone::微信]-> ObjC ------------------------- "_SFPBSearchSuggestion": { "handle": "0x1db5319f8" }, "_SFPBSectionHeaderCardSection": { "handle": "0x1db49d2b8" }, ...
frida更多語(yǔ)法,可查看:官方文檔
frida擅長(zhǎng)將js和python腳本,注入到目標(biāo)程序并執(zhí)行,它并不適合作為動(dòng)態(tài)分析的工具使用
frida-ios-dump就是將dump.py,通過(guò)frida注入目標(biāo)程序,從而實(shí)現(xiàn)應(yīng)用砸殼
在
Mac電腦,配置frida-ios-dump官網(wǎng)地址:https://github.com/AloneMonkey/frida-ios-dump
克隆
frida-ios-dumpsudo git clone https://github.com/AloneMonkey/frida-ios-dump進(jìn)入
frida-ios-dump目錄
安裝依賴
sudo pip3 install -r requirements.txt --upgrade
安裝過(guò)程中,可能出現(xiàn)的錯(cuò)誤
prompt-toolkit版本不兼容問(wèn)題frida-tools 1.2.2 has requirement prompt-toolkit<2.0.0,>=0.57, but you'll have prompt-toolkit 2.0.7 which is incompatible.解決方法,需要降低
prompt-toolkit版本卸載
prompt-toolkitsudo pip uninstall prompt-toolkit安裝指定版本
sudo pip install prompt-toolkit==1.0.6如果出現(xiàn)
-H警告,同樣使用sudo -H解決sudo -H pip3 install -r requirements.txt --upgrade
frida-ios-dump使用進(jìn)入
frida-ios-dump目錄,執(zhí)行dump.py腳本./dump.py 微信 ------------------------- Traceback (most recent call last): File "./dump.py", line 11, in <module> import frida ImportError: No module named frida遇到上述問(wèn)題,先檢查
frida-ios-dump目錄的讀寫(xiě)權(quán)限右鍵
frida-ios-dump目錄,選擇“顯示簡(jiǎn)介”,添加“本用戶”的讀寫(xiě)權(quán)限,并選擇“應(yīng)用到包含的項(xiàng)目...”
打開(kāi)
dump.py文件,需要將python修改為python3
執(zhí)行
dump.py腳本./dump.py 微信 ------------------------- [Errno None] Unable to connect to port 2222 on 127.0.0.1, ::1 or fe80::1 Try specifying -H/--hostname and/or -p/--port還是執(zhí)行失敗了,因?yàn)樵?code>dump的時(shí)候,會(huì)將
ipa包導(dǎo)出到Mac電腦,此時(shí)需要USB連接設(shè)備。所以在dump之前,應(yīng)該先執(zhí)行usbConnect.sh腳本檢查
dump.py文件中的User、Password、Host、Port,是否和usbConnect.sh腳本中的配置一致修改
Port,將2222修改為12345
執(zhí)行
dump.py腳本./dump.py 微信 ------------------------- Start the target app 微信 Dumping 微信 to /var/folders/jl/d06jlfkj2ws74_5g45kms07m0000gn/T [frida-ios-dump]: ilink_network.framework has been loaded. ... Generating "微信.ipa"執(zhí)行成功,在
frida-ios-dump目錄下,成功導(dǎo)出微信.ipa
可以將其配置為環(huán)境變量,方便使用
iOS終端支持中文
iOS終端默認(rèn)是不支持中文的創(chuàng)建
.inputrc隱藏文件,寫(xiě)入以下代碼:set convert-meta off set output-meta on set meta-flag on set input-meta on將
.inputrc文件,拷貝到手機(jī)的/var/root目錄下scp -P 12345 .inputrc root@localhost:/var/root ------------------------- .inputrc 100% 75 8.2KB/s 00:00在
iOS終端,輸入中文
總結(jié)
砸殼原理
- 應(yīng)用加殼:一般應(yīng)用為了防止反編譯分享,會(huì)對(duì)應(yīng)用進(jìn)行加密(加殼)
- 應(yīng)用砸殼:砸殼(脫殼)就是解密的過(guò)程
? 靜態(tài)砸殼:已經(jīng)知道了解密方式,不需要運(yùn)行應(yīng)用的情況下,直接解密
? 動(dòng)態(tài)砸殼:在應(yīng)用啟動(dòng)后,從內(nèi)存中找到應(yīng)用的位置,dump(內(nèi)存中導(dǎo)出)數(shù)據(jù)
Clutch
- 是一個(gè)命令行工具
Clutch -i:查看安裝的應(yīng)用程序Clutch -d 應(yīng)用編號(hào):導(dǎo)出ipa包
dumpdecrypted
- 是一個(gè)動(dòng)態(tài)庫(kù),不能獨(dú)立運(yùn)行
- 通過(guò)
DYLD_INSERT_LIBRARIES環(huán)境變量,插入動(dòng)態(tài)庫(kù)。載入某個(gè)進(jìn)程DYLD_INSERT_LIBRARIES = 庫(kù)路徑(庫(kù)的可執(zhí)行文件) MachO路徑9.1以上系統(tǒng),不允許root用戶使用DYLD_INSERT_LIBRARIER方式插入動(dòng)態(tài)庫(kù),需要切換成mobile用戶
frida-ios-dump
- 利用
frida加載腳本砸殼- 安裝
frida,Mac和iPhone都需要安裝- 下載
frida-ios-dump腳本工具- 執(zhí)行
dump.py,參數(shù)是應(yīng)用名稱或BundleID
iOS終端支持中文
- 創(chuàng)建
.inputrc隱藏文件,寫(xiě)入代碼- 拷貝到手機(jī)的
/var/root目錄下















