【问题标题】:Relationship between VirtualQueryEx and ReadProcessMemoryVirtualQueryEx 和 ReadProcessMemory 的关系
【发布时间】:2013-01-04 03:12:00
【问题描述】:

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

【问题讨论】:

    标签: c++ windows memory-management paging


    【解决方案1】:

    VirtualQueryEx 为您提供有关页面分配方式、页面包含的一般信息类型等信息。我在previous answer 中发布了一些演示代码。这将遍历一个进程并转储出一些有关从操作系统为目标进程分配的每个内存块的信息。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-12-18
        • 2020-07-05
        • 2019-05-16
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        相关资源
        最近更新 更多