Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在字节字符串的搜索结果上循环并偏移结果指针(在WinDbg中)?_Windbg - Fatal编程技术网

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

如何在字节字符串的搜索结果上循环并偏移结果指针(在WinDbg中)?,windbg,Windbg,我试图在WinDbg中搜索任意长的字节字符串,如果附近的整数符合某些条件,则打印出地址 伪寄存器$t0包含我要搜索的起始地址 这是一个可能有效的方法(尽管它显然不起作用) 文档说明1标志将只返回地址。当我发出该命令时,WinDbg会回复 ^'s-@$t0 L?3000000 200000'中的语法错误 如果省略-1,它会找到两个匹配项 我做错了什么 条件 我认为情况不是我想要的那样。我想查看从位开始的第三个dword,即+8位,并验证它是否小于5000(十进制)。.foreach中的.if没有为

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

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

这是一个可能有效的方法(尽管它显然不起作用)

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

^'s-@$t0 L?3000000 200000'中的语法错误

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

我做错了什么

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

文档 医生们帮不了我多少忙。他们只有稀疏的例子,没有一个符合我的需要。
除了微软的硬件开发中心,还有更好的文档吗?

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

s[-[[Flags]Type]]范围模式

正确地说,在指定标志时不能省略
类型
。这是因为国旗在两个方括号内。否则它将被标注为
s[-[Flags][Type]]范围模式

考虑到这一点,示例可以工作:

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
,您将有一个隐藏的bug:它应该是
${place}
。默认情况下,这将与地址一起使用(为便于阅读,请在SO上换行):


您可以开始编写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
}
稍微改进脚本,根据第一个结果找到一些内容
我们将尝试查找紧跟在字符“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
}

加载extensension jsprovider.dll
。加载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中使用JavaScript?加载jsprovider扩展编写脚本加载并执行您编写的js函数我编辑了文章以添加一些细节看看为什么我从来不知道这一点?我从未注意到基本WinDbg文档引用的是任何其他命令语言,而不是内置的神秘命令语言。
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
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
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
}
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.......
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: