【问题标题】:Searching memory including unknown values搜索包含未知值的内存
【发布时间】:2014-01-06 13:59:10
【问题描述】:

在 WinDbg 中,我可以使用 s 命令在内存中搜索字节,例如

s 0012ff40 L?2000 48 65 6c 6c 6f

还有没有办法在搜索序列中包含未知字节,例如

s 0012ff40 L?2000 48 65 ?? ?? ?? 6c 6f

?? 是一个任意值的字节?

想法

如何做 ((memory XOR 48 65 00 00 00 6c 6f) AND FF FF 00 00 00 FF FF) 并将其与 00 00 00 00 00 00 00 进行比较?但我也不知道如何在 WinDbg 中做到这一点。

【问题讨论】:

    标签: windbg


    【解决方案1】:

    不确定搜索命令是否支持通配符。但是你可以使用.foreach command,来实现你想要的。

    这是我用来搜索内存模式的示例,例如ff ?? 00

    .foreach (hit {s -[1]b 00007ffabc520000 L100 ff }) {db hit L3; s ${hit}+2 L1 00}
    

    以下是其工作原理的简要说明:

    注意 - 打开来自 windbg 的调试器帮助以获取完整的文档。那是在 Windbg 中,帮助 |内容

    {s -[1]b 00007ffabc520000 L100 ff }
    

    将 -[1] 标志与 s 一起使用,以便仅给出内存地址作为输出。

    s ${hit}+2 L1 00
    

    对于每次命中,将该内存地址传递给下一个搜索命令。将内存增加您要跳过的字节数并提及搜索模式的最后一部分。

    db hit L3
    

    从具有模式开头的内存中,转储整个长度。这只是为了确认我们得到了正确的结果!

    希望这会有所帮助。如果您需要进一步澄清,我也可以尝试提供。

    【讨论】:

    • 谢谢,我会试一试,但如果使用多个通配符(如AA ?? BB ?? CC ?? DD)搜索内存,这似乎变得过于复杂了
    • 是的,我同意。这更像是一种变通方法,而不是完美的解决方案:)
    • @ThomasWeller - 您是否碰巧找到了更好的解决方案?我希望你能像这样搜索s -d 0x0 L?FFFFFFFF b33d????
    • @LievenKeersmaekers:我也是 :-) 如果我设法设置 pykd,我可能会用 pykd 来做。但有时,pykd 对我来说失败了,如果是这样的话,修复它真的需要很长时间。我还没有为此目的编写 pykd 脚本。
    • @LievenKeersmaekers:最后,我写了一个 pykd 脚本。当然还不完美,目前只支持字节,不支持双字。仅输出第一次出现等。在此处查看另一个答案。
    【解决方案2】:

    我们可以使用 来实现这一点。查找来自PyKD WikiPyKD Downloads 的下载链接。使用 WinDbg Preview 时,将 DLL 复制到

    %LOCALAPPDATA%\DBG\EngineExtensions
    

    对于 64 位或

    %LOCALAPPDATA%\DBG\EngineExtensions32
    

    对于 32 位。

    由于这只是 WinDbg 扩展,因此您还需要 Python 模块:

    pip install pykd
    

    利用 Python 的强大功能完成 WinDbg 无法完成的工作。将以下脚本保存在适合 WinDbg 的位置,即没有空格的短路径中。

    from pykd import *
    import sys
    import re
    import struct
    
    if len(sys.argv)<4:
        print("Wildcard search for memory")
        print("Usage:", sys.argv[0], "<address> <length> <pattern> [-v]", sep=" ")
        print("      <address>: Memory address where searching begins.")
        print("                 This can be a WinDbg expression like ntdll!NtCreateThreadEx.")
        print("      <length> : Number of bytes that will be considered as the haystack.")
        print("      <pattern>: Bytes that you're looking for. May contain ?? for unknown bytes.")
        print("      [-v]     : (optional) Verbose output")
        print()
        print("Examples:")
        print("     ", sys.argv[0], "00770000 L50 01 02 03 ?? 05")
        print("         will find 01 02 03 04 05 or 01 02 03 FF 05, if present in memory")
        sys.exit(0)
    
    verbose = False
    if sys.argv[-1][0:2] == "-v":
        verbose = True
    
    if verbose:
        for n in range(1, len(sys.argv)):
            print(f"param {n}: " + sys.argv[n])
    
    address = expr(sys.argv[1])
    if verbose: print("Start address:", "0x{:08x}".format(address), sep=" ")
    
    length = sys.argv[2]
    length = length.replace("L?","") # consider large address range syntax
    length = length.replace("L","") # consider address range syntax
    length = expr(length)
    if verbose: print("Length:", "0n"+str(length), "bytes", sep=" ")
    
    regex = b""
    for n in range(3, len(sys.argv) - 1 if verbose else 0):
        if sys.argv[n] == "??":
            regex += bytes(".", "ascii")
        else:
            char = struct.pack("B", expr(sys.argv[n]))
            if char == b".":
                regex += struct.pack("B", ord("\\"))
            regex += char
    if verbose: print("Regex:", regex, sep=" ")
    
    memorycontent = loadBytes(address, length)
    if verbose: print("Memory:", memorycontent, sep=" ")
    
    result = re.search(regex, bytes(memorycontent))
    print("Found:", ' '.join("0x{:02x}".format(x) for x in result.group(0)), "at address", "0x{:08x}".format(address+result.start()))
    

    脚本为 Bytes 对象构造 Regex。它使用. 作为通配符并将文字. 转义为\.

    让我们在 WinDbg 中准备一个合适的示例:

    0:006> .dvalloc 1000
    Allocated 1000 bytes starting at 00900000
    0:000> eu 0x00900000 "Test.with.regex"
    0:000> db 0x00900000 L0n30
    00900000  54 00 65 00 73 00 74 00-2e 00 77 00 69 00 74 00  T.e.s.t...w.i.t.
    00900010  68 00 2e 00 72 00 65 00-67 00 65 00 78 00        h...r.e.g.e.x.
    

    加载 PyKD 扩展,这样我们就可以运行脚本了:

    0:006> .load pykd
    

    并运行脚本:

    0:000> !py d:\debug\scripts\memwild.py 00900000 L10 2e ?? 77
    Found: 0x2e 0x00 0x77 at address 0x00900008
    

    【讨论】:

      【解决方案3】:

      如果搜索范围不是很大,您可以将十六进制转储复制/粘贴到 sublime 文本中,然后在启用正则表达式模式的情况下进行查找。例如,我正在寻找 (1200

      add esp, X
      ret
      

      在崇高的文本中,我使用正则表达式 81 c4 .. .. .. 00 c3 搜索并找到了一个带有说明的地址

      add esp,600h
      ret
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        相关资源
        最近更新 更多