如何使用 IDApython 设置断点并获取寄存器的值

逆向工程 艾达 调试 蟒蛇 调试器 idapro插件
2021-06-25 08:31:53

如何设置断点并EAX使用 IDApython获取寄存器的值

我想设置一个断点,例如在 address 处00b27223,并且在执行该特定地址之前的每个中断处,我想以EAX文本形式获取寄存器的值

例子

1个回答

我可以想到两种方法来实现这一点:

  1. 使用RunTo.
  2. 设置断点,挂钩调试器事件并实现 dbg_bpt

1. 使用 RunTo

这几乎是微不足道的,但不会提供与第二种方法相同的控制量。如果这就是您所追求的,那么对于快速而肮脏的解决方案可能会更好。

调用idc.RunTo(ea)将执行该过程,直到ea达到 ,允许您然后调用idc.GetRegValue(name)以获取 的值EAX

某些条件(如抛出异常或命中不同的断点)将导致RutToea达到所提供的之前返回然后你可以打电话idc.GetDebuggerEvent弄清楚发生了什么,但如果你要这样做,我建议切换到第二种方法。

RunTo如果没有正在运行的进程,Note也会启动一个进程。

2.设置断点,挂钩调试器事件并实现 dbg_bpt

这是更安全的方法,也是我推荐的方法,虽然更难实现,但它允许正确处理其他断点和更多控制。

为此,您必须做三件事:

  1. 在给定地址设置断点。
  2. 监视断点的触发器。
  3. 并最终采取行动。

在给定地址设置断点

实现这一点的最基本方法是调用idc.AddBpt(ea),它会在该地址处设置一个软件执行断点。

您可以使用的其他方法包括:

  1. idc.AddBptEx(ea, size, bpttype) 对您创建的断点类型有更多的控制。
  2. idc. SetBptAttr(address, bptattr, value) 设置断点的可用属性。
  3. idc.SetBptCnd(ea, cnd)/idc. SetBptCndEx(ea, cnd, is_lowcnd)设置断点的触发条件。

阅读文档以了解确切的细节。

监控断点的触发器

为此,您需要安装一个 Debugger Hooking 类(任何继承 的类idaapi.DBG_Hooks),它实现了dbg_bpt(tid, ea)描述断点触发的线程 id 和线性地址方法。返回 0 fromdbg_bpt应该可以防止 IDA 通知用户它被触发(假设您将在内部处理它)。

您必须实例化您的类并调用实例HookUnhook方法才能使其实际运行。请注意,最好在创建断点之前安装钩子。

并最终采取行动

在调试器运行时,您可以调用idc.GetRegValue(name)提供寄存器名称来接收它当时的即时值。