iOS逆向?qū)崙?zhàn)--029:應(yīng)用砸殼

軟件脫殼,顧名思義,就是對(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目錄下,并且重命名為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ì)WeChat進(jìn)行砸殼

./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)WeChat。實(shí)際上并不需要,當(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
  • cryptid0,處于未加密狀態(tài),證明WeChat砸殼成功
dumpdecrypted

Github開(kāi)源工具。dumpdecrypted這個(gè)工具就是通過(guò)建立一個(gè)名為dumpdecrypted.dylib的動(dòng)態(tài)庫(kù),插入目標(biāo)應(yīng)用實(shí)現(xiàn)脫殼。

dumpdecryptedClutch一樣,都是砸殼領(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

注入的代碼在WeChat進(jìn)程中執(zhí)行成功

對(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

cryptid0,處于未加密狀態(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)有安裝成功。pippip3都嘗試過(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 -Hset-homeHOME變量設(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)入WeChat進(jìn)程

frida -U 微信

輸出WeChat內(nèi)存中的對(duì)象

[iPhone::微信]-> ObjC
-------------------------
       "_SFPBSearchSuggestion": {
           "handle": "0x1db5319f8"
       },
       "_SFPBSectionHeaderCardSection": {
           "handle": "0x1db49d2b8"
       },
...

frida更多語(yǔ)法,可查看:官方文檔

frida擅長(zhǎng)將jspython腳本,注入到目標(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目錄的讀寫(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加載腳本砸殼
  • 安裝fridaMaciPhone都需要安裝
  • 下載frida-ios-dump腳本工具
  • 執(zhí)行dump.py,參數(shù)是應(yīng)用名稱或BundleID

iOS終端支持中文

  • 創(chuàng)建.inputrc隱藏文件,寫(xiě)入代碼
  • 拷貝到手機(jī)的/var/root目錄下
最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 砸殼 軟件脫殼,顧名思義,就是對(duì)軟件加殼的逆操作,把軟件上存在的殼去掉(解密)。 砸殼原理 應(yīng)用加殼(加密)提交給...
    looha閱讀 1,608評(píng)論 0 2
  • 軟件脫殼,顧名思義,就是對(duì)軟件加殼的逆操作,把軟件上存在的殼去掉(解密)。 砸殼原理 應(yīng)用加殼(加密)提交給App...
    鼬殿閱讀 1,320評(píng)論 0 0
  • 一、砸殼 軟件脫殼,顧名思義,就是對(duì)軟件加殼的逆操作,把軟件上存在的殼去掉(解密)。 1.1 砸殼原理 1.1.1...
    HotPotCat閱讀 10,698評(píng)論 0 3
  • 很久沒(méi)有發(fā)文章了,最近沉迷逆向無(wú)法自拔,開(kāi)始寫(xiě)點(diǎn)東西做個(gè)小總結(jié)吧,后續(xù)慢慢更新吧,全當(dāng)記錄,共同學(xué)習(xí)。 方法一、f...
    NBeanN閱讀 10,936評(píng)論 2 9
  • 砸殼 1.Clutch下載release版本,復(fù)制到手機(jī)/usr/bin目錄.①.scp命令復(fù)制 scp -P ...
    Double丶K閱讀 729評(píng)論 0 0

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