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