如何遍历字节字符串的搜索结果并偏移结果指针(在 WinDbg 中)?



我正在尝试在 WinDbg 中搜索任意长的字节字符串,如果附近的整数满足某些条件,则打印出地址。

伪寄存器 $t 0 包含我要搜索的起始地址。

这是基于Windows文档的东西,也许可以工作(尽管它显然不能)。

.foreach (place { s -[1] @$t0 L?30000 00 00 00 00  00 20 00 00 }) { .if ( (place +0x8) <= 0x1388) { .printf "0x%xn", place } }

搜索

首先,搜索命令不能正常工作。我只想要匹配的地址(而不是数据)。

s -[1] @$t0 L?30000 00 00 00 00  00 20 00 00 

文档说1标志只会返回地址。当我发出该命令时,WinDbg 回复

^ 's -1 @$t 0 L?30000 00 00 00 00 00 20 00 00 ' 中的语法错误

如果我省略-1,它会找到两个匹配项。

我在这里做错了什么?

条件

我不认为这种情况按照我想要的方式行事。我想查看从place开始的第三个 dword,即 place+8,并验证它是否小于 5000(十进制)。.foreach 中的 .if 没有打印有意义的地点值(即从搜索返回的地址)。我认为它首先取消引用位置并将该整数的值与 5000 进行比较。我如何看待*(int*)(place+8)的价值?

文档?

文档对我没有多大帮助。他们只有稀疏的例子,没有一个符合我需要的。 除了 MS 的硬件开发人员中心之外,还有其他更好的文档吗?

你可以开始编写JavaScript,以获得更清晰的脚本编写方式

老路

0:000> s -b vect l?0x1000 4d
00007ff7`8aaa0000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............
00007ff7`8aaa00d4  4d 90 80 d2 df f9 82 d3-4d 90 80 d2 52 69 63 68  M.......M...Rich
00007ff7`8aaa00dc  4d 90 80 d2 52 69 63 68-4c 90 80 d2 00 00 00 00  M...RichL.......
0:000> s -[1]b vect l?0x1000 4d
0x00007ff7`8aaa0000
0x00007ff7`8aaa00d4
0x00007ff7`8aaa00dc

使用 JavaScript

function search(addr,len)
{
var index = []
var mem = host.memory.readMemoryValues(addr,len)
for(var i = 0; i < len; i++)
{
if(mem[i] == 0x4d)
{
index.push(addr+i)    
}
}
return index
}

执行将返回您可以进一步操作的地址

0:000> dx -r1 @$scriptContents.search(0x00007ff78aaa0000,1000)
@$scriptContents.search(0x00007ff78aaa0000,1000)                 : 140701160046592,140701160046804,140701160046812
length           : 0x3
[0x0]            : 0x7ff78aaa0000
[0x1]            : 0x7ff78aaa00d4
[0x2]            : 0x7ff78aaa00dc

稍微改进脚本以根据第一个结果
找到一些东西,我们将尝试找到字符"M">后面的Rich 字符串的索引

修改后的脚本

function search(addr,len)
{
var index = []
var Rich = []
var result = []
var mem = host.memory.readMemoryValues(addr,len)
for(var i = 0; i < len; i++)
{
if(mem[i] == 0x4d)
{
index.push(addr+i)
var temp = host.memory.readMemoryValues(addr+i+4,1,4)
host.diagnostics.debugLog(temp +"t")
if(temp == 0x68636952)
{
Rich.push(addr+i)
}
}
}
result.push(index)
result.push(Rich)
return result
}

结果只有字符"M"的第三次出现后跟富字符串

0:000> dx -r2 @$scriptContents.search(0x00007ff78aaa0000,1000)
3   3548576223  1751345490  @$scriptContents.search(0x00007ff78aaa0000,1000)                 : 140701160046592,140701160046804,140701160046812,140701160046812
length           : 0x2
[0x0]            : 140701160046592,140701160046804,140701160046812
length           : 0x3
[0x0]            : 0x7ff78aaa0000
[0x1]            : 0x7ff78aaa00d4
[0x2]            : 0x7ff78aaa00dc
[0x1]            : 140701160046812
length           : 0x1
[0x0]            : 0x7ff78aaa00dc
0:000> s -b vect l?0x1000 4d
00007ff7`8aaa0000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............
00007ff7`8aaa00d4  4d 90 80 d2 df f9 82 d3-4d 90 80 d2 52 69 63 68  M.......M...Rich
00007ff7`8aaa00dc  4d 90 80 d2 52 69 63 68-4c 90 80 d2 00 00 00 00  M...RichL.......

   

load the extensension jsprovider.dll.load jsprovider
编写一个脚本说 foo.js加载脚本 .scriptload ...\path\foo.js

执行你用dx @$scriptContents.myfunc(myargs) 编写的 js中的任何函数

请参阅下文,使用CDB只是为了便于复制粘贴Windbg按原样工作

F:>type mojo.js
function hola_mojo ()
{
host.diagnostics.debugLog("hola mojo this is javascript n")
}
F:>cdb -c ".load jsprovider;.scriptload .mojo.js;dx @$scriptContents.hola_mojo();q" cdb | f:usrbingrep.exe -A 6 -i reading
0:000> cdb: Reading initial command '.load jsprovider;.scriptload .mojo.js;dx @$scriptContents.hola_mojo();q'
JavaScript script successfully loaded from 'F:mojo.js'
hola mojo this is javascript
@$scriptContents.hola_mojo()
quit:

如果我阅读文档的这一部分

s [-[[Flags]Type]] Range Pattern

正确,在指定标志时不能遗漏Type。那是因为标志在两个方括号内。否则,它会被标记为s [-[Flags][Type]] Range Pattern.

考虑到这一点,该示例有效:

0:000> .dvalloc 2000
Allocated 2000 bytes starting at 00ba0000
0:000> eb 00ba0000 01 02 03 04 05 06 07 08 09
0:000> eb 00ba1000 01 02 03 04 05 06 07 08 09
0:000> s -[1]b 00ba0000 L?2000 01 02 03 04 05 06 07 08
0x00ba0000
0x00ba1000

另请注意,您将有一个隐藏的错误用于使用place:它应该是${place}的。默认情况下,这将适用于地址(为了便于在 SO 上读取的换行符):

0:000> .foreach (place {s -[1]b 00ba0000 L?2000 01 02 03 04 05 06 07 08 }) 
{ .if ( (${place} +0x8) < 0xba1000) { .printf "0x%xn", ${place} } }
0xba0000

要从该地址读取 DWord,请使用dwo()MASM 输出器(换行符以提高 SO 的可读性):

0:000> .foreach (place {s -[1]b 00ba0000 L?2000 01 02 03 04 05 06 07 08 }) 
{ .if ( (dwo(${place} +0x8)) < 0xba1000) 
{ .printf "0x%x = 0x%xn", ${place}, dwo(${place}+8) } }
0xba0000 = 0x9
0xba1000 = 0x9

最新更新