我该如何设置断点并使用IDApython获取EAX寄存器的值?获取文本形式的00b27223寄存器的值。

#1 楼

我可以想到两种方法来实现此目的:


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


1。使用RunTo


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

调用idc.RunTo(ea)将执行该过程,直到达到ea,然后再调用idc.GetRegValue(name)即可获取值。 EAX的值。

某些条件(例如引发异常或击中其他断点)将导致RutTo在到达提供的ea之前返回。然后,您可以致电idc.GetDebuggerEvent找出发生了什么,但是如果您要这样做,我建议您切换到第二种方法。 br />
2。设置断点,挂接调试器事件并实现RunTo


这是更安全的方法,这是我推荐的方法,而更难于实现的方法则可以正确处理其他断点和更多控制。 />为此,您必须做三件事:


在给定地址处设置断点。
监视断点的触发器。
/>,然后对其执行操作。

在给定地址处设置断点

实现此目的的最基本方法是调用dbg_bpt,该代码在执行时设置软件

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



idc.AddBpt(ea)可以更好地控制要创建的断点的类型。

idc.AddBptEx(ea, size, bpttype)设置断点的可用属性。

idc. SetBptAttr(address, bptattr, value) / idc.SetBptCnd(ea, cnd)设置断点的触发条件。

有关详细信息,请阅读文档。 。

显示器监控他断点的触发器

为此,您需要安装Debugger Hooking类(任何继承idc. SetBptCndEx(ea, cnd, is_lowcnd)的类),该类实现idaapi.DBG_Hooks方法,该方法描述触发断点的线程ID和线性地址。从dbg_bpt(tid, ea)返回0应该会阻止IDA通知用户它已被触发(假设您将在内部处理它)。真正起作用。请注意,在创建断点之前最好安装钩子。

最后对它进行操作

在调试器运行时,可以调用dbg_bpt提供寄存器名来收到当时的即时价值。