iOS 逆向工程及安全檢查工具


iOS的沙盒機制

在 iOS 開發中,每一個 App 的資料都會處於自己的一個沙盒之中,App 之間不能存取資料的,
除非是在 iOS8 之後使用了 App Group 的機制,讓同一個 Team 的 App 之間可以共享資料。

沙盒的結構

Documents

一般用來存放持久化的數據,比如對話紀錄。
而 iTunes 也會幫忙進行備份,所以在網路上可以看到一些關於如何備份 Line 聊天記錄的教學文章(比如上圖中的 db_fruits.sqlite3)

Library

存放的是 Caches 以及 Preferences 兩個 folder。

  • Caches,一般存放的事緩存文件,比如圖片,這個目錄下的文件不會在退出 App 的時候被刪除,但也不會被 iTunes 進行備份。
  • Preferences,存取 iOS 相關的設定內容,一般不會直接在這裡建立文件,而是通過 UserDefault 來進行設定, iTunes 會備份這個目錄下的內容(比如上圖中 Preferences 中的 ios.devdon.com.LabReverse.plist)

Tmp

臨時文件夾,App 被重啟的時候就會被清空。

這裡有官方寫的 sandbox 描述文件


安全問題 & 工具介紹

通過將蘋果設備越獄的方式,我們可以看到更多與 App 有關的資訊,這好比 Android 設備取得 root的概念(本篇文章不會涉及越獄設備的教學,可以網路上查看看)。

通過越獄或者使用工具的方式,可以看到不少有趣的資訊,比如:

  • Cydia – 越獄設備世界裡的 App Store。
  • OpenSSH – 連結越獄設備。
  • Cycript – 動態分析工具(即時看到 UI 修改的結果、取得 firebaseKey 這個 property 的值等等)
  • iFunBox – 文件傳輸工具(直接存取設備的內容,比如 App 沙盒中的 UserDefault 的 plist 文件、Sqlite 的 Database 文件、緩存文件等)
  • Charles – 使用了哪些API,其中用了什麼 parameters,得到了什麼內容。
  • KeychainDump – 取得 Keychain 中所存取的內容(原先有加密),比如 wifi 的帳號密碼。
  • Class-dump – 靜態分析工具(在 App 砸殼後,可以導出對應的 header 文件內容)
  • IDA / hopper – 反編譯工具。

這次會介紹一下幾個好玩的工具,但因為反編譯工具 IDAHopper 還在研究中,這次就先不介紹了。


Charles – Web Debugging Proxy

這個工具可以方便我們通過中間人攻擊來查看設備通過 http/https 所傳送的封包內容

下載 Charles App – 價格 US$50,也有提供限制使用時間的試用版。


iFunBox

一個可以存取設備內容的工具(下載iFunBox App

當設備越獄後,甚至可以讀取沙盒等資料,比如我們先拿到 App 文件的地址:

比如我們到 Library/Preferences 中可以看到 plist 文件

UserDefault 所存取的內容其實也就是這一個 plist 文件,所以說通過 UserDefault 來存取重要的資訊是不對的(比如使用者的帳號密碼等)

又比如說 /Documents 中的 database 也是可以拿到的,比如我們通過 sqlite 創建的 db_fruits.sqlite3

複製到電腦上以後可以通過 Sqlite database Browser 之類的工具來讀取其中的內容,所以說重要資訊在存入本地DB的時候,也應該要進行加密處理。


Cydia

將蘋果設備越獄後,就可以裝類似 Cydia 之類的開放市場應用,通過加入不同的市場(來源)來下載應用。


OpenSSH

設備越獄後 可以通過 Cyida 下載 OpenSSH,然後我們就可以通過 macbook 等設備來和越獄設備進行通信了。

假設我們的設備IP為 192.168.0.1,那麼就可以通過 ssh root@192.168.0.1 的方式就能夠進行通訊了(剛越獄完的設備,默認的帳號密碼是 root / alpine)。


Cycript

Cycript是一个理解Objective-C语法的javascript解释器,这意味着我们能够在一个命令中用Objective-C或者javascript,甚至2者兼用。它能够挂钩正在运行的进程,能够在运行时修改应用的很多东西。

Cycript 是由 saurik 混合了 Obj-C 以及 JavaScript 語法的運行時工具,可以 hook 進程,
我們可以通過 ssh 來給 App 發送指令,即時的看到變化。

顯示所有進程

找到指定應用的進程ID

比如我們這裡找 SpringBoard 的進程ID

可以看到 SpringBoard 在進程 3190。

注入進程

我們來顯示一個 AlertView(使用Obj-C語法,結尾不用分號)

然後通過 #0x16e6c400,或者變量名 alertView 來使用。

也可以通過「choose」方法,來獲取實例

直接讀取某一個屬性

比如 firebaseAPIKey:

列出視圖層級關係

來即時修改一個Button的顏色

更多的指令可以在到 Cycript手冊查看(Ctrl + D 可以退出 Cycript)。


Dumpdecrypted

可以從Github上下載 dumpdecrypted,然後在terminal中通過make編譯。

會得到一個 .dylib 文件


Clutch

如果你直接从iOS设备上导出从App Store下载的应用的IPA包,你会发现其内容是加密过的。

App Store上的应用都使用了FairPlay DRM数字版权加密保护技术。

Clutch 在 Github 上有開源,可以下載它的 release 版本

下載以後可以通過 iFunBox 等工具將 Clutch 放到 /usr/bin 下,記得要將 Clutch 設定為可執行

然後我們可以通過輸入 Clutch 來看到有哪些所有的指令,其中 Clutch -i 可以這個設備有安裝哪些 App。

有了 bundle ID,我們就可以開始來砸殼了。

這裡可以看到,健康小數據中用到了 Alamofire 和 SwiftyJSON。

Clutch會將砸殼後的二進制文件放在 /var/tmp/clutch/… 中


class-dump

class dump是一个命令行工具,它可以 dump 出砸殼後后的 iOS 二进制文件的头文件信息(比如用上面提到的 Clutch 來砸殼)

然而 class-dump 是利用了 runtime 機制,所以如果一個 App 全是 Swift 開發的,可能就 dump 不出內容了。

可以看到闭源应用程序,框架(framework)和软件包(bundle)的头文件,了解它内部是如何设计的。


Keychain dumper

應該有看過 App 會提供「記住密碼」的功能吧?我們上面已經看到通過 UserDefault 存取帳號密碼是很容易被發現的。

另一個可能存取的地方是 Keychain,然而在設備越獄後也是可以通過Keychain_dumper來獲取裡面的資料的,這裡有 Keychain_dumper 的 Github 連結

iOS 設備中,Keychian 的位置是在這裡:

下面這張圖就是其中的內容,keychain-2.db 就是我們的目標,不過裡面的內容都是加密的。

需要先讓 keychain-2.db 變成可讀。

接著我們可以通過 iFunbox 或者其他方式將keychain_dumper 文件丟到蘋果設備上面,
比如我們就丟到這個 /private/var/Keychains/ ,然後進入這個資料夾以後執行:

然後我們會看到許多通過 Keychain 存取的內容,比如我們的 wifi 帳號和密碼:


推薦閱讀

3 thoughts on “iOS 逆向工程及安全檢查工具

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *