首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包含未知值的内存搜索

包含未知值的内存搜索
EN

Stack Overflow用户
提问于 2014-01-06 13:59:10
回答 3查看 8.5K关注 0票数 9

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

代码语言:javascript
运行
复制
s 0012ff40 L?2000 48 65 6c 6c 6f

是否也有一种方法在搜索序列中包含未知字节,例如

代码语言:javascript
运行
复制
s 0012ff40 L?2000 48 65 ?? ?? ?? 6c 6f

其中??是一个具有任意值的字节?

Idea

做(内存、异或、48 65 00 00 00 6c 6fFF FF 00 00 00 FF FF)并与00 00 00 00 00 00 00进行比较如何?但我也不知道如何在WinDbg中做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-02 17:59:15

我们可以使用皮克来实现这一点。查找从PyKD维基PyKD下载链接的下载。使用WinDbg预览时,将DLL复制到

代码语言:javascript
运行
复制
%LOCALAPPDATA%\DBG\EngineExtensions

为64位或

代码语言:javascript
运行
复制
%LOCALAPPDATA%\DBG\EngineExtensions32

就32点。

因为这只是WinDbg扩展,所以您还需要Python模块:

代码语言:javascript
运行
复制
pip install pykd

使用Python的强大功能来完成WinDbg无法完成的任务。将以下脚本保存在WinDbg的一个好位置,即在没有空格的短路径中。

代码语言:javascript
运行
复制
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中准备一个适当的示例:

代码语言:javascript
运行
复制
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扩展,这样我们就能够运行脚本了:

代码语言:javascript
运行
复制
0:006> .load pykd

然后运行脚本:

代码语言:javascript
运行
复制
0:000> !py d:\debug\scripts\memwild.py 00900000 L10 2e ?? 77
Found: 0x2e 0x00 0x77 at address 0x00900008
票数 1
EN

Stack Overflow用户

发布于 2014-01-07 08:13:43

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

下面是我用来搜索内存模式(如ff ?? 00 )的一个示例

代码语言:javascript
运行
复制
.foreach (hit {s -[1]b 00007ffabc520000 L100 ff }) {db hit L3; s ${hit}+2 L1 00}

以下是对其工作方式的简要描述:

注-打开调试器帮助从windbg获得完整的文档。在Windbg中,Help =Content

代码语言:javascript
运行
复制
{s -[1]b 00007ffabc520000 L100 ff }

使用带有s的-1标志,以便只给出内存地址作为输出。

代码语言:javascript
运行
复制
s ${hit}+2 L1 00

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

代码语言:javascript
运行
复制
db hit L3

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

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

票数 6
EN

Stack Overflow用户

发布于 2017-03-19 04:31:04

如果搜索范围不是非常大,您可以将十六进制转储复制/粘贴到崇高文本中,只需启用regex模式就可以查找。例如,我正在寻找(1200

代码语言:javascript
运行
复制
add esp, X
ret

在崇高的文本中,我使用regex 81 c4 .. .. .. 00 c3搜索并找到了一个地址,其中包含

代码语言:javascript
运行
复制
add esp,600h
ret
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20951573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档