2013-01-06 45 views
2

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

我试着在Process.MainModule.BaseAddress开始我的扫描,但我不知道停止阅读的地方,我肯定缺少重要的值。如何缩小范围以便我可以扫描过程实际使用的范围?

+4

您需要获取进程的内存映射。搜索“进程内存映射”,这应该让你开始。 –

+0

我搜索了进程内存映射和类似的术语,但我能找到的所有解释是如何分页和虚拟内存的工作。这是有用的信息,但没有真正指出如何实现创建或如何查看外部进程的内存映射。然而,这确实使我研究了探索流程虚拟内存的其他方法。 – user1881066

+0

扫描调用'VirtualQueryEx'的地址空间是如何构建一个进程内存映射。 –

回答

2

我最终确定了使用VirtualQueryEx库方法正在使用哪些内存段或虚拟页面。我使用这个功能来创建我自己的“内存映射”,并确定使用和可访问的页面。 Pinvoke在这里有一个很好的例子:PInvoke Article

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

+0

你可以添加一些示例代码,然后接受你自己的答案? :) – Orwellophile