自動在JNI_OnLoad下斷點
腳本背景
- 在Android逆向的過程中,一個很常見的場景就是我們需要分析So子產品的JNI_OnLoad函數,每次我們使用IDA進行調試的時候,都要手動的找一次 libart.so(ART虛拟機)中調用JNI_OnLoad函數的位置,重複又麻煩,于是就用腳本把這個相對固定的過程用IDA Python腳本固化下來,提高效率,順便跟大家分享一下。
腳本使用注意事項
- IDA載入分析 libart.so 完畢之後(實時附加調試的時候,可以在IDA切換到這個子產品)
- 針對于ART虛拟機的,Dalvik虛拟機的需要對應修改一下(Dalvik虛拟機漸漸遠去,我就不提供修改版本了)
- 開發測試環境為Nexus 5X AOSP 6.0.0_r1
腳本思路
- 通過閱讀 libart.so 相關源碼可知,在調用So子產品的JNI_OnLoad函數之前,代碼中會有日志輸出,有參考字元串 “[Calling JNI_OnLoad in”
- 通過 IDAPython 接口API,在 .rodata 段搜尋上述的字元串,找到偏移位址
- 通過 IDAPython 接口API,對上述偏移位址進行交叉引用參考,發現有2處引用參考,其中第二處是字元串定義處,是以取第一處
- 通過交叉引用位址,使用IDAPython API 接口開始周遊整個函數(art::JavaVMExt::LoadNativeLibrary), 為了增加準确性,從上述找到的字元串參考位置開始進行 特征指令比對:
- 讀取第二處的位元組碼 0xE494,根據 Thumb-2 指令的B指令編碼規則(請參考我的另一篇博文),計算出目标跳轉位址 0x24EBA0
IDAPython腳本分享 - 自動在JNI_OnLoad下斷點 - 跟蹤進計算出來的位址 0x24EBA0,繼續搜尋特征指令 BLX R12
IDAPython腳本分享 - 自動在JNI_OnLoad下斷點 - 使用 IDAPython API接口直接在這個位址下斷點即可
-
思路總結
- 通過閱讀對應部分源碼,然後結合 IDA反彙編結果,先手工在IDA裡面找一遍,然後考慮結合實際的一些特征值,配合 IDAPython API來進行腳本自動化 ~..~
腳本源碼
- https://github.com/freakishfox/xAnSo/tree/master/IDAScript
-
IDAPython腳本分享 - 自動在JNI_OnLoad下斷點