如何遍历字节字符串的搜索结果并偏移结果指针(在 WinDbg 中)?
How do loop over the search results for a byte string and offset the resultant pointer (in WinDbg)?
我试图在 WinDbg 中搜索任意长的字节字符串,如果附近的整数满足某些条件,则打印出地址。
伪寄存器$t0包含我要查找的起始地址
这是基于 Windows docs 的一些东西,也许可以工作(尽管它显然没有)。
.foreach (place { s -[1] @$t0 L?30000 00 00 00 00 00 20 00 00 }) { .if ( (place +0x8) <= 0x1388) { .printf "0x%x\n", place } }
搜索
首先,搜索命令不太正确。我只想要比赛的地址(不是数据)。
s -[1] @$t0 L?30000 00 00 00 00 00 20 00 00
文档说 1
标志只会 return 地址。当我发出该命令时,WinDbg 回复
^ Syntax error in 's -1 @$t0 L?30000 00 00 00 00 00 20 00 00 '
如果我省略 -1
,它会找到两个匹配项。
我做错了什么?
条件
我不认为这种情况符合我的要求。我想查看从 place
开始的第三个双字,即 place+8,并验证它是否小于 5000(十进制)。 .foreach 中的 .if 没有为 place 打印有意义的值(即来自搜索的地址 returned)。我认为首先是取消引用并将该整数的值与 5000 进行比较。我如何查看 *(int*)(place+8)
?
的值
文档?
文档对我帮助不大。他们只有稀疏的例子,none 其中符合我需要的。
除了 MS 的硬件开发中心之外,还有更好的文档吗?
如果我阅读了这部分文档
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%x\n", ${place} } }
0xba0000
为了从该地址读取一个双字,使用 dwo()
MASM 运算符(为了便于阅读而换行):
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%x\n", ${place}, dwo(${place}+8) } }
0xba0000 = 0x9
0xba1000 = 0x9
您可以开始编写 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
}
执行将 return 地址,您可以进一步操作
0:000> dx -r1 @$scriptContents.search(0x00007ff78aaa0000,1000)
@$scriptContents.search(0x00007ff78aaa0000,1000) : 140701160046592,140701160046804,140701160046812
length : 0x3
[0x0] : 0x7ff78aaa0000
[0x1] : 0x7ff78aaa00d4
[0x2] : 0x7ff78aaa00dc
稍微改进脚本以根据第一个结果找到内容
我们将尝试在 字符 'M'
之后找到富字符串 的 索引
修改脚本
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" 后跟 Rich string
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:\usr\bin\grep.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:
我试图在 WinDbg 中搜索任意长的字节字符串,如果附近的整数满足某些条件,则打印出地址。
伪寄存器$t0包含我要查找的起始地址
这是基于 Windows docs 的一些东西,也许可以工作(尽管它显然没有)。
.foreach (place { s -[1] @$t0 L?30000 00 00 00 00 00 20 00 00 }) { .if ( (place +0x8) <= 0x1388) { .printf "0x%x\n", place } }
搜索
首先,搜索命令不太正确。我只想要比赛的地址(不是数据)。
s -[1] @$t0 L?30000 00 00 00 00 00 20 00 00
文档说 1
标志只会 return 地址。当我发出该命令时,WinDbg 回复
^ Syntax error in 's -1 @$t0 L?30000 00 00 00 00 00 20 00 00 '
如果我省略 -1
,它会找到两个匹配项。
我做错了什么?
条件
我不认为这种情况符合我的要求。我想查看从 place
开始的第三个双字,即 place+8,并验证它是否小于 5000(十进制)。 .foreach 中的 .if 没有为 place 打印有意义的值(即来自搜索的地址 returned)。我认为首先是取消引用并将该整数的值与 5000 进行比较。我如何查看 *(int*)(place+8)
?
文档?
文档对我帮助不大。他们只有稀疏的例子,none 其中符合我需要的。 除了 MS 的硬件开发中心之外,还有更好的文档吗?
如果我阅读了这部分文档
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%x\n", ${place} } }
0xba0000
为了从该地址读取一个双字,使用 dwo()
MASM 运算符(为了便于阅读而换行):
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%x\n", ${place}, dwo(${place}+8) } }
0xba0000 = 0x9
0xba1000 = 0x9
您可以开始编写 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
}
执行将 return 地址,您可以进一步操作
0:000> dx -r1 @$scriptContents.search(0x00007ff78aaa0000,1000)
@$scriptContents.search(0x00007ff78aaa0000,1000) : 140701160046592,140701160046804,140701160046812
length : 0x3
[0x0] : 0x7ff78aaa0000
[0x1] : 0x7ff78aaa00d4
[0x2] : 0x7ff78aaa00dc
稍微改进脚本以根据第一个结果找到内容
我们将尝试在 字符 'M'
修改脚本
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" 后跟 Rich string
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)
请参阅下文使用 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:\usr\bin\grep.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: