IDAPython指令碼分享 - 自動在JNI_OnLoad下斷點

freakish發表於2017-10-22

自動在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), 為了增加準確性,從上述找到的字串參考位置開始進行 特徵指令匹配
    1. 讀取第二處的位元組碼 0xE494,根據 Thumb-2 指令的B指令編碼規則(請參考我的另一篇博文),計算出目標跳轉地址 0x24EBA0
    2. 跟蹤進計算出來的地址 0x24EBA0,繼續搜尋特徵指令 BLX R12
    3. 使用 IDAPython API介面直接在這個地址下斷點即可

思路總結

  • 透過閱讀對應部分原始碼,然後結合 IDA反彙編結果,先手工在IDA裡面找一遍,然後考慮結合實際的一些特徵值,配合 IDAPython API來進行指令碼自動化 ~..~

指令碼原始碼

相關文章