在 QEMU 中模擬 iPhone (★ 105 分)
這篇文章詳盡記錄了團隊如何運用 QEMU 模擬 iOS 14 作業系統的技術旅程。起初,他們嘗試使用現有開源專案 xnu-qemu-arm64,但因專案僅提供唯讀介面而令工程師感到受限,進而轉向 qemu-t8030,其特點包括可執行 iOS 還原、使用第二個 QEMU 處理 USB 連線以及較新的 QEMU 版本。為了獲得具備完整使用者介面與應用程式執行能力的模擬環境,團隊決定利用 PongoOS(可搭配 checkra1n 補丁,後者是用於越獄作業的工具)來取代 QEMU 本身所內嵌的內核修改,並透過調整資料夾中的啟動檔(plist 檔案)來迅速建立起 ssh 存取與系統 shell。
在圖形顯示方面,考量到現代 iPhone 的所有圖形渲染皆經由 Metal API(蘋果專用低階圖形渲染介面)與實體 GPU 處理,團隊提出兩種方案:一是利用軟體轉譯,二是將 Metal 呼叫轉送至具備渲染能力的實體裝置。透過在真機上修改 QuartzCore 框架,證實軟體渲染在大部分 UIKit 應用程式上可行,但效能較慢且畫面出現瑕疵;同時,他們也試圖透過支援 IOMFB 的 QEMU 分叉版本進行螢幕除錯,並藉由修改 DTB(設備樹資料)中晶片型號,使得啟動後能正確顯示蘋果標誌。
為解決系統內核與用戶空間的位址隨機化問題,團隊著手對內核啟動流程進行補丁,透過停用執行檔與動態函式庫的隨機位址配置,並開發工具自動比對兩份 Mach-O 二進位檔以產生組合語言差異補丁。進一步地,他們使用 GDB(GNU Debugger,通用除錯工具)對 backboardd、SpringBoard 與 QuartzCore 等關鍵組件進行除錯,並面臨因指標認證(PAC,Pointer Authentication,ARM8.3 引入)而導致的驗證失敗問題,最終藉由將專案移植至 QEMU 8.2.1,成功關閉 PAC 強制驗證,解決此項安全檢查障礙。
在後續調試中,透過系統日誌檢查與精確的使用者空間補丁,工程團隊逐步排除 mobileactivationd 與 SpringBoardFoundation 等守護進程中引發的錯誤。利用改良版 dyld 快娶補丁工具,可直接生成適用於 dd 命令的簡單文本補丁,進而快速推進每次修改的檢驗與驗證。這些努力最終使得模擬環境能夠顯示包含白色進度條、系統圖示及 VNC 輸入支援的基本使用者介面,為 iOS 真實操作環境的複製奠定基礎。
👥 27 則討論、評論 💬
https://news.ycombinator.com/item?id=43592409