最近我组装了一个C#类,可以使用API调用等来读取和写入另一个进程内存中的字节,因为我确信你以前都看过.
然而,我的问题涉及到如何有效扫描另一个进程的记忆?我知道测试每组4个字节的基本方法,直到您达到Int32.MaxValue,但是我发现它是(可想而知)令人难以置信的时间和资源消耗.
从我所看到的,通过执行“HeapWalk”,可以确定进程的分配地址.任何人都可以向我提供一些代码示例和/或有关这方面的信息,什么是最好的方式呢?
解决方法
您正在寻找的是内存区域列表,它基本上是一对内存地址/区域大小的列表.
你必须做的是:
>使用OpenProcess
的进程ID(PID)获取目标进程的句柄
>调用VirtualQueryEx
功能,直到到达内存空间的末尾(即方法的结果大于0)
关闭你打开的进程句柄
使用lpAddress启动VirtualQueryEx为0x0.这将返回一个包含BaseAddress和RegionSize属性的MEMORY_BASIC_INFORMATION结构(这表示可以读取的内存空间).然后使用RegionSize值增加lpAdress参数,因此下一次调用VirtualQueryEx将返回下一个区域…等.
Google OpenProcess,CloseHandle,VirtualQueryEx和MEMORY_BASIC_INFORMATION,因此您可以找到要使用的不同的P / Invoke声明,因此您可以从C#调用这些Win32函数.