VirtualQueryEx和ReadProcessMemory之间的关系

Joh*_*ing 3 c++ windows paging memory-management

我知道Windows进程是通过加载PE头,然后是以下部分(.text .data等...)来映射的,并且我可以使用ReadProcessMemory读取它们,但是VirtualQueryEx有什么意义呢?我认为它应该一次读取一个页面(寻呼系统使用的内存页面),但我没有看到内存页面与PE部分的关系如何...如果我只想扫描.text部分,我应该使用VirtualQueryEx还是页面与其内容无关?

Jer*_*fin 9

VirtualQueryEx为您提供有关如何分配页面的信息,它包含的一般信息等等.我在之前的答案中发布了一些演示代码.这将遍历一个进程并转储有关从OS分配给目标进程的每个内存块的一些信息.

ReadProcessMemory将允许您读取指定进程中的内存块的实际内容.要使用它,您需要在目标进程中指定一个地址 - 就其本身而言,它不知道该进程中的位置.

如果您想在某个过程中读取映射的可执行文件的一部分,您通常会使用VirtualQueryEx来查找内存中已加载的部分的位置,然后使用ReadProcessMemory来读取您关注的部分.例如,在之前的另一个答案中,我发布了一些代码,用于在提交的进程的所有页面中搜索指定的模式,以及私有或映射.

根据您正在寻找的内容(特别是如果您想查看目标进程中的代码等内容),您可能希望使用类似符号处理程序API的内容来查找您关注的部分.VirtualQueryEx以相当粗略的粒度查看事物 - 例如,它会告诉您整个可执行文件已映射的整个内存块的基本地址和大小,但不会告诉您内部的内容是什么(通常很大)阻止.

符号处理程序API可以告诉您(例如)该可执行文件中特定函数的地址(前提是该信息可用,例如包含调试信息的可执行文件,或者您从exe/dll导出的函数).