有效扫描进程的内存

时间:2012-12-02 03:21:50

标签: c# memory editing

最近我把一个C#类放在一起,可以使用API​​调用等在另一个进程内存中读写字节,因为我相信你以前都见过。

然而,我的问题涉及如何有效地扫描另一个进程的内存?我知道测试每组4个字节的基本方法,直到你到达Int32.MaxValue,但我发现它(正如你可能想象的那样)非常耗费时间和资源。

根据我的阅读,有一种方法可以通过执行“HeapWalk”来确定进程的已分配地址。任何人都可以向我提供一些代码示例和/或有关此问题的信息以及最佳的解决方法吗?

2 个答案:

答案 0 :(得分:6)

您要查找的是内存区域的列表,它基本上是一对内存地址/区域大小的列表。

你必须做的是:

  • 使用OpenProcess
  • 使用其进程ID(PID)获取目标进程的句柄
  • 调用VirtualQueryEx函数,直到到达内存空间的末尾(即方法的结果大于0时)
  • 关闭您打开的流程句柄

VirtualQueryEx作为lpAddress开始0x0。这将返回包含MEMORY_BASIC_INFORMATIONBaseAddress属性的RegionSize结构(这表示您可以读取的内存空间)。然后使用lpAdress值增加RegionSize参数,以便VirtualQueryEx的下一次调用将返回下一个区域...等。

Google OpenProcessCloseHandleVirtualQueryExMEMORY_BASIC_INFORMATION,因此您可以找到要使用的不同P / Invoke声明,因此您可以从C#调用这些Win32函数。

答案 1 :(得分:0)

我可以建议您提高扫描性能。 最昂贵的行动是我\ O.因此,如果您在内存中搜索子字符串,请在查看内部之前读取整个内存块,而不是读取小块内存。