如何使用 IDApython 设置断点并获取寄存器的值
逆向工程
艾达
调试
蟒蛇
调试器
idapro插件
2021-06-25 08:31:53
1个回答
我可以想到两种方法来实现这一点:
- 使用
RunTo
. - 设置断点,挂钩调试器事件并实现
dbg_bpt
1. 使用 RunTo
这几乎是微不足道的,但不会提供与第二种方法相同的控制量。如果这就是您所追求的,那么对于快速而肮脏的解决方案可能会更好。
调用idc.RunTo(ea)
将执行该过程,直到ea
达到 ,允许您然后调用idc.GetRegValue(name)
以获取 的值EAX
。
某些条件(如抛出异常或命中不同的断点)将导致RutTo
在ea
达到所提供的之前返回。然后你可以打电话idc.GetDebuggerEvent
弄清楚发生了什么,但如果你要这样做,我建议切换到第二种方法。
RunTo
如果没有正在运行的进程,Note也会启动一个进程。
2.设置断点,挂钩调试器事件并实现 dbg_bpt
这是更安全的方法,也是我推荐的方法,虽然更难实现,但它允许正确处理其他断点和更多控制。
为此,您必须做三件事:
- 在给定地址设置断点。
- 监视断点的触发器。
- 并最终采取行动。
在给定地址设置断点
实现这一点的最基本方法是调用idc.AddBpt(ea)
,它会在该地址处设置一个软件执行断点。
您可以使用的其他方法包括:
idc.AddBptEx(ea, size, bpttype)
对您创建的断点类型有更多的控制。idc. SetBptAttr(address, bptattr, value)
设置断点的可用属性。idc.SetBptCnd(ea, cnd)
/idc. SetBptCndEx(ea, cnd, is_lowcnd)
设置断点的触发条件。
阅读文档以了解确切的细节。
监控断点的触发器
为此,您需要安装一个 Debugger Hooking 类(任何继承 的类idaapi.DBG_Hooks
),它实现了dbg_bpt(tid, ea)
描述断点触发的线程 id 和线性地址的方法。返回 0 fromdbg_bpt
应该可以防止 IDA 通知用户它被触发(假设您将在内部处理它)。
您必须实例化您的类并调用实例Hook
和Unhook
方法才能使其实际运行。请注意,最好在创建断点之前安装钩子。
并最终采取行动
在调试器运行时,您可以调用idc.GetRegValue(name)
提供寄存器名称来接收它当时的即时值。
其它你可能感兴趣的问题