当到达地址中断(ba)断点时,检查windbg中的数据

当到达地址中断(ba)断点时,检查windbg中的数据,windbg,breakpoints,Windbg,Breakpoints,我想创建一个断点,这样它将创建另一个一次性断点,在写入某个内存时,该断点将“dd”某个内存地址 因此,当遇到断点时,我希望运行如下命令: ba w4 @ESP+4 /1 ''dd [memory address of this breakpoint]'' 由于此断点是由另一个断点创建的(可能会被多次调用),因此无法指定断点编号。否则,我可以使用类似“$bp3”的伪寄存器来获取断点3的内存地址 有没有人想过如何创建一个断点命令来“dd”断点的内存地址 谢谢大家! 您可以详细说明如何使用其他通

我想创建一个断点,这样它将创建另一个一次性断点,在写入某个内存时,该断点将“dd”某个内存地址

因此,当遇到断点时,我希望运行如下命令:

  ba w4 @ESP+4 /1 ''dd [memory address of this breakpoint]''
由于此断点是由另一个断点创建的(可能会被多次调用),因此无法指定断点编号。否则,我可以使用类似“$bp3”的伪寄存器来获取断点3的内存地址

有没有人想过如何创建一个断点命令来“dd”断点的内存地址


谢谢大家!

您可以详细说明如何使用其他通用伪寄存器:t0..t19

bp your-address "r$t1=your-other-address; ba w4 @$t1 /1 \"dd @$t1;gc\""

如果您知道将不会定义多个“child”
ba
断点,则可以通过将“controlling”断点的命令设置为:

ba1 w4 /1 @esp+4 "dd @$bp1"
也就是说,指定应该分配给这个新断点的断点编号,并且该断点的伪寄存器仍然在断点的命令中定义

但是,如果您认为控制断点将被多次命中,并且希望定义多个
ba
断点,那么显然是行不通的,因为每次只会重新定义“断点1”。但你仍然可以做到

诀窍是使控制断点的命令实际包含文本地址文本,而不是尝试通过伪寄存器。你可以用文本别名来做

为控制断点尝试以下操作:

bu @WHATEVER "aS /x ${/v:baaddy} @esp+4; .block{ ba w4 /1 baaddy \"dd baaddy\"; ad ${/v:baaddy} }"
命中控制断点时,会发生以下情况:

  • 为文本“baaddy”设置别名,其值为计算表达式
    @esp+4
  • .block
    确保别名扩展用于以下内容
  • alias解释器随后将扩展块内出现的所有“baaddy”,除了
    ad
    命令中出现的“baaddy”(由于/v开关)
  • 因此,如果
    @esp+4
    的值为
    0x1234
    ,则访问断点命令实际上变成:
    ba w4/1 0x1234\“dd 0x1234\”
    ,实际地址嵌入其中
  • 然后删除文本别名
重要的是要在末尾或下次点击此控制断点时删除文本别名,别名扩展将在
aS
命令之前进行,并且“baaddy”将使用以前的值进行扩展。这也意味着这篇文章
别名在您第一次设置控制断点的命令时不存在。

如果“您的地址”断点被命中两次(在“您的其他地址”被命中之前),这会改变$t1的值并导致两个一次性断点在同一地址上都被dd@$t1吗?非常感谢。在这种情况下,将断点保持在最小值。知道“您的地址”上有一个,它还可以重置所有其他bps。在其条件下使用类似“bc1-10”(前提是“您的地址”在bp0上!)的东西来清除最后10个尚未命中的断点。或者,您可以将$t1设置为0(以确保;o),并在单次触发bp中将其重置为0。然后简单地测试0(或其他值),仅在满足特定条件(如0)时创建新的单次激发bp。