iOS app 逆向分析

<a name="crack"></a>砸殼

為了砸殼,我們需要使用到 dumpdecrypted,這個工具已經開源并且托管在了 GitHub 上面,我們需要進行手動編譯。步驟如下:

  1. 從 GitHub 上 clone 源碼:

    $ cd ~/iOSReverse   
    $ git clone git://github.com/stefanesser/dumpdecrypted/ 
    
  2. 編譯 dumpdecrypted.dylib:

    $ cd dumpdecrypted/
    $ make
    

執行完 make 命令之后,在當前目錄下就會生成一個 dumpdecrypted.dylib,這個就是我們等下要使用到的砸殼工具。(注意可能需要更改 makefile 的配置,以適應不同架構的處理器和不同版本的 iPhone sdk)。

有了砸殼工具之后,下一步就需要找到待砸的獵物了,這里就以微信為例子,來說明如何砸掉微信的殼,并導出它的頭文件。

  1. 使用 ssh 連上你的 iOS 系統(需要在越獄機器上安裝 OpenSSH

    # 注意將 IP 換成你自己 iOS 系統的 IP
    $ ssh root@192.168.1.107
    
  2. 連上之后,使用 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 包。

  3. 使用 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

  4. 將 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
    
    
  5. 砸殼

    $ 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

  1. 安裝 Xcode 和 Command Line Tools

  2. 安裝 dpkg

    $ brew install dpkg

  3. 從 Github 下載 Theos

    打開命令行,進行如下操作:

    $ export THEOS=/opt/theos
    # 如果之前已經安裝過 theos,請先刪除,然后下載最新版
    $ rm -rf $THEOS
    $ sudo git clone --recursive https://github.com/theos/theos.git $THEOS
    
  4. 配置ldid

    $ git clone git://git.saurik.com/ldid.git
    $ cd ldid
    $ git submodule update --init
    $ ./make.sh
    $ cp -f ./ldid $THEOS/bin/ldid
    

    或者直接從這兩個地址下載

    1. http://joedj.net/ldid
    2. http://jontelang.com/guide/chapter2/ldid.html
  5. 配置 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
    
  6. 添加 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)

  1. 添加下列源到 cydia source 中。

    1. http://coolstar.org/publicrepo
    2. http://nix.howett.net/theos
  2. 安裝 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 啦,然后是項目名稱、作者,后面兩個選項要注意:

  1. 首先是 bundle filter,這個需要填你需要注入的目標 app 的 bundle id,MobileLoader 模塊會根據它來尋找你的 tweak 的注入目標
  2. 最后是 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'

<a name="references"></a>參考資料

  1. iOS 逆向手把手教程之一:砸殼與class-dump
  2. 配置越獄開發環境
  3. 配置越獄開發調試的 iOS 設備
  4. 使用 lldb debug 越獄設備上的 app
  5. 移動App入侵與逆向破解技術-iOS篇
  6. 使用 Reveal 查看越獄設備 app 界面
  7. 打開 Xcode 查看設備運行時日志
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容