作者:0xcc
原文鏈接:https://mp.weixin.qq.com/s/1wm4fNHdBNgNdW84YMUNlQ
又到工作日了,推送一個作者原創的工具。
VSCode 的生態日漸強大,各種插件讓編輯器如虎添翼。想必 frida 的大名大家已經耳熟能詳,不做贅述。
那么把兩者做一個有機結合如何?
我把一些常用的命令集成到 VSCode 的圖形界面里方便日常使用,如動畫所示。這個插件在市場里搜索 frida Workbench,安裝 codecolorist.vscode-frida 即可。

插件依賴 Python3 和 frida-tools。當然,還有 VSCode。
在 Windows 和 macOS 上測試過,其他系統理論上不會有問題。一些功能是可選的,依賴一些需要手動安裝對應的工具。例如 Objection 和 SSH 相關,下文會詳細介紹。
先來介紹常用的功能。
安裝之前請確保 Python3 命令在 PATH 當中能正常找到,并運行過 pip3 install frida-tools。
成功安裝之后 VSCode 的左邊就有一個倒轉的 R 圖標,即可切換到插件窗格,列出所有 App 和進程列表,可以直接選擇附加 frida 或者創建一個新的進程實例。

筆者做 iOS 工作比較多,一些功能 Android 也是可以用的。當然還需要系統路徑里安裝了 adb。
目前只支持 USB 的方式連接設備。在 Windows 上 USB 連接 iPhone 還需要安裝 iTunes。如果連接失敗,最好保持 iTunes 運行的狀態下使用。

綠色三角對應 frida 的 -f (spawn)模式。如果進程正在運行,會多一個左邊的 attach 圖標。兩種方式都會在 VSCode 的下方打開一個 frida 的 REPL。如需要創建新進程到暫停的狀態,請使用右鍵菜單的 Spawn Suspended 命令。

如果當前有活動的 REPL,而且使用編輯器打開了 js 源文件,編輯器的右上角會多出來一個 frida 的圖標:

點擊即可將當前的代碼提交到 REPL 當中運行。
View Debug Logs 菜單打開一個窗格顯示應用的日志。
通常查看 iOS 的應用日志可以使用 macOS 自帶的 Console.app 或者 libimobiledevice 的 idevicesyslog 命令。但在近幾個 iOS 大版本之后,系統對日志實現做了修改,os_log 系列函數才會正常輸出,輸出到 stderr(如 NSLog 函數)的內容不再顯示。這個小功能可以幫你找回 stderr 的內容。
如果是 Android,則會簡單地調用 adb logcat 并設置 app 的過濾器。
說到右鍵讀者會發現下面還有 Objection 和 lldb 的功能。

Objection 需要安裝對應的 pip 包,對操作系統沒有特定的要求。
lldb 目前只在 macOS 上測試過。由于此類調試通常需要依賴 Xcode 工具鏈,在其他系統確實也沒太大意義。該功能需要首先在設備上初始化配置。
配置 SSH
在電腦端,macOS 和 Linux 環境都自帶了 SSH 命令。Windows 10 支持 SSH 客戶端命令,可能需要在控制面板安裝先啟用對應的可選組件,確保 ssh.exe 命令可以使用。
本插件的一些命令需要 SSH 交互,首先用 ssh-keygen 生成密鑰,然后右鍵設備選擇 Install SSH Public Key,免去每次輸入密碼。

為驗證命令成功完成,右鍵設備并選擇 Open Shell,檢查是否在 VSCode 當中直接打開終端。
建立 SSH 通信的底層還有 iproxy,在插件里雖然我用 Python 實現了一個,但性能肯定比不上原生的命令。可以安裝 libimobiledevice 并將 iproxy 添加到環境變量中,插件會優先使用之。
配置 debugserver
首先需要在設備上預先掛載好 Xcode Developer Disk Image (DDI)。掛載的方式有兩種。
只要使用 Xcode 在設備上調試過任意 App 源代碼,Xcode 就會自動掛載對應的 DDI 鏡像。
如果是其他操作系統,還可以使用 libimobiledevice [1] 工具包的 ideviceimagemounter 命令。而這種情況需要從 Xcode 當中獲取一個 dmg 的 DDI 鏡像,可以自行從 mac 上復制,而 GitHub 上也有人收集了各個版本的鏡像。當然有了 Xcode 投毒的前車之鑒,對于非官方來源的文件,使用前請慎重做好簽名的校驗工作。

確保 DDI 在設備上配置完成后,VSCode 里選擇該設備并右鍵,選擇 Setup LLDB debugserver,將會自動使用 ldid 工具為 /Developers/usr/bin/debugserver 創建一個帶有全局調試權限的副本。
目前相當一部分越獄環境自帶 ldid。如果這一步操作失敗,請嘗試手工編譯該命令放置到設備中。
如果一切就緒,任選一個 App 右鍵,選擇 Debug with lldb,稍等片刻就可以打開調試控制臺,而無需手工逐個運行 iproxy 等命令。
配置 FlexDecrypt
iOS 對第三方應用的 DRM 加密機制是每一本逆向資料都會提到的常識。從 dumpdecrypted 之后,從內存當中轉儲解密過的 App 可執行文件已經成為標準步驟,還被先后移植到了命令行工具、frida 腳本、lldb 腳本等多種形式上,實現都大同小異。
今年出現的 FlexDecrypt[2] 則讓人眼前一亮。這個工具調用了鏈接器內部使用的 mremap_encrypted 系統調用來讓內核解密應用,卻又無需真正運行代碼,可以看作是靜態解密。
之前的解密(砸殼)方式都需要先運行代碼,對于一些做了反調試或越獄檢測的應用,可能會觸發應用的檢測邏輯而異常退出。FlexDecrypt 完全規避了這種問題,并完美支持 App Extension 的多進程模式和延遲加載的框架代碼的解密。
唯一的麻煩之處在于,FlexDecrypt 一次只解密一個文件,需要手動定位到 App 的 bundle 目錄然后逐個文件處理。因此在這個插件里特地實現了一個右鍵菜單,一次性解密整個 app 并下載為 .ipa (zip) 壓縮包。


第一次使用 FlexDecrypt 同樣需要預先配置。在按照前文設置好 SSH 之后,在設備上選擇 Install FlexDecrypt 右鍵菜單。插件會自動到 FlexDecrypt 的 GitHub 上拉取最新的 FlexDecrypt 安裝包,通過 SSH 和 dpkg 的方式自動部署到越獄 iOS 上。
關于功能和 bug 的反饋可以直接公眾號私信,或者點擊“閱讀原文”到 GitHub 倉庫中提 issue。
參考資料
[1]. https://github.com/libimobiledevice/libimobiledevice#utilities
[2]. https://github.com/JohnCoates/flexdecrypt
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1553/
暫無評論