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

最佳答案

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

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

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

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

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

关于c++ - VirtualQueryEx 和 ReadProcessMemory 之间的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14150566/

10-16 06:01