聊聊從iOS固件提取系統庫符號

當程序發生崩潰並有機會獲取到崩潰堆棧時,還原崩潰堆棧從而定位錯誤顯得很是重要。用戶符號的還原很是簡單,由於在打包 APP 時,會生成對應的符號文件(以 .dSYM 結尾)。而對於系統符號,Apple 並無提供對應的符號文件下載,因此須要本身解析。本文就簡單聊聊從 iOS 固件獲取系統庫符號的方法。python

1、固件下載和解密架構

有不少提供固件下載服務的站點,比較出名的是: theiphonewiki.com 。這個站點同時也維護了用於固件解密的 key
如圖1所示:app

圖片描述
圖1:theiphonewiki.com 維護的 iOS 9.x 版本的固件解密 keyiphone

在圖1中,藍色字體部分表示對應的固件 key 存在,紅色字體表示對應的固件 key 暫時不可得,因此 theiphonewiki 上只有極少數的 arm64 版本的固件是能夠解密的。工具

固件(以 .ipsw 結尾)文件實際上是一個壓縮包,解壓後獲得的 3 個 dmg 文件中,佔用空間最大的那個就包含須要的系統庫。而這個文件是 AES 加密的,解密這個須要 Root Filesystem Key。例如,iPhone5,4(即 iPhone 5c )固件的解密 key字體

如圖2所示:
圖片描述
圖2:iPhone5,4 固件的 Root Filesystem 解密 Key加密

獲取到 key 後,就可使用 VFDecrypt 工具完成最終的解密,固然也有不少更方便的 UI 集成工具或者 python 腳本,好比:iDecrpyptIt 。spa

2、系統庫符號提取圖片

從 iPhone OS 3.1 開始,全部的系統庫都打包成一個文件:dyld_shared_cache_xxx ,其中 xxx 表示具體的架構,此文件位於:/System/Library/Caches/com.apple.dyld 目錄。dyld_shared_cache_xxx 文件的解壓可使用 dyld 中的代碼,ip

步驟如圖3所示:
圖片描述
圖 3:dyld_shared_cache_xxx 文件解密方法最後獲得的目錄中就包含了此固件的系統庫文件,如 UIKit.framework 等。

3、須要說明的地方

theiphonewiki 上提供的解密 key 並無 arm64 架構的,若是要解密 iPhone 5s 及之後產品對應的固件,須要經過其它渠道或者本身手動獲取解密 key 。關於如何手動獲取解密 key,本文並無涉及,這一話題筆者也還在研究,歡迎你們指正。

相關文章
相關標籤/搜索