3

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

4

2 回答 2

9

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

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

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

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

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

于 2013-01-04T04:14:33.387 回答
2

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

VirtualQueryEx 返回 PMEMORY_BASIC_INFORMATION ,其中包括有关该内存页的信息,例如读取、写入、执行标志。

于 2013-01-04T03:24:29.793 回答