使用IDAPYTHON跟蹤程式執行路徑-未加殼
IDA Pro是一款靜態反彙編的利器,具有良好的互動性、可程式設計性、可擴充套件性及對多處理器的支援。
對於IDA Pro的可擴充套件性表現在兩個方面,一是採用內建的指令碼語言IDC寫指令碼;二是採用Hex-rays提供的SDK寫外掛Plug-in。簡單的任務交由指令碼完成,複雜的任務則需要定製滿足需求的外掛。
IDA本身附帶了一個內建的偵錯程式,可採用該偵錯程式來除錯外掛程式,然後使用IDAPython指令碼來獲取程式執行路徑。
技術說明
使用IDAPyhon指令碼來獲取程式執行路徑的基本方法如下:
① 先用IDA反彙編可執行程式,生成xx.pdb檔案。
② 編寫IDAPython指令碼,用來在稍後的除錯中獲取程式執行路徑。指令碼框架如下:
from idaapi import *
class FuncPath(DBG_Hooks):
# Our breakpoint handler
def dbg_bpt(self, tid, ea):
print "[*] Hit: 0x%08x" % ea
return 1
debugger = FuncPath () #建立一個物件
debugger.hook() #將鉤子裝入IDA內建偵錯程式
current_addr = ScreenEA() #獲取游標座標
# 遍歷所有函式,並新增斷點,設定斷點的屬性為跟蹤
for function in Functions(SegStart( current_addr ), SegEnd( current_addr )):
AddBpt( function )
SetBptAttr( function, BPTATTR_FLAGS, BPT_ENABLED|BPT_TRACE)
num_breakpoints = GetBptQty()
print "[*] Set %d breakpoints." % num_breakpoints
基本的思想是 建立一個FuncPath類,該類從DBG_Hooks類繼承而來,包含了偵錯程式的鉤子和一些和除錯相關的功能。你可以重寫它的相關函式。
然後建立一個鉤子類物件,獲取游標所在位置,列舉每一個函式,然後在函式上下斷點,並設定屬性為跟蹤。
將該指令碼儲存為文字,且命名為 get_path.py
③開啟PDB檔案,選擇偵錯程式為本地除錯。然後從 檔案->Script file... 載入get_path.py指令碼。等幾秒鐘,斷點就設定好了。
④ F9 執行偵錯程式,就可以看到有斷點命中了。並且在輸出窗口裡有log資訊。
⑤ 你可以將在關鍵動作觸發前的命中的函式的斷點全部去除(可重斷點窗口裡手動刪除)。然後觸發你想跟蹤的功能。
這樣輸出窗口裡的命中函式就是你需要重點分析的函數了。
附指令碼:
from idaapi import *
class FuncPath(DBG_Hooks):
# Our breakpoint handler
def dbg_bpt(self, tid, ea):
print "[*] Hit: 0x%08x" % ea
return 1
# Add our function coverage debugger hook
debugger = FuncPath ()
debugger.hook()
current_addr = ScreenEA()
# Find all functions and add breakpoints
for function in Functions(SegStart( current_addr ), SegEnd( current_addr )):
AddBpt( function )
SetBptAttr( function, BPTATTR_FLAGS, BPT_ENABLED|BPT_TRACE)
num_breakpoints = GetBptQty()
print "[*] Set %d breakpoints." % num_breakpoints