VirtualQueryEx和ReadProcessMemory之间的关系

时间:2013-01-04 03:12:01

标签: c++ windows memory-management paging

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

2 个答案:

答案 0 :(得分:8)

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

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

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

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

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

答案 1 :(得分:2)

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

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