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

时间:2019-07-12 22:18:30

标签: 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标志只会返回地址。当我发出该命令时,WinDbg会回复

  

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

如果我忽略了-1,它将找到两个匹配项。

我在这里做什么错了?

条件

我认为情况不符合我想要的方式。我想查看从place开始的第三个双字,即place + 8,并验证它是否小于5000(十进制)。 .foreach中的.if没有显示有意义的位置值(即搜索返回的地址)。我认为它首先是解引用位置,然后将该整数的值与5000进行比较。我如何看待*(int*)(place+8)的值?

文档?

文档对我没有太大帮助。他们只有稀疏的示例,没有一个与我需要的相对应。 除了MS的硬件开发中心以外,还有更好的文档吗?

2 个答案:

答案 0 :(得分:1)

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

  

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

为了从该地址读取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%x\n", ${place}, dwo(${place}+8) } }
0xba0000 = 0x9
0xba1000 = 0x9

答案 1 :(得分:1)

您可以开始编写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”的第三次出现,后跟Rich字符串

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:
相关问题