iOS 逆向工程及检查工具

iOS 逆向工程及检查工具你应该没有用 UserDefault 来存取使用者的账号密码吧? 你不会认为 API 走 https就安全了吧? 你知道设备越狱后 可以拿到储存过的 wifi 密码吗?

iOS 逆向工程及检查工具


iOS的沙盒機制

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

沙盒的結構

iOS 逆向工程及检查工具

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 還在研究中,這次就先不介紹了。


Charles – Web Debugging Proxy

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

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


iFunBox

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

iOS 逆向工程及检查工具

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

print(NSHomeDirectory())
// 得到 /var/mobile/Containers/Data/Application/9BB71CC9-766F-47B6-8CDB-FF74F6CF9A95

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

iOS 逆向工程及检查工具

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

        UserStore.shared.userDefault.set("Don", forKey: "Name")
        UserStore.shared.userDefault.set("Taiwan", forKey: "From")
        UserStore.shared.userDefault.set("job", forKey: "Developer")

iOS 逆向工程及检查工具

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

iOS 逆向工程及检查工具

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

iOS 逆向工程及检查工具


Cydia

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

iOS 逆向工程及检查工具


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 發送指令,即時的看到變化。

顯示所有進程

ps -e

找到指定應用的進程ID

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

ps -e | grep SpringBoard

iOS 逆向工程及检查工具

可以看到 SpringBoard 在進程 3190。

注入進程

cycript -p 3190

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

alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:@"from Don" delegate:nil cancelButtonTitle:@"Got it" otherButtonTitles:nil]

iOS 逆向工程及检查工具

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

[#0x1656d570 show];
// 或者
[alertView show];

iOS 逆向工程及检查工具

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

choose(UIAlertViewController)

iOS 逆向工程及检查工具

直接讀取某一個屬性

比如 firebaseAPIKey:

iOS 逆向工程及检查工具

homeVC = choose(UIViewController)[0]
[homeVC.firebaseAPIKey]

iOS 逆向工程及检查工具

列出視圖層級關係

UIApp.keyWindow.recursiveDescription().toString()

iOS 逆向工程及检查工具

來即時修改一個Button的顏色

var button = new Instance(0x16d39fb0)
button.backgroundColor = [UIColor greenColor]

iOS 逆向工程及检查工具

iOS 逆向工程及检查工具

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


Dumpdecrypted

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

iOS 逆向工程及检查工具

會得到一個 .dylib 文件

iOS 逆向工程及检查工具


Clutch

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

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

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

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

chmod +w /usr/bin/Clutch

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

iOS 逆向工程及检查工具

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

Clutch -b com.devdon.HealthNumbers

iOS 逆向工程及检查工具

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

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

iOS 逆向工程及检查工具


class-dump

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

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

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

class-dump -S -s -H HealthNumbers -o dumpHeaders

iOS 逆向工程及检查工具


Keychain dumper

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

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

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

/private/var/Keychains/

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

iOS 逆向工程及检查工具

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

chmod +r keychain-2.db

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

keychain_dumper
 
// 如果想要將內容導出成文件
keychain_dumper>keychain-export.txt
 
// keychain_dumper -h 可以看到更多的指令

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

iOS 逆向工程及检查工具


推薦閱讀

今天的文章iOS 逆向工程及检查工具分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23537.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注