iOS app 逆向分析

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

為了砸殼钻洒,我們需要使用到 dumpdecrypted设凹,這個工具已經(jīng)開源并且托管在了 GitHub 上面浪蹂,我們需要進(jìn)行手動編譯羡榴。步驟如下:

  1. 從 GitHub 上 clone 源碼:

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

    $ cd dumpdecrypted/
    $ make
    

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

有了砸殼工具之后俩垃,下一步就需要找到待砸的獵物了励幼,這里就以微信為例子欢策,來說明如何砸掉微信的殼,并導(dǎo)出它的頭文件赏淌。

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

    # 注意將 IP 換成你自己 iOS 系統(tǒng)的 IP
    $ ssh root@192.168.1.107
    
  2. 連上之后踩寇,使用 ps 配合 grep 命令來找到微信的可執(zhí)行文件

      $ 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
    

    在這里,因為我們已經(jīng)知道微信的應(yīng)用名就叫 WeChat六水,所以可以直接進(jìn)行關(guān)鍵字搜索俺孙。那如果我們不知道想要找到應(yīng)用名稱叫什么該怎么辦呢?可以在 App Store 下載該 app 的 IPA 包掷贾,解壓查看 Payload 下擴展名為 .app 的文件名睛榄,這就是我們需要查找的進(jìn)程

    注意:如果輸入 ps 之后,系統(tǒng)提示沒有這個命令想帅,那就需要到 cydia 當(dāng)中安裝 adv-cmds 包场靴。

  3. 使用 Cycript 找到目標(biāo)應(yīng)用的 Documents 目錄路徑。

    Cycript 是一款腳本語言港准,可以看成是 Objective-JavaScript旨剥,它最好用的地方在于,可以直接附加到進(jìn)程上浅缸,然后直接測試函數(shù)的效果轨帜。關(guān)于 cycript 的更詳細(xì)介紹可以看它的官網(wǎng).

    安裝 cycript 也很簡單,直接在 cydia 上搜索 cycript 并安裝就可以了衩椒。裝完之后就可以來查找目標(biāo)應(yīng)用的 Documents 目錄了:

    $ cycript -p WeChat
    cy# NSHomeDirectory()
    @"/var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD"
    

    可以看到蚌父,我們打印出了應(yīng)用的 Home 目錄,而 Documents 目錄就是在 Home 的下一層毛萌,所以在我這里 Documents 的全路徑就為 /var/mobile/Containers/Data/Application/13727BC5-F7AA-4ABE-8527-CEDDA5A1DADD/Documents

    注意:可以使用 Ctrl + D 來退出 cycript

  4. 將 dumpdecrypted.dylib 拷到 Documents 目錄下:

    # 注意將 IP 和路徑換成你自己 iOS 系統(tǒng)上的
    # 注意本步是在電腦端進(jìn)行的操作
    $ 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 命令找到的目標(biāo)應(yīng)用可執(zhí)行文件的路徑 
    $ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/944128A6-C840-434C-AAE6-AE9A5128BE5B/WeChat.app/WeChat
    

    完成后會在當(dāng)前目錄生成一個 WeChat.decrypted 文件苟弛,這就是砸殼后的文件。之后就是將它拷貝到 OS X 用 class-dump 來導(dǎo)出頭文件啦阁将。(可以使用 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 文件中的頭文件信息提取出來冀痕,并生成對應(yīng)的 .h 文件荔睹。可以在其 class-dump 官網(wǎng)下載言蛇,在個人目錄下新建一個 bin 目錄僻他,并將其添加到 PATH 路徑中,然后將下載后的 class-dump-3.5.dmg 里面的 class-dump 可執(zhí)行文件復(fù)制到該 bin 目錄下腊尚,賦予可執(zhí)行權(quán)限:

$ mkdir ~/bin
$ vim ~/.bash_profile
# 編輯 ~/.bash_profile 文件吨拗,并添加如下一行
export PATH=$HOME/bin/:$PATH
# 將 class-dump 拷貝到 bin 目錄后執(zhí)行下面命令
$ chmod +x ~/bin/class-dump

使用 class-dump

使用 class-dump 來將微信的頭文件導(dǎo)出:

$ mkdir ~/iOSReverse/WeChat/Headers
$ cd ~/iOSReverse/WeChat/
$ class-dump -S -s -H WeChat.decrypted -o Headers/

注意使用 class-dump 仍然只導(dǎo)出 CDStructures.h 一個文件(或者沒有文件),則可能架構(gòu)選擇錯誤,或者使用的dumpcrypted 編譯 sdk 不對

考慮下面類似的命令來指定砸殼文件的架構(gòu)
class-dump --arch armv7 dajietiao.decrypted -H -o ./heads/

<a name="theos_pc"></a>搭建越獄開發(fā)環(huán)境 Theos

  1. 安裝 Xcode 和 Command Line Tools

  2. 安裝 dpkg

    $ brew install dpkg

  3. 從 Github 下載 Theos

    打開命令行劝篷,進(jìn)行如下操作:

    $ export THEOS=/opt/theos
    # 如果之前已經(jīng)安裝過 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 環(huán)境

    編輯 ~/.bash_profile 文件娇妓,在末尾添加下面這幾句像鸡,注意替換 example.local 為與本地計算機同處一個 Wi-Fi 環(huán)境的 iOS 設(shè)備的 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>配置越獄開發(fā)調(diào)試的 iOS 設(shè)備 Theos 環(huán)境

安裝 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>動態(tài)分析-Logify

配置越獄開發(fā)環(huán)境 OK 之后着绷,經(jīng)常在分析 app 的時候會用到 logify蛔钙。
神器 Logify ,它是 theos 的一個模塊荠医,作用就是根據(jù)頭文件自動生成 tweak吁脱,生成的 tweak 會在頭文件的所有方法中注入 NSLog 來打印方法的入?yún)⒑统鰠ⅲ浅_m合追蹤方法的調(diào)用和數(shù)據(jù)傳遞.

