不久前,我在C#中创建了一个内存扫描程序,它将读取进程的内存并查找某些值(例如,每次出现整数42的位置)。从那时起,我重新审视了这个项目,并试图将其设计为在64位系统中工作。我遇到的问题是64位进程被授予高达8TB的虚拟内存(相比之下,32位系统上只有2-4GB)!至少对于我的代码,在任何合理的时间内都不可能扫描0-8TB范围内的每个地址。
我尝试在Process.MainModule.BaseAddress上开始我的扫描,但我不知道在哪里停止阅读,我肯定错过了重要的值。如何缩小字段以便我可以扫描过程实际使用的范围?
答案 0 :(得分:2)
我最终通过使用VirtualQueryEx库方法找出了正在使用的内存或虚拟页面的哪些部分。我使用此函数创建自己的“内存映射”并标识已使用和可访问的页面。 Pinvoke在这里有一个很好的例子:PInvoke Article
通过查看标记为MEM_COMMIT的虚拟内存部分并检查以确保权限不包含PAGE_GUARD,我能够找到相关且可读的必要内存块。