iOS應用脫殼(解密)的幾種方式

我們日常開發提交給Appstore發布的App,都經過官方保護而加密,這樣可以保證機器上跑的應用是蘋果審核過的,也可以管理軟件授權。經過App Store加密的應用,我們無法通過Hopper等反編譯靜態分析,也無法Class-Dump,在逆向分析過程中需要對加密的二進制文件進行解密才可以進行靜態分析,這一過程就是大家熟知的砸殼(脫殼)

脫殼原理:從內存中dump出MachO

一、Clutch

由KJCracks開發的一款開源砸殼工具。

具體操作

1、使用Clutch,下載最新的release版本,可得到一個名為Clutch-2.0.4的胖二進制文件。
2、通過usb登錄越獄設備。
3、通過命令scp -P 12345 Clutch-2.0.4 root@localhost:/usr/bin將其拷貝到越獄設備的指定目錄下。
可通過mv Clutch-2.0.4 Clutch對其重命名。

4、查看Clutch的可執行權限。沒有的話就chmod +x Clutch添加權限即可。
5、進入到越獄設備的命令行操作界面。通過Clutch命令可查看相關命令幫助信息。

Dyoung5s:~ root# pwd
/var/root
Dyoung5s:~ root# 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

6、Clutch -i 顯示可砸殼的應用列表。

Dyoung5s:~ root# Clutch -i
Installed apps:
1:   微博國際版 <com.weibo.international>
2:   淘寶-雙十二購物,移動生活社區 <com.taobao.taobao4iphone>
3:   今日頭條極速版 <com.ss.iphone.article.lite>
4:   QQ <com.tencent.mqq>
5:   DingTalk <com.laiwang.DingTalk>
6:   酷狗音樂-就是歌多 <com.kugou.kugou1002>
7:   抖音短視頻 <com.ss.iphone.ugc.Aweme>
8:   愛思助手 <com.diary.mood>

7、Clutch -d 4選擇要砸殼的應用,并進行砸殼,成功后有如下提示。將其拷貝出來即可。我們也可以通過otool -l查看其cryptid字段以驗證是否砸殼成功。

二、dumpdecrypted

通過建立一個名為dumpdecrypted.dylib的動態庫,插入目標應用實現脫殼。

1、下載dumpdecrypted,并通過make命令編譯生成dylib庫。


2、通過命令scp -P 12345 dumpdecrypted.dylib root@localhost:~/將動態庫拷貝越獄設備的指定目錄。

3、通過ps -A查看當前進程,并通過如下命令將其動態庫插入到指定進程中。即可生成對應進程應用的MachO文件。

//后面加上的進程路徑。
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/A8CC18F5-9213-482E-B145-C36EFE9ACED0/DingTalk.app/DingTalk

三、frida-ios-dump

安裝

1、下載pip

sudo easy_install pip

2、通過pip下載frida_tools

sudo -H pip install frida_tools
//如果報下圖中的錯誤則更換為另外一條命令。
sudo pip install six --upgrade --ignore-installed six

3、直接clonefrida-ios-dump到本地目錄,進入目錄可發現dump.py腳本文件。

4、修改dump.py文件中的如下信息,確保與越獄設備信息匹配。

5、在越獄設備中添加https://build.frida.re源,并且安裝Frida插件.

dump應用

將脫殼應用在設備上置于運行狀態。進入腳本所在文件夾,通過./dump.py 微信便可成功脫殼應用。成功后會在執行終端命令的地方生成ipa包。

以上dump時的操作可寫成腳本,將frida-ios-dump文件夾放置sh腳本文件的同級目錄中。編寫腳本,并配置環境變量即可。

//腳本內容:
dump.py的路徑 $1
遇到的一些坑:

1、No module named xxx。 通過pip install --user xxx下載即可。

2、from scp import xxx,同上執行pip install --user xxx即可。

3、生成ipa,存放到腳本文件所在文件夾時沒有寫的權限。可直接對文件夾執行sudo chmod -R 777 文件夾路徑即可。

四、lldb手動dump

準備

1、在手機中配置好debugserver
2、通過以下命令導出需要dump應用的可執行文件到當前路徑。xxxx代表應用進程路徑。

scp -P 12345 root@localhost:xxxx ./

3、查看瘦身后的可執行文件的加密信息。并記錄。

