工具
- IDA pro
這個就不解釋了,至於爲什麼不用Hopper,後面會看到需要IDA來執行python腳本,給函數綁定符號 - ida pro的牛逼插件keypatch
用於修改彙編代碼 https://github.com/keystone-engine/keypatch - Il2CppDumper
Unity轉換成IL2CPP的符號表提取工具,但是隻能在Windows運行。 https://github.com/Perfare/Il2CppDumper/releases - 越獄手機
用於砸殼
過程
- 使用 ida 分析
將脫殼的unix可執行文件拖入 ida 中;(等ida分析完成之後會發現得到的函數名都是形如sub_xxxx,只表示了該函數的靜態地址偏移,並沒有帶來功能方面的任何信息因爲基於Unity的iOS二進制文件不同於基於Objc-C下的,其符號表是另外加載。擴展一點說就是Unity在生成iOS二進制的時候,將開發者編寫的C#代碼編譯成Cpp代碼,成爲IL2CPP。) - 取得 IL2CPP 的符號表
在解壓ipa得到的app包中可以得到IL2CPP的符號表,在xxx.app/Data/Managed/Metadata目錄下的global-metadata.dat文件。 - 獲取 Unity 的語言的版本號
先去Unity官網看一下有哪些版本,從2019.2開始往前推,最後猜到正確的版本號是2018.4 - 使用Il2CppDumper提取符號表
在 windows 中打開Il2CppDumper.exe 需要提供兩個文件,將脫殼的unix可執行文件,及其IL2CPP的符號表即global-metadata.dat文件,然後輸入Unity的版本2018.4。然後選擇使用的模式,官方推薦是3.Auto(Plus),最後得到了兩個輸出文件script.py和dump.cs。 - 其中script.py可以用於ida,對IL2CPP表中的無名函數進行標記成形成類名$$函數名,逆向工程就有頭緒了。另一個文件dump.cs是提取的方便閱讀的符號表,可以使用任意文本編輯器打開,就像閱讀源碼的頭文件一樣。
- 在IDA中選擇File - Script file…選擇剛纔獲取的script.py對函數進行命名,完成之後可以看到真的是耳目一新,瞬間清醒如上數學課被點名回答問題一樣。
動態調試
- 在 IDA中選擇 Remote iOS debugger
- 設置符號路徑
將符號路徑複製到 IDA的符號路徑下 (Xcode將把符號存儲在:~/Library/Developer/Xcode/iOS DeviceSupport/11.4.1 (15G77)/Symbols 中, 在IDA中,將此路徑複製到Debugger>Debugger options>Set specific options中的“符號路徑”)
- 獲取應用程序可執行文件的路徑
爲了讓IDA調試這個應用程序,它必須知道應用程序可執行文件的路徑。 但是,iOS往往隱藏這些關於文件系統的細節,據我們所知,沒有辦法正式 請問Xcode究竟在哪裏安裝了你的設備上的應用程序。所以,我們使用以下解決方法:在AppDelegate.m,並在函didFinishLaunchingWithOptions中插入以下行NSLog ( @“app安裝路徑:%@” ,[[ NSBundle mainBundle ] executablePath ]);這將確保安裝路徑將在應用程序運行時在Xcode控制檯中打印。現在點擊Xcode窗口左上角的大播放按鈕。 這將構建,安裝和在目標設備上啓動應用程序。 一旦你看到該應用程序已經啓動和應用程序路徑已經打印到控制檯,請按左上方的“停止”按鈕。 - 啓動調試器
現在是時候在IDA中打開我們的示例應用程序。 在Xcode窗口的左邊,在Project Navigator選項卡,點擊Products文件夾下的demo.app. 然後,在“實用程序”選項卡下的Xcode窗口的右側,可以找到新的路徑建立應用程序包。 使用此路徑在IDA中打開應用程序的可執行文件:
- 設置可執行文件的路徑
Debugger> Process options …菜單,並在’Application’和’Input File’字段中使用應用程序可執行文件的路徑
- 開始調試
點擊 Start process