创建 IDA Pro 调试器插件 - API 文档和示例?

逆向工程 艾达 调试器 idapro插件
2021-06-15 03:29:41

是否有使用描述 IDA 调试器 API 的 SDK 在 IDA Pro 中开发调试器插件的好资源?这方面的一个例子是Sourceforge 上IDA Pro ARM 调试器插件似乎很少有项目能够做到这一点。具体来说,你如何在 IDA 中制作一个插件,将自己注册为可用的调试器之一,并允许在控制目标的同时单步执行 IDA 数据库?

4个回答

到目前为止,没有一个答案能回答实际问题,所以这里是。

调试器插件与“普通”插件有两点不同:

  1. PLUGIN_DBG在插件的标志中。
  2. 在 init() 中,它必须将全局变量dbg设置为指向debugger_t结构实现的指针参见idd.hpp定义。

例如,请参见plugins/debuggerSDK 以及最近更新的idados插件警告:制作调试器插件不适合胆小的人。

您可以 此处查找C/C++ 中IDA 插件手册

此外,您还可以SecurityTube 的Recon 2008 “BUILDING PLUGINS FOR IDA PRO”观看 IDA-Pro Creator Ilfak Guilfanov 的演讲

还有 IDAPython 也可以创建小型自动化。

idapython套件中debughook.py示例脚本说明了可以由调试器插件处理的所有调试事件。

示例脚本

这是一个非常简单的脚本,当您使用调试器跟踪它们时,它会为所有指令着色。

# Simple script that colorizes all instruction the debugger halts at or
# the user traces with the debugger in yellow. Instruction that are hit
# a ssecond time are colored in red.

from idaapi import *
from idc import *

class Colorizer(DBG_Hooks):

  def __init__(self):
    DBG_Hooks.__init__(self)
    self.locations_ = set()

  def colorize(self, ea):
    if ea in self.locations_:
      SetColor(ea, CIC_ITEM, 0x2020c0)
    else:
      SetColor(ea, CIC_ITEM, 0x80ffff)
      self.locations_.add(ea)

  def dbg_bpt(self, tid, ea):
    self.colorize(ea)
    return 0

  def dbg_step_into(self):
    self.colorize(GetRegValue("eip"))

try:
  if debughook:
    print("Removing previous hook ...")
    debughook.unhook()
except:
  pass

colorizer = Colorizer()
colorizer.hook()

一些笔记

如果在调试器回调之一中从进程内存中读取,则需要先调用 refresh_debugger_memory()(请参阅 idc.py 中 RefreshDebuggerMemory() 的文件注释)。如果可以,请避免打那个电话,因为它有点贵。

您可以通过 idautils 包中的 cpu 实例轻松访问所有寄存器:

print "EAX has the value: %X" % cpu.Eax

要从堆栈顶部读取当前值,请使用类似

print "TOS: %X" % Dword(cpu.Esp)

Chris Eagle的 IDA Pro Book 2nd edition在第 24 章中有一些关于通过 IDC 和 SDK 与调试器交互的信息,但更侧重于自动化。除此之外,可能会阅读正在执行此操作的其他插件的源代码,例如问题中引用的 ARM 调试器插件,并在 SDK 中挖掘 dbg.hpp 以查看它公开的内容。在 SDK 的 plugins/debugger 中似乎还提供了 IDA 调试器插件的源代码。我还没有看到编写专门记录的调试器插件。