什麼是符號表?
符號表(Symbo Table)是一種用於語言翻譯器(例如編譯器和解釋器)中的數據結構。在符號表中,程序源代碼中的每個標識符都和它的聲明或使用信息綁定在一起,比如其數據類型、作用域以及內存地址
獲取符號表偏移前的地址
當App準備上線打生產環境的包時,編譯器會去掉符號表信息;所以在iOS逆向調試的時候,lldb調試中查看代碼的函數調用棧時
符號偏移前的地址 = 符號偏移後的地址(lldb斷點地址) - ASLR偏移地址
其中ASLR偏移地址是App啓動後系統分配的內存區域的的首地址,在lldb中通過:
image list -o -f
來獲取某一進程的ASLR地址。
恢復符號表
方法其實很固定,就是使用restore-symbol這個開源命令行工具。
恢複函數的符號表
- 克隆第三方庫: git clone https://github.com/tobefuturer/restore-symbol
- 到庫目錄裏: cd restore-symbol
- 編譯成功後會在當前目錄生成一個 restore-symbol 可執行文件
- 在macOS終端運行(設置爲全局命令): sudo cp ./restore-symbol /usr/local/bin。或者自己手動拷貝到/usr/local/bin目錄下也可以
- 給已經砸殼的IPA文件瘦身:lipo -info xxx 查看是否是fat的文件,如果是fat的文件,fat文件瘦身:lipo xxx-thin arm64 -output xxx.arm64
- 獲取符號表:restore-symbol xxx.arm64 -o xxx.symbol
- 然後將xxx.symbol替換IPA包裏原來的xxx二進制,記得給xxx.symbol改名啊
- 扔到IPAPatch裏調試吧
恢復block的符號表
iOS中 block 是一段特殊的代碼塊,反彙編後再彙編語言中以sub_xxxx表示,例如:sub_123456ASD,我們恢復block的符號表需要藉助IDA和python腳本來實現,需要下載這個腳本
- Mac版IDAfn+Alt+F7打開腳本,或者menu+文件+Script file 加載
- IDA控制檯輸出Search completed表示(也有可能不出現,截圖中沒出現,但是已經有block_symbol.json文件了),恢復完成。在IDA打開文件路徑有:block_symbol.json
- 在原先恢複函數符號表的Mach-O文件中,繼續恢復Block符號表restore-symbol xxx.symbol -o xxx.symbol -j block_symbol.json
- 然後重新打包用IPAPatch運行即可