有效扫描进程的内存

Luk*_*ark 10 c# memory editing

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

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

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

ken*_*n2k 6

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

你必须做的是:

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

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

谷歌OpenProcess,CloseHandle,VirtualQueryExMEMORY_BASIC_INFORMATION所以你可以找到不同的P/Invoke的声明来使用,这样你就可以调用从C#的Win32函数.