IDAPython指令碼分享 - 自動在.preinit_array .init .init_array下斷點

freakish發表於2017-11-28

自動在.preinit_array .init .init_array下斷點

指令碼背景

  • 在Android逆向的過程中,一個很常見的場景就是我們需要分析So模組的init函式(很多加固方案初始化的地方),每次我們使用IDA進行除錯的時候,都要手動的找一次 linker 中呼叫init函式的位置,重複又麻煩,於是就用指令碼把這個相對固定的過程用IDA Python指令碼固化下來,提高效率,順便跟大家分享一下。

指令碼使用注意事項

  • IDA載入分析 linker 完畢之後(實時附加除錯的時候,可以在IDA切換到這個模組)
  • 開發測試環境為Nexus 5X AOSP 6.0.0_r1

指令碼思路

  • 通過閱讀 linker 中dl_open 相關原始碼可知,當So模組被載入重定位完畢之後,各類初始化函式會被呼叫,因此,直接在IDA中參考引用這些字串即可找到關鍵的下斷點的位置,這裡主要參考三個字串:

    1. DT_PREINIT_ARRAY
    2. DT_INIT
    3. DT_INIT_ARRAY
  • 在這些字串被引用的時候,也就是對應初始化函式被呼叫的時候,因此直接在引用處下斷點,即可開始分析相關初始化函式

思路總結

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

指令碼原始碼

相關文章