軟件脫殼吐句,顧名思義,就是對(duì)軟件加殼的逆操作讯泣,把軟件上存在的殼去掉(解密)。
砸殼原理
應(yīng)用加殼(加密)
提交給
AppStore
發(fā)布的App
阅悍,都經(jīng)過(guò)官方保護(hù)而加密好渠,這樣可以保證機(jī)器上跑的應(yī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
目錄下,并且重命名為Clutch
scp -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
文件簇秒,寫入以下代碼:#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
克隆
dumpdecrypted
git 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
命令桃移,安裝pip
sudo easy_install pip
使用
easy_install
的方式屋匕,我沒(méi)有安裝成功。pip
和pip3
都嘗試過(guò)借杰,安裝后一直提示版本問(wèn)題过吻,無(wú)法使用
這里介紹另一種方式,使用
get-pip
克隆
get-pip
git clone https://github.com/pypa/get-pip.git
來(lái)到
public
目錄下
使用
python3
執(zhí)行get-pip.py
腳本蔗衡,安裝pip3
python3 get-pip.py
frida
安裝在
iOS
設(shè)備纤虽,安裝frida
打開(kāi)
Cydia
,添加源:https://build.frida.re安裝
Frida
在
Mac
電腦绞惦,安裝frida
sudo 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-dump
sudo 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-toolkit
sudo 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
目錄的讀寫權(quán)限右鍵
frida-ios-dump
目錄渔工,選擇“顯示簡(jiǎn)介”,添加“本用戶”的讀寫權(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
隱藏文件,寫入以下代碼: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
隱藏文件媒怯,寫入代碼- 拷貝到手機(jī)的
/var/root
目錄下