IDA Pro:如何在结构域上设置内存断点?

逆向工程 艾达
2021-06-12 14:06:41

如何在结构域上设置内存断点?

目前,如果我将结构映射到内存区域,它会使用结构的起始地址作为所有字段的地址。看屏幕显示

在此处输入图片说明

结果我无法快速向 field 添加断点isHandshakeReceived我需要手动计算它的地址。

有没有更简单的方法?

2个回答

与 IDA 中的大多数输入字段一样,断点对话框的 Location 字段接受像这样的表达式

eax + GetMemberOffset(GetStrucIdByName("foo_t"), "isHandshakeReceived")

我不知道为什么IDA不接受0x376e5f0 + foo_t.isHandshakeReceived......反正能够输入表达式是非常有用的,它可以节省很多麻烦。

错误的地址显示是 IDA 内部管理事物的简单方式的结果。基本上,结构或数组中包含的所有内容都属于其起始地址('head'),如果显示在多行上继续,那么 IDA 只是重新打印起始地址而不是正确的地址。这有点烦人,但这就是 IDA 的工作方式。

PS:也许值得在 IDA 的错误论坛上提交缺陷报告或发帖;毕竟显示的地址肯定是错误的。我不会屏住呼吸,但谁知道...

据我所知 IDA 无法通过并自动识别

按以下方式使用 DbgHook:

class DbgHook(DBG_Hooks):
... snip ...
debugger = DbgHook()
debugger.hook()

使用此类将需要您实现def dbg_bpt(self,tid,ea)回调。当您的代码中出现断点时,将调用此回调。从那里你可以在指令上设置一个断点,将结构的基地址移到寄存器中。您可以使用以下命令在代码中获取该寄存器的值:

from idc import *
structAddr = idc.GetRegValue('EAX')

在您的 dbg_bpt 回调中,您可以计算结构内部的偏移量,并使用SetBptAttr(address, bptattr, value)其中的地址是成员地址(从寄存器计算得出)和值是该地址上的访问断点BPT_RDWR

这里是 IDA Python API 文档,这里是一个很好的示例项目,实现了调试器回调。