Windbg 条件记忆搜索

Windbg conditional memory search

当寄存器中的地址指向具有某种模式的内存块并且该模式未固定为偏移量时,我需要在调试器 windbg 中设置断点 像

bp ws2_32!sendto "j s @rdx @rdx+100 53 65 6e 64 g"

这个条件怎么写才合适? 所以我只需要在 rdx 和 rdx+100 内的地址范围内中断 sendto 有这个模式 53 65 6e 64

bp ws2_32!sendto ".if(s @rdx @rdx+100 53 65 6e 64) == 0 { g }" error too

问题是 s 没有构成有效条件。它要么打印结果,要么不打印。

演示准备

2:007> .dvalloc 1000
Allocated 1000 bytes starting at 003b0000

2:007> eb 003b0000 53 65 6e 64

2:007> db 003b0000 L10
003b0000  53 65 6e 64 00 00 00 00-00 00 00 00 00 00 00 00  Send............

使用s

的测试
2:007> s-a 003b0000 L100 "Send"
003b0000  53 65 6e 64 00 00 00 00-00 00 00 00 00 00 00 00  Send............

2:007> s-a 003b0000 L100 "Test"

您可以在 s 的输出上使用 .foreach。它将运行输出中每个单词的命令,太多了:

2:007> .foreach (output {s-a 003b0000 L100 "Send"}) { .echo "found" }
found
found
found
found
[...]

所以让我们利用这个事实 s 有一个只输出地址的特殊选项

2:007> .foreach (output {s-[1]a 003b0000 L100 "Send"}) { .echo "found" }
found

目前我无法用你的断点进行重现,但它应该看起来像

bp ws2_32!sendto ".foreach (output {s-[1]a @rdx L100 "Send"}) { g }"

这在搜索字节而不是 ASCII 字符串以及使用寄存器而不是地址时也应该有效

2:007> r eax = 003b0000

2:007> .foreach (output {s-[1]b @eax L100 53 65 6e 64}) { .echo "found" }
found