1. 程式人生 > >使用IDAPYTHON跟蹤程式執行路徑-未加殼

使用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