Windbg 寄存器值上的断点

GBI*_*GBI 6 debugging x86 assembly windbg reverse-engineering

我想在某个寄存器上放置一个断点,只要该寄存器保存指定的值,该断点就会触发。

在以下示例中:

mov eax,10
mov ebx,12
inc eax
dec eax
Run Code Online (Sandbox Code Playgroud)

伪代码:

bp @eax=0x10 
Run Code Online (Sandbox Code Playgroud)

我想在第 1 行和第 4 行处中断。

注意:我不想只在某个地址上创建断点。

Tho*_*ler 2

对于某些内存地址的中断,WinDbg 会从 CPU 获得帮助。

正如微软所说

有关如何在特定处理器上处理这种情况的详细信息,请参阅处理器架构[原文如此!]手册并查找“调试寄存器”或“调试控制寄存器”。

因此,WinDbg 使用调试寄存器 DR0 到 DR3作为 x86 计算机上的数据断点。

我不太熟悉Intel CPU 架构文档的 4800 页,但我怀疑是否有对寄存器断点的硬件支持。

所以,如果没有硬件支持,并不意味着不能用软件来完成。然而,这基本上意味着您的程序将是单步执行的,并且在每条指令之后都会检查寄存器值。这会变得非常慢。

虽然您可以使用命令指定命令p,但请注意,它将跳过call指令,这可能不是您想要的。

因此,如果这不是XY 问题,您可能需要再考虑一下。您认为解决方案是寄存器断点。但是有什么问题需要解决,您认为寄存器断点可以解决这个问题呢?在我使用 WinDbg 进行调试的 14 年中,我从来不需要中断特定的寄存器值。