在64位系统中扫描内存?

3
不久前我用C#创建了一个内存扫描器,它会读取进程的内存并查找某些值(例如整数42出现的每个位置)。此后,我重访这个项目,并试图设计它以在 64 位系统中运行。我遇到的问题是,64 位进程被授予多达8TB的虚拟内存(相比之下,在32位系统上只有2-4GB)!至少对于我的代码来说,在合理的时间内扫描0-8TB范围内的每个地址是不可能的。
我尝试从Process.MainModule.BaseAddress开始扫描,但我不知道在哪里停止阅读,我肯定会错过重要的值。如何缩小范围,以便可以扫描实际使用的进程范围?

4
你需要获取该进程的内存映射表。搜索“进程内存映射表”即可开始。 - David Heffernan
我曾经搜索过进程内存映射和类似的术语,但我能找到的只有关于页面和虚拟内存工作原理的解释。这是有用的信息,但并没有真正指出如何创建或查看外部进程的内存映射。不过,这确实引导我去研究其他探索进程虚拟内存的方法。 - user1881066
扫描内存地址空间并调用 VirtualQueryEx 是构建进程内存映射的方法。 - David Heffernan
1个回答

2
我最终通过使用VirtualQueryEx库方法找到了哪些内存部分或虚拟页面正在被使用。我使用此函数创建了自己的"内存映射",并确定了已使用和可访问的页面。Pinvoke在这里提供了一个很好的示例: PInvoke文章 通过查看标记为MEM_COMMIT的虚拟内存部分,并确保权限不包括PAGE_GUARD,我能够找到必要的与可读相关的内存块。

1
你能添加一些示例代码,然后接受自己的答案吗? :) - Orwellophile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接