使用IDAPYTHON跟踪程序执行路径-未加壳

来源:互联网 发布:js实现放大图片预览 编辑:程序博客网 时间:2024/06/11 04:16

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 hookdebugger = FuncPath ()debugger.hook()current_addr = ScreenEA()# Find all functions and add breakpointsfor 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


0 0