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