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