VirtualQueryEx和ReadProcessMemory之间的关系

我知道Windows进程是通过加载PE头,然后下面的部分(.text .data等)在RAM中映射的,我可以用ReadProcessMemory读取它们,但VirtualQueryEx有什么意义? 我认为它应该一次读取一个页面(分页系统使用的内存页面),但是我不知道内存页面是如何与PE部分相关的。如果我只想扫描.text部分,我是否也应该使用VirtualQueryEx或页面与其内容无关?

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

ReadProcessMemory会让你在指定的进程中读取一块内存的实际内容。 要使用它,你需要在目标进程中指定一个地址,但是它本身并不知道该进程中的地址。

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

根据你所寻找的东西(特别是如果你想看像目标进程中的代码的东西),你可能想使用符号处理程序API来找到你所关心的部分。 VirtualQueryEx以相当粗的粒度查看事物 – 例如,它会告诉你整个可执行文件被映射的整个内存块的基地址和大小,但是并没有告诉你这个内部是什么地方(通常是大块)。

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

要确定哪个内存页属于内存中加载的PE的哪一部分,必须先读取它的PE头,解析并找到.text,.code,.bss等部分。

VirtualQueryEx返回PMEMORY_BASIC_INFORMATION,其中包含有关内存页面的信息,如读,写,执行标志。