最近我整理了一个 C# 类,它可以使用 API 调用等在另一个进程内存中读取和写入字节,我相信你们以前都见过。
然而,我的问题与我如何有效地扫描另一个进程的内存有关?我知道在达到 Int32.MaxValue 之前测试每组 4 个字节的基本方法,但我发现它(如你所想)非常耗费时间和资源。
根据我的阅读,有一种方法可以通过执行“HeapWalk”来确定进程的分配地址。谁能向我提供一些代码示例和/或有关此的信息,最好的方法是什么?
您正在寻找的是内存区域列表,它基本上是一对内存地址/区域大小的列表。
你必须做的是:
PID)获取目标进程的句柄OpenProcessVirtualQueryEx函数直到你到达内存空间的末尾(即当方法的结果大于0时)VirtualQueryEx从lpAddressas开始0x0。这将返回一个MEMORY_BASIC_INFORMATION包含BaseAddress和RegionSize属性的结构(这表示您可以读取的内存空间)。然后lpAdress用值增加参数RegionSize,所以下一次调用VirtualQueryEx将返回下一个区域......等等。
谷歌OpenProcess,,,CloseHandle所以你可以找到不同VirtualQueryEx的MEMORY_BASIC_INFORMATIONP/Invoke 声明来使用,所以你可以从 C# 调用这些 Win32 函数。
我可以给你一些建议来提高你的扫描性能。最昂贵的操作是 I\O。因此,例如,如果您在内存中搜索子字符串,请在查看内部之前读取整个内存块,而不是读取小块内存。