3

不久前,我在 C# 中创建了一个内存扫描器,它将读取进程的内存并查找某些值(例如,整数 42 每次出现的位置)。从那以后,我重新审视了这个项目,并试图将其设计为在 64 位系统中工作。我遇到的问题是 64 位进程被授予高达 8TB 的虚拟内存(与 32 位系统上不起眼的 2-4GB 相比)!至少对于我的代码,不可能在任何合理的时间内扫描 0-8TB 范围内的每个地址。

我尝试在 Process.MainModule.BaseAddress 开始扫描,但我不知道在哪里停止阅读,而且我肯定缺少重要的值。如何缩小范围,以便扫描进程实际使用的范围?

4

1 回答 1

2

通过使用 VirtualQueryEx 库方法,我最终弄清楚了正在使用哪些内存部分或虚拟页面。我使用这个函数来创建我自己的“内存映射”并识别已使用和可访问的页面。Pinvoke 在这里有一个很好的例子来说明如何做到这一点:PInvoke 文章

通过查看标记为 MEM_COMMIT 的虚拟内存部分并检查以确保权限不包括 PAGE_GUARD,我能够找到相关且可读的必要内存块。

于 2013-01-07T08:59:46.720 回答