<a name="crack"></a>砸殼
為了砸殼,我們需要使用到 dumpdecrypted,這個工具已經開源并且托管在了 GitHub 上面,我們需要進行手動編譯。步驟如下:
-
從 GitHub 上 clone 源碼:
$ cd ~/iOSReverse $ git clone git://github.com/stefanesser/dumpdecrypted/
-
編譯 dumpdecrypted.dylib:
$ cd dumpdecrypted/ $ make
執行完 make
命令之后,在當前目錄下就會生成一個 dumpdecrypted.dylib
,這個就是我們等下要使用到的砸殼工具。(注意可能需要更改 makefile
的配置,以適應不同架構的處理器和不同版本的 iPhone sdk
)。
有了砸殼工具之后,下一步就需要找到待砸的獵物了,這里就以微信為例子,來說明如何砸掉微信的殼,并導出它的頭文件。
-
使用 ssh 連上你的 iOS 系統(需要在越獄機器上安裝
OpenSSH
)# 注意將 IP 換成你自己 iOS 系統的 IP $ ssh root@192.168.1.107
-
連上之后,使用
ps
配合grep
命令來找到微信的可執行文件$ ps -e | grep WeChat 4557 ?? 5:35.98 /var/mobile/Containers/Bundle/Application/944128A6-C840-434C-AAE6-AE9A5128BE5B/WeChat.app/WeChat 4838 ttys000 0:00.01 grep WeChat
在這里,因為我們已經知道微信的應用名就叫 WeChat,所以可以直接進行關鍵字搜索。那如果我們不知道想要找到應用名稱叫什么該怎么辦呢?可以在 App Store 下載該 app 的 IPA 包,解壓查看 Payload 下擴展名為
.app
的文件名,這就是我們需要查找的進程注意:如果輸入 ps 之后,系統提示沒有這個命令,那就需要到 cydia 當中安裝 adv-cmds 包。
-
使用 Cycript 找到目標應用的 Documents 目錄路徑。
Cycript 是一款腳本語言,可以看成是 Objective-JavaScript,它最好用的地方在于,可以直接附加到進程上,然后直接測試函數的效果。關于 cycript 的更詳細介紹可以看它的官網.
安裝 cycript 也很簡單,直接在 cydia 上搜索 cycript 并安裝就可以了。裝完之后就可以來查找目標應用的 Documents 目錄了:
$ cycript -p WeChat cy# NSHomeDirectory() @"/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD"
可以看到,我們打印出了應用的 Home 目錄,而 Documents 目錄就是在 Home 的下一層,所以在我這里 Documents 的全路徑就為
/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents
注意:可以使用 Ctrl + D 來退出 cycript
-
將 dumpdecrypted.dylib 拷到 Documents 目錄下:
# 注意將 IP 和路徑換成你自己 iOS 系統上的 # 注意本步是在電腦端進行的操作 $ scp ~/iOSReverse/dumpdecrypted/dumpdecrypted.dylib root@192.168.1.107:/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents
-
砸殼
$ cd /var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents # 后面的路徑即為一開始使用 ps 命令找到的目標應用可執行文件的路徑 $ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/944128A6-C840-434C-AAE6-AE9A5128BE5B/WeChat.app/WeChat
完成后會在當前目錄生成一個 WeChat.decrypted 文件,這就是砸殼后的文件。之后就是將它拷貝到 OS X 用 class-dump 來導出頭文件啦。(可以使用 scp 命令拷貝到 OS X 下)
$ mkdir ~/iOSReverse/WeChat # 注意替換 IP和路徑 $ scp root@192.168.1.107:/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents/WeChat.decrypted ~/iOSReverse/WeChat/
<a name="class-dump"></a>class-dump
class-dump 是一個工具,它利用了 Objective-C 語言的運行時特性,將存儲在 Mach-O 文件中的頭文件信息提取出來,并生成對應的 .h 文件。可以在其 class-dump 官網下載,在個人目錄下新建一個 bin 目錄,并將其添加到 PATH 路徑中,然后將下載后的 class-dump-3.5.dmg 里面的 class-dump 可執行文件復制到該 bin 目錄下,賦予可執行權限:
$ mkdir ~/bin
$ vim ~/.bash_profile
# 編輯 ~/.bash_profile 文件,并添加如下一行
export PATH=$HOME/bin/:$PATH
# 將 class-dump 拷貝到 bin 目錄后執行下面命令
$ chmod +x ~/bin/class-dump
使用 class-dump
使用 class-dump 來將微信的頭文件導出:
$ mkdir ~/iOSReverse/WeChat/Headers
$ cd ~/iOSReverse/WeChat/
$ class-dump -S -s -H WeChat.decrypted -o Headers/
注意使用 class-dump 仍然只導出 CDStructures.h 一個文件(或者沒有文件),則可能架構選擇錯誤,或者使用的
dumpcrypted
編譯sdk
不對考慮下面類似的命令來指定砸殼文件的架構
class-dump --arch armv7 dajietiao.decrypted -H -o ./heads/
<a name="theos_pc"></a>搭建越獄開發環境 Theos
安裝 Xcode 和 Command Line Tools
-
安裝 dpkg
$ brew install dpkg
-
從 Github 下載 Theos
打開命令行,進行如下操作:
$ export THEOS=/opt/theos # 如果之前已經安裝過 theos,請先刪除,然后下載最新版 $ rm -rf $THEOS $ sudo git clone --recursive https://github.com/theos/theos.git $THEOS
-
配置ldid
$ git clone git://git.saurik.com/ldid.git $ cd ldid $ git submodule update --init $ ./make.sh $ cp -f ./ldid $THEOS/bin/ldid
或者直接從這兩個地址下載
-
配置 Theos 環境
編輯
~/.bash_profile
文件,在末尾添加下面這幾句,注意替換 example.local 為與本地計算機同處一個 Wi-Fi 環境的 iOS 設備的 IP 地址。編輯完以后重啟命令行終端。export THEOS=/opt/theos export PATH=$THEOS/bin:$PATH export THEOS_DEVICE_IP=example.local THEOS_DEVICE_PORT=22
-
添加 substrate 庫到 Theos 中
# 可以通過 brew install wget 安裝 wget $ wget http://apt.saurik.com/debs/mobilesubstrate_0.9.6011_iphoneos-arm.deb $ mkdir substrate $ dpkg-deb -x mobilesubstrate_*_iphoneos-arm.deb substrate $ mv substrate/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate $THEOS/lib/libsubstrate.dylib $ mv substrate/Library/Frameworks/CydiaSubstrate.framework/Headers/CydiaSubstrate.h $THEOS/include/substrate.h
<a name="theos_ios"></a>配置越獄開發調試的 iOS 設備 Theos 環境
安裝 Theos 及其依賴。(詳情查看參考資料 3)
-
添加下列源到 cydia source 中。
安裝
Perl
,Theos
,iOS ToolChain
<a name="logify"></a>動態分析-Logify
配置越獄開發環境 OK 之后,經常在分析 app 的時候會用到 logify。
神器 Logify ,它是 theos 的一個模塊,作用就是根據頭文件自動生成 tweak,生成的 tweak 會在頭文件的所有方法中注入 NSLog 來打印方法的入參和出參,非常適合追蹤方法的調用和數據傳遞.
根據此前砸殼后 class_dump 出來的頭文件,找到我們感興趣的頭文件比如說 BaseMsgContentViewController 在終端執行如下命令:
$ logify.pl /path/to/BaseMsgContentViewController.h > /out/to/Tweak.xm
輸出的tweak文件中帶百分號的關鍵字,例如 %hook、%log、%orig 都是 mobilesubstrate 的 MobileHooker 模塊提供的宏,其實也就是把 method swizzling 相關的方法封裝成了各種宏標記,使用起來更簡單,大家想要更深入了解各種標記,可以google一下logos語言
<a name="tweak"></a>Theos 創建 tweak
上面我們用 logify 生成了一個 tweak 代碼,我們要把它安裝到手機上,首先需要使用 theos 進行編譯,安裝了 theos 之后,在終端輸入 nic.pl,會讓我們配置一些信息。
比如首先是選擇項目模版當然是 tweak 啦,然后是項目名稱、作者,后面兩個選項要注意:
- 首先是 bundle filter,這個需要填你需要注入的目標 app 的 bundle id,MobileLoader 模塊會根據它來尋找你的 tweak 的注入目標
- 最后是 list id applications to terminate upon installation,這里指定當 tweak 安裝成功之后,需要 kill 的進程,比如我們要 hook 微信,這里就填微信的二進制文件名就可以了,為什么要 kill ? 因為我們的插件是需要在 app 啟動時加載進去的,如果不重啟app,插件是不會生效的。
把上面 logify 生成的 tweak 文件覆蓋到當前目錄,并用文本編輯器打開 makefile 文件
最后在終端進入項目目錄,輸入 make package install
命令
期間會讓你輸入設備的 ssh 密碼,越獄機器的默認 ssh 密碼是 alpine。
然后打開 Xcode 的 Windows->Devices 選中要調試的 iOS 設備,將隱藏的控制臺打開。這樣我們就可以看到 app 運行時輸出的日志了。(不知道如何操作的查看 參考資料 7)
由于我們使用 logify 生成的 tweak 可以打印每個函數的入參和出參,所以運行到相應的函數的時候,可以在控制臺看到相應的日志。
<a name="lldb"></a>動態分析-lldb
通過將我們砸殼的文件比如 WeChat.decrypted 拋給 hopper 解析,我們可以方便的反編譯代碼。查看反編譯代碼的時候我們會想對對應的代碼進行調試。當需要在 app 中設置斷點進行調試的時候,就需要遠程連接到 iOS 設備,使用 lldb 進行調試。具體配置參看 參考資料 4
在 iOS 設備上使用下面這句命令開啟 WeChat 的調試
$ debugserver *:19999 -a WeChat
在計算機終端上運行下面的命令,連接到遠程 iOS 設備調試
$ lldb
$ process connect connect://deviceIP:19999
調試的時候一些有用的命令
# 查看 app 運行的內存基地址
$ image list -o -f
# 基地址加上函數的偏移地址(可以通過 hopper 查看,注意 hopper 剛開始讓我們配置的架構選項)就是相應代碼段的內存實際地址
$ br s -a '0X00000000000E800+0x00000001017d7c6c'