根據(jù)此前砸殼后 class_dump 出來的頭文件彬向,找到我們感興趣的頭文件比如說 BaseMsgContentViewController 在終端執(zhí)行如下命令:

$ logify.pl /path/to/BaseMsgContentViewController.h > /out/to/Tweak.xm

輸出的tweak文件中帶百分號的關(guān)鍵字兼贡,例如 %hook、%log幢泼、%orig 都是 mobilesubstrate 的 MobileHooker 模塊提供的宏紧显,其實也就是把 method swizzling 相關(guān)的方法封裝成了各種宏標(biāo)記,使用起來更簡單缕棵,大家想要更深入了解各種標(biāo)記,可以google一下logos語言

<a name="tweak"></a>Theos 創(chuàng)建 tweak

上面我們用 logify 生成了一個 tweak 代碼涉兽,我們要把它安裝到手機上招驴,首先需要使用 theos 進(jìn)行編譯,安裝了 theos 之后枷畏,在終端輸入 nic.pl别厘,會讓我們配置一些信息。

比如首先是選擇項目模版當(dāng)然是 tweak 啦拥诡,然后是項目名稱触趴、作者,后面兩個選項要注意:

  1. 首先是 bundle filter渴肉,這個需要填你需要注入的目標(biāo) app 的 bundle id冗懦,MobileLoader 模塊會根據(jù)它來尋找你的 tweak 的注入目標(biāo)
  2. 最后是 list id applications to terminate upon installation,這里指定當(dāng) tweak 安裝成功之后仇祭,需要 kill 的進(jìn)程披蕉,比如我們要 hook 微信,這里就填微信的二進(jìn)制文件名就可以了,為什么要 kill 没讲? 因為我們的插件是需要在 app 啟動時加載進(jìn)去的眯娱,如果不重啟app,插件是不會生效的爬凑。

把上面 logify 生成的 tweak 文件覆蓋到當(dāng)前目錄徙缴,并用文本編輯器打開 makefile 文件
最后在終端進(jìn)入項目目錄,輸入 make package install 命令
期間會讓你輸入設(shè)備的 ssh 密碼嘁信,越獄機器的默認(rèn) ssh 密碼是 alpine娜搂。

然后打開 Xcode 的 Windows->Devices 選中要調(diào)試的 iOS 設(shè)備,將隱藏的控制臺打開吱抚。這樣我們就可以看到 app 運行時輸出的日志了百宇。(不知道如何操作的查看 參考資料 7)
由于我們使用 logify 生成的 tweak 可以打印每個函數(shù)的入?yún)⒑统鰠ⅲ赃\行到相應(yīng)的函數(shù)的時候秘豹,可以在控制臺看到相應(yīng)的日志携御。

<a name="lldb"></a>動態(tài)分析-lldb

通過將我們砸殼的文件比如 WeChat.decrypted 拋給 hopper 解析,我們可以方便的反編譯代碼既绕。查看反編譯代碼的時候我們會想對對應(yīng)的代碼進(jìn)行調(diào)試啄刹。當(dāng)需要在 app 中設(shè)置斷點進(jìn)行調(diào)試的時候,就需要遠(yuǎn)程連接到 iOS 設(shè)備凄贩,使用 lldb 進(jìn)行調(diào)試誓军。具體配置參看 參考資料 4

在 iOS 設(shè)備上使用下面這句命令開啟 WeChat 的調(diào)試
$ debugserver *:19999 -a WeChat

在計算機終端上運行下面的命令,連接到遠(yuǎn)程 iOS 設(shè)備調(diào)試

$ lldb 
$ process connect connect://deviceIP:19999

調(diào)試的時候一些有用的命令

# 查看 app 運行的內(nèi)存基地址
$ image list -o -f
# 基地址加上函數(shù)的偏移地址(可以通過 hopper 查看疲扎,注意 hopper 剛開始讓我們配置的架構(gòu)選項)就是相應(yīng)代碼段的內(nèi)存實際地址
$ br s -a '0X00000000000E800+0x00000001017d7c6c'

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

  1. iOS 逆向手把手教程之一:砸殼與class-dump
  2. 配置越獄開發(fā)環(huán)境
  3. 配置越獄開發(fā)調(diào)試的 iOS 設(shè)備
  4. 使用 lldb debug 越獄設(shè)備上的 app
  5. 移動App入侵與逆向破解技術(shù)-iOS篇
  6. 使用 Reveal 查看越獄設(shè)備 app 界面
  7. 打開 Xcode 查看設(shè)備運行時日志
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昵时,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椒丧,更是在濱河造成了極大的恐慌壹甥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壶熏,死亡現(xiàn)場離奇詭異句柠,居然都是意外死亡,警方通過查閱死者的電腦和手機棒假,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門溯职,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帽哑,你說我怎么就攤上這事谜酒。” “怎么了祝拯?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵甚带,是天一觀的道長她肯。 經(jīng)常有香客問我,道長鹰贵,這世上最難降的妖魔是什么晴氨? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮碉输,結(jié)果婚禮上籽前,老公的妹妹穿的比我還像新娘。我一直安慰自己敷钾,他們只是感情好枝哄,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阻荒,像睡著了一般挠锥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侨赡,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天蓖租,我揣著相機與錄音,去河邊找鬼羊壹。 笑死蓖宦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的油猫。 我是一名探鬼主播稠茂,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼情妖!你這毒婦竟也來了睬关?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鲫售,失蹤者是張志新(化名)和其女友劉穎共螺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情竹,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年匀哄,在試婚紗的時候發(fā)現(xiàn)自己被綠了秦效。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡涎嚼,死狀恐怖阱州,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情法梯,我是刑警寧澤苔货,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布犀概,位于F島的核電站,受9級特大地震影響夜惭,放射性物質(zhì)發(fā)生泄漏姻灶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一诈茧、第九天 我趴在偏房一處隱蔽的房頂上張望产喉。 院中可真熱鬧,春花似錦敢会、人聲如沸曾沈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塞俱。三九已至,卻和暖如春吏垮,著一層夾襖步出監(jiān)牢的瞬間障涯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工惫皱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留像樊,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓旅敷,卻偏偏與公主長得像生棍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子媳谁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容