23-應(yīng)用砸殼

前言

要想破解別人的App,第一步就是拿到ipa包進(jìn)行砸殼,砸殼也稱作軟件脫殼,顧名思義,就是對軟件加殼的操作,把軟件上存在的殼去掉(即解密)。

一、砸殼原理

1.1 應(yīng)用加殼(加密)

提交給AppStore發(fā)布的App,都經(jīng)過官方保護(hù)而加密,這樣可以保證機(jī)器上跑的應(yīng)用是蘋果審核過的,也可以管理軟件授權(quán)。

經(jīng)過AppStore加密的應(yīng)用,我們無法通過Hopper等反編譯靜態(tài)分析,也無法Class-Dump。

在逆向分析過程中,需要對加密的二進(jìn)制文件進(jìn)行解密,然后才能進(jìn)行靜態(tài)分析,這一過程就是大家熟知的砸殼(脫殼)。

App Store是通過對稱加密(AES)加殼的,為了速度和效率。

1.2 應(yīng)用砸殼(解密)

  • 靜態(tài)砸殼 ???? 在已經(jīng)掌握和了解到了殼應(yīng)用的加密算法和邏輯后,在不運(yùn)行殼應(yīng)用程序的前提下,將殼應(yīng)用程序進(jìn)行解密處理。靜態(tài)脫殼的方法難度大,而且加密方發(fā)現(xiàn)應(yīng)用被破解后,就可能會改用更加高級和復(fù)雜的加密技術(shù)。
  • 動態(tài)砸殼 ???? 從運(yùn)行在進(jìn)程內(nèi)存空間中的可執(zhí)行程序映像(image)入手,將內(nèi)存中的內(nèi)容進(jìn)行轉(zhuǎn)儲(dump)處理來實(shí)現(xiàn)脫殼處理。這種方法實(shí)現(xiàn)起來相對簡單,且不必關(guān)心使用的是何種加密技術(shù)。

在iOS系統(tǒng)中,應(yīng)用砸殼所使用的都是動態(tài)砸殼技術(shù)。

1.3 iOS應(yīng)用運(yùn)行原理

  1. 加了殼的程序CPU是讀不懂的,只有解密后才能載入內(nèi)存。
  2. iOS系統(tǒng)內(nèi)核會對MachO進(jìn)行脫殼,所以我們只需要將解密后的MachO拷貝出來。
  3. 非越獄手機(jī)做不到跨進(jìn)程訪問,越獄后拿到root權(quán)限就可以訪問了。這就是砸殼的原理。(按頁加解密-代碼段)

二、Clutch

Clutch是由KJCracks開發(fā)的一款開源砸殼工具。工具支持iPhone、iPod Touch、iPad,該工具需要使用iOS8.0以上的越獄手機(jī)應(yīng)用。

??注意:Clutch屬于命令行工具,適用于完美越獄的設(shè)備。如果是非完美越獄,砸殼時(shí)可能會出現(xiàn)問題。

2.1 Clutch安裝

  1. Clutch官網(wǎng)地址,直接找到Release版本????
  1. 下載最新的Clutch-2.0.4????
  1. 使用file命令,查看Clutch所支持的設(shè)備有哪些????
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è)備。

2.2 Clutch使用

  1. usb端口連接手機(jī),使用usbConnect.shusb-iphone8.sh,具體參考上篇文章
  1. 再新增終端窗口,將Clutch-2.0.4拷貝到手機(jī)的/var/root目錄下,并且重命名為Clutch
scp -P 12345 ./Clutch-2.0.4 root@127.0.0.1:/var/root/Clutch
  • 使用-P參數(shù),指定USB連接的映射端口,傳輸速度更快
  • 前面是本地文件路徑
  • 后面是手機(jī)路徑,IP地址要和登錄時(shí)設(shè)置的一致
  • 拷貝的同時(shí),可以修改名稱
  • 如果拷貝的是文件夾,增加-r參數(shù)
  1. Clutch增加可執(zhí)行權(quán)限
chmod +x Clutch
  1. 查看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)儲二進(jìn)制文件
  • -d ???? 將指定的綁定文件轉(zhuǎn)儲到.ipa文件中
  • -i ???? 打印安裝的應(yīng)用程序

例如查看安裝的應(yīng)用程序????

./Clutch -i
-------------------------
1:   老司機(jī)汽車 <com.driver.feng>
2:   愛思加強(qiáng)版 <com.pd.A4Player>
3:   微信 <com.tencent.xin>

??注意:這里列出的軟件,都可以進(jìn)行砸殼

砸殼演示

選擇對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同樣使用的是動態(tài)砸殼,所以理論上,砸殼前應(yīng)該啟動WeChat,但是實(shí)際上并不需要,因?yàn)楫?dāng)Clutch發(fā)現(xiàn)目標(biāo)App未啟動,會自動將其啟動。

砸殼成功,給出.ipa包的路徑????

Device->private->var->mobileDocuments->Dumped
  1. 將砸殼后的.ipa包,導(dǎo)出到Mac電腦
  • root目錄下,連續(xù)2次cd ../進(jìn)入父文件夾,找到Device目錄????

  • 然后執(zhí)行拷貝微信的.ipa包到Mac電腦

scp -P 12345 root@localhost://Device->private->var->mobileDocuments->Dumped/com.tencent.xin-iOS9.0-(Clutch-2.0.4).ipa
  1. 解壓出MachO文件,查看加密狀態(tài)????
otool -l WeChat | grep crypt
-------------------------
    cryptoff 16384
   cryptsize 107446272
     cryptid 0

cryptid為0,處于未加密狀態(tài),證明WeChat砸殼成功!????????????

三、dumpdecrypted

接著我們看看另一個(gè)砸殼工具 ???? dumpdecrypted。它是Github開源工具,通過建立一個(gè)名為dumpdecrypted.dylib的動態(tài)庫,插入目標(biāo)應(yīng)用實(shí)現(xiàn)脫殼。

Clutch一樣,都是砸殼領(lǐng)域的經(jīng)典插件。它們同樣歲月滄桑,適用于完美越獄的設(shè)備。如果是非完美越獄,砸殼時(shí)可能會出現(xiàn)問題

3.1 插入自定義動態(tài)庫

在演示dumpdecrypted砸殼之前,我們看看如何在手機(jī)中插入一個(gè)自定義的動態(tài)庫。

  1. 創(chuàng)建Inject動態(tài)庫,添加InjectCode類,寫入代碼????
#import "InjectCode.h"

@implementation InjectCode

+(void)load {
   NSLog(@"\n\n\n\n\n??????????\n\n\n\n\n");
}

@end
  1. 編譯項(xiàng)目,生成Inject.framework
  1. Inject.framework拷貝到手機(jī)的/var/root目錄下????
scp -r -P 12345 ./Inject.framework root@127.0.0.1:/var/root

Inject.framework是文件夾,所以需要加上-r參數(shù),拷貝目錄下所有文件。

  1. USB連接手機(jī)
usb-iphone8.sh
  1. 查看WeCath進(jìn)程
ps -A | grep WeChat
  1. 使用DYLD_INSERT_LIBRARIES,將Inject.framework插入到WeCath進(jìn)程
DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/containers/Bundle/Application/B9046860-DDDA-44B4-AFF5-AF20FFA6FC9D/WeChat.app/WeChat

上圖可見,出現(xiàn)了Killed: 9的錯(cuò)誤,因?yàn)????

iOS 9.1以上系統(tǒng),不允許root用戶插入動態(tài)庫.

解決方法 ???? 切換成mobile用戶,才可執(zhí)行成功。

su mobile
Arons-iPhone8:~ mobile$ DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/containers/Bundle/Application/B9046860-DDDA-44B4-AFF5-AF20FFA6FC9D/WeChat.app/WeChat
2021-06-05 18:32:07.606 WeChat[16797:7420505]




??????????




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

3.2 dumpdecrypted安裝

現(xiàn)在我們來安裝下dumpdecrypted ???? 官網(wǎng)鏈接

  1. 克隆dumpdecrypted
git clone https://github.com/stefanesser/dumpdecrypted.git
  1. 進(jìn)入dumpdecrypted目錄,執(zhí)行make命令

編譯生成動態(tài)庫dumpdecrypted.dylib????

3.3 dumpdecrypted砸殼演示

接下來,我們來使用dumpdecrypted.dylib砸殼。

  1. dumpdecrypted.dylib拷貝到手機(jī)的/var/root目錄下
