11

最近我整理了一个 C# 类,它可以使用 API 调用等在另一个进程内存中读取和写入字节,我相信你们以前都见过。

然而,我的问题与我如何有效地扫描另一个进程的内存有关?我知道在达到 Int32.MaxValue 之前测试每组 4 个字节的基本方法,但我发现它(如你所想)非常耗费时间和资源。

根据我的阅读,有一种方法可以通过执行“HeapWalk”来确定进程的分配地址。谁能向我提供一些代码示例和/或有关此的信息,最好的方法是什么?

4

2 回答 2

8

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

你必须做的是:

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

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

谷歌OpenProcess,,,CloseHandle所以你可以找到不同VirtualQueryExMEMORY_BASIC_INFORMATIONP/Invoke 声明来使用,所以你可以从 C# 调用这些 Win32 函数。

于 2012-12-14T15:49:49.527 回答
0

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

于 2013-10-17T13:07:12.860 回答