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 還在研究中,這次就先不介紹了。
Charles – Web Debugging Proxy
這個工具可以方便我們通過中間人攻擊來查看設備通過 http/https 所傳送的封包內容。
下載 Charles App – 價格 US$50,也有提供限制使用時間的試用版。
iFunBox
一個可以存取設備內容的工具(下載iFunBox App)
當設備越獄後,甚至可以讀取沙盒等資料,比如我們先拿到 App 文件的地址:
print(NSHomeDirectory())
// 得到 /var/mobile/Containers/Data/Application/9BB71CC9-766F-47B6-8CDB-FF74F6CF9A95
比如我們到 Library/Preferences 中可以看到 plist 文件
UserDefault 所存取的內容其實也就是這一個 plist 文件,所以說通過 UserDefault 來存取重要的資訊是不對的(比如使用者的帳號密碼等)
UserStore.shared.userDefault.set("Don", forKey: "Name")
UserStore.shared.userDefault.set("Taiwan", forKey: "From")
UserStore.shared.userDefault.set("job", forKey: "Developer")
又比如說 /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 發送指令,即時的看到變化。
顯示所有進程
ps -e
找到指定應用的進程ID
比如我們這裡找 SpringBoard 的進程ID
ps -e | grep SpringBoard
可以看到 SpringBoard 在進程 3190。
注入進程
cycript -p 3190
我們來顯示一個 AlertView(使用Obj-C語法,結尾不用分號)
alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:@"from Don" delegate:nil cancelButtonTitle:@"Got it" otherButtonTitles:nil]
然後通過 #0x16e6c400,或者變量名 alertView 來使用。
[#0x1656d570 show];
// 或者
[alertView show];
也可以通過「choose」方法,來獲取實例
choose(UIAlertViewController)
直接讀取某一個屬性
比如 firebaseAPIKey:
homeVC = choose(UIViewController)[0]
[homeVC.firebaseAPIKey]
列出視圖層級關係
UIApp.keyWindow.recursiveDescription().toString()
來即時修改一個Button的顏色
var button = new Instance(0x16d39fb0)
button.backgroundColor = [UIColor greenColor]
更多的指令可以在到 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 設定為可執行
chmod +w /usr/bin/Clutch
然後我們可以通過輸入 Clutch 來看到有哪些所有的指令,其中 Clutch -i 可以這個設備有安裝哪些 App。
有了 bundle ID,我們就可以開始來砸殼了。
Clutch -b com.devdon.HealthNumbers
這裡可以看到,健康小數據中用到了 Alamofire 和 SwiftyJSON。
Clutch會將砸殼後的二進制文件放在 /var/tmp/clutch/… 中
class-dump
class dump是一个命令行工具,它可以 dump 出砸殼後后的 iOS 二进制文件的头文件信息(比如用上面提到的 Clutch 來砸殼)
然而 class-dump 是利用了 runtime 機制,所以如果一個 App 全是 Swift 開發的,可能就 dump 不出內容了。
可以看到闭源应用程序,框架(framework)和软件包(bundle)的头文件,了解它内部是如何设计的。
class-dump -S -s -H HealthNumbers -o dumpHeaders
Keychain dumper
應該有看過 App 會提供「記住密碼」的功能吧?我們上面已經看到通過 UserDefault 存取帳號密碼是很容易被發現的。
另一個可能存取的地方是 Keychain,然而在設備越獄後也是可以通過Keychain_dumper來獲取裡面的資料的,這裡有 Keychain_dumper 的 Github 連結。
iOS 設備中,Keychian 的位置是在這裡:
/private/var/Keychains/
下面這張圖就是其中的內容,keychain-2.db 就是我們的目標,不過裡面的內容都是加密的。
需要先讓 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 逆向工程及检查工具分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23537.html