●  otool -l Aweme_arm64 | grep cry
     cryptoff 16384
    cryptsize 52527104
      cryptid 1

分析:
cryptoff:指加密文件的頭所對應的偏移。這個數字之前代表著可執行文件的header。
cryptsize: 加密的數據長度,我們需要把這段時間拷貝出來。

實操

1、開啟debugserver服務,依附到我們想要dump應用的進程中。

debugserver *:9393 -a Aweme

2、電腦進入lldb調試環境,連接到對應的debugserver端口。

process connect [connect://localhost:9393](connect://localhost:9393)

3、通過image list指令拿到可執行文件的頭地址,加上之前的cryptoff得到需要拷貝數據的起始地址。

4、按字節讀取內存中的可執行文件,并拷貝到電腦。(耗時動作)

//--force:按字節讀取。
//0x00000001000c4000+16384:需要拷貝內容的起始地址。
//52527104:需要拷貝內容的大小。
//./decrypted.bin : 在當前目錄下生成一個名為decrypted.bin的二進制包。
memory read --force --outfile ./decrypted.bin --binary --count 52527104 0x00000001000c4000+16384

5、將二進制文件包替換之前拷貝出來的可執行文件中的對應部分,得到一個新的可執行文件。

//dd:用指定大小的文件寫到另一個文件當中。
//bs:一個一個字節寫入
//conv:指定轉換文件的方式。
dd seek=16384 bs=1 conv=notrunc if=./decrypted.bin of=./Aweme_arm64

6、通過otool -l查看新的可執行文件,得知cryptid仍為1,這里是因為我們并沒有對header文件作修改,所以字段的值仍保持之前加密的鍵值。但是可執行文件的內容卻被我們解密了的。可以通過class-dump驗證。

7、通過Mach0View 修改cryptid的值為0。如果不修改class-dump會不成功。因為這個工具首先會拿到header獲取cryptid的值,如果是已加密的話就會放棄后面的dump工作了。

8、通過class-dump -H Aweme_arm64 -o ./AwemeHeaders能導出應用的頭文件,便可證明lldb手動脫殼成功。

補充

frida_tools的一些使用

1、配置端口映射。
通過frida-ps列出當前應用進程。
通過usb連接好手機后,通過frida-ps -U列出usb設備的應用進程。


2、通過frida -U 微信附加進程到微信。

3、執行ObjC可拿到附加進程應用的所有Object-C對象。

插入自定義動態庫到指定應用

通過這樣的操作,進程沒有被污染,在以后的每次執行時候不會執行我們所插入的動態庫的方法。這里只相當于一次性插入。上文的dumpdecrypted便是用到了這樣的原理。

1、使用Xcode生成framework文件。通過以下命令拷貝到越獄設備中。

scp -r -P 12345 DyInsert.framework/ root@localhost:~/

2、通過以下命令將動態庫插入到指定進程即可。

DYLD_INSERT_LIBRARIES=DyInsert.framework/DyInsert    /var/mobile/Containers/Bundle/Application/4560ADA4-9AE4-4E9D-BE84-ABF666B12A7A/WeChat.app/WeChat

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述 軟件脫殼,顧名思義,就是對軟件加殼的逆操作,把軟件上存在的殼去掉(解密)。 砸殼原理 應用加殼(加密)提交給...
    沒八阿哥的程序閱讀 7,164評論 0 2
  • 應用程序加載過程 對于諸多逆向愛好者來說,給一個app脫殼是一項必做的事情。基于安全性的考慮,蘋果對上架到apps...
    歐陽大哥2013閱讀 4,088評論 10 37
  • 逆向工程的目的 1)分析競品的最新研究或者產品原型(包括所用的技術,所使用的框架)2)學術/學習目的。3)破解應用...
    90后的思維閱讀 6,973評論 3 14
  • mvn項目運行失敗的時候,cmd進入當前項目路徑根目錄,運行clean命令 mvn clean package 空...
    月光在心中閱讀 271評論 0 0
  • 讀小學那會總喜歡去周末去鄉下田野里抓野兔野雞這些野味,然而有一天晚上兩個同村的小伙伴喊我夜里去小樹林里抓野雞的時候...
    老槐樹下酣睡的貓閱讀 726評論 0 0