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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章