scp -P 12345 ./dumpdecrypted.dylib root@127.0.0.1:/var/root
  1. 使用DYLD_INSERT_LIBRARIES,將dumpdecrypted.dylib插入到WeCath進(jìn)程
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/B9046860-DDDA-44B4-AFF5-AF20FFA6FC9D/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/containers/Bundle/Application/B9046860-DDDA-44B4-AFF5-AF20FFA6FC9D/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文件。

??注意:需要將dumpdecrypted.dylib拷貝到mobile路徑中,為了導(dǎo)出有的權(quán)限。dumpdecrypted.dylib會導(dǎo)出和自己同一目錄。

  1. WeChat.decrypted文件,導(dǎo)出到Mac電腦,otool查看是否加密????
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版本一致!

例如:對iOS 9.1的設(shè)備插入dumpdecrypted.dylib,就要使用老版本Xcodedumpdecrypted進(jìn)行make。否則在插入dumpdecrypted.dylib時(shí),會出現(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-ios-dump工具是基于frida提供的強(qiáng)大功能,通過注入js實(shí)現(xiàn)內(nèi)存dump,然后通過python自動拷貝到電腦生成ipa文件。

frida-ios-dump支持眾多版本的系統(tǒng),非完美越獄的環(huán)境也可使用,是目前最常用、最穩(wěn)定的砸殼工具!

4.1環(huán)境配置

4.1.1 pip安裝

pip的安裝和python版本有關(guān)????

  • python安裝使用pip
  • python3安裝使用pip3
  1. 查看python版本
python --version
-------------------------
Python 2.7.16

查看python3版本

python3 --version
-------------------------
Python 3.8.2

查看pip版本

pip -V

查看pip3版本

pip3 -V
  1. 使用easy_install命令,安裝pip
sudo easy_install pip

使用easy_install的方式,我沒有安裝成功。pip和pip3都嘗試過,安裝后一直提示版本問題,無法使用。

  1. 使用get-pip安裝
git clone https://github.com/pypa/get-pip.git

指令執(zhí)行完成后,我們來到public目錄下查看????

  1. 使用python3執(zhí)行get-pip.py腳本,安裝pip3
python3 get-pip.py

4.1.2 frida安裝

  • iOS手機(jī)端????
  1. 打開Cydia,添加源:https://build.frida.re

  2. 安裝Frida

  • Mac電腦
sudo pip3 install frida-tools

??注意:可能會出現(xiàn)警告you may want sudo's -H flag

上圖意思是目錄不歸當(dā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

4.1.3 frida使用

  • 查看Mac電腦的進(jìn)程????
frida-ps
  • USB連接設(shè)備,查看手機(jī)上的進(jìn)程????
frida-ps -U

??注意:如果執(zhí)行frida-ps -U指令后沒反應(yīng) ????
進(jìn)入frida-ios-dump目錄,然后執(zhí)行sudo pip3 install -r requirements.txt --upgrade即可!

  • 進(jìn)入WeChat進(jìn)程
frida -U 微信
  • 輸出WeChat內(nèi)存中的對象
ObjC
frida優(yōu)缺點(diǎn)
  • frida擅長將js和python腳本,注入到目標(biāo)程序并執(zhí)行,它并不適合作為動態(tài)分析的工具使用。
  • frida-ios-dump就是將dump.py,通過frida注入目標(biāo)程序,從而實(shí)現(xiàn)應(yīng)用砸殼。

4.2 frida-ios-dump的使用

  1. 在Mac電腦,配置frida-ios-dump 右邊官網(wǎng)鏈接

  2. 克隆frida-ios-dump

sudo git clone https://github.com/AloneMonkey/frida-ios-dump

查看frida-ios-dump目錄

  1. 安裝依賴
sudo pip3 install -r requirements.txt --upgrade

4.2.1出現(xiàn)的錯(cuò)誤

  • prompt-toolkit版本不兼容問題
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版本????

  1. 卸載prompt-toolkit
sudo pip uninstall prompt-toolkit
  1. 安裝指定版本
sudo pip install prompt-toolkit==1.0.6
  • -H警告,同樣使用sudo -H解決
sudo -H pip3 install -r requirements.txt --upgrade

4.2.2 frida-ios-dump砸殼演示

  1. 進(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

遇到上述問題,先檢查frida-ios-dump目錄的讀寫權(quán)限,沒有則加一個(gè)????

  1. 打開dump.py文件,需要將python修改為python3????
  1. 再執(zhí)行
./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í)候,會將ipa包導(dǎo)出到Mac電腦,此時(shí)需要USB連接設(shè)備。所以在dump之前,應(yīng)該先執(zhí)行usbConnect.sh腳本

  1. 檢查dump.py文件中的User、Password、Host、Port,是否和usbConnect.sh腳本中的配置一致, 修改Port,將2222修改為12345????
  1. 再次執(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)是不支持中文的。解決方案????

  1. 創(chuàng)建.inputrc隱藏文件,寫入以下代碼????
set convert-meta off
set output-meta on
set meta-flag on
set input-meta on
  1. .inputrc文件,拷貝到手機(jī)的/var/root目錄下
scp -P 12345 .inputrc root@localhost:/var/root
  1. iOS終端輸入中文驗(yàn)證????

總結(jié)

  1. 砸殼原理
    • 應(yīng)用加殼 ???? 一般應(yīng)用為了防止反編譯分享,會對應(yīng)用進(jìn)行加密(加殼)
    • 應(yīng)用砸殼 ???? 砸殼(脫殼)就是解密的過程
      ? 靜態(tài)砸殼 ???? 已經(jīng)知道了解密方式,不需要運(yùn)行應(yīng)用的情況下,直接解密
      ? 動態(tài)砸殼 ???? 在應(yīng)用啟動后,從內(nèi)存中找到應(yīng)用的位置,dump(內(nèi)存中導(dǎo)出)數(shù)據(jù)
  2. Clutch
    • 是一個(gè)命令行工具
    • Clutch -i ???? 查看安裝的應(yīng)用程序
    • Clutch -d 應(yīng)用編號 ???? 導(dǎo)出ipa包
  3. dumpdecrypted
    • 是一個(gè)動態(tài)庫,不能獨(dú)立運(yùn)行
    • 通過DYLD_INSERT_LIBRARIES環(huán)境變量,插入動態(tài)庫,載入某個(gè)進(jìn)程
    • DYLD_INSERT_LIBRARIES = 庫路徑(庫的可執(zhí)行文件) MachO路徑
    • iOS 9.1以上系統(tǒng),不允許root用戶使用DYLD_INSERT_LIBRARIER方式插入動態(tài)庫,需要su mobile切換成mobile用戶
  4. frida-ios-dump
    • 利用frida加載腳本砸殼
    • MaciPhone都需要安裝frida
    • 下載frida-ios-dump腳本工具
    • 執(zhí)行dump.py,參數(shù)是應(yīng)用名稱BundleID
  5. iOS終端支持中文
    • 創(chuàng)建.inputrc隱藏文件,寫入代碼
    • 拷貝到手機(jī)的/var/root目錄下
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 軟件脫殼,顧名思義,就是對軟件加殼的逆操作,把軟件上存在的殼去掉(解密)。 砸殼原理 應(yīng)用加殼(加密)提交給App...
    帥駝駝閱讀 5,454評論 2 4
  • 下載的非越獄應(yīng)用都是經(jīng)過加密的,加密后可以保證一定的安全性,但是對于逆向開發(fā)的人來說,加密應(yīng)用無法進(jìn)行靜態(tài)分析,也...
    綠葉竹林閱讀 1,419評論 0 2
  • 概述 軟件脫殼,顧名思義,就是對軟件加殼的逆操作,把軟件上存在的殼去掉(解密)。 砸殼原理 應(yīng)用加殼(加密)提交給...
    沒八阿哥的程序閱讀 7,422評論 0 2
  • 一、砸殼 軟件脫殼,顧名思義,就是對軟件加殼的逆操作,把軟件上存在的殼去掉(解密)。 1.1 砸殼原理 1.1.1...
    HotPotCat閱讀 10,698評論 0 3
  • 砸殼 提交給Appstore發(fā)布的App,都經(jīng)過官方保護(hù)而加密,這樣可以保證機(jī)器上跑的應(yīng)用是蘋果審核過的,也可以管...
    king_jensen閱讀 1,450評論 0 1

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