我知道Windows进程是通过加载PE头和下面的部分(.text、.data等)映射到ram中的。我可以用ReadProcessMemory阅读它们,但是VirtualQueryEx有什么意义呢?我认为它应该一次读取一页(分页系统使用的内存页),但我看不出内存页与PE段有什么关系。如果我只想浏览.text部分,我应该也使用VirtualQueryEx吗?或者页面与其内容无关?
发布于 2013-01-04 12:14:33
VirtualQueryEx可以让你了解一个页面是如何被分配的,它包含了什么样的一般信息,等等。我在一个previous answer中发布了一些演示代码。这将遍历一个进程,并转储出有关从操作系统为目标进程分配的每个内存块的一些信息。
ReadProcessMemory将允许您在指定的进程中读取内存块的实际内容。要使用它,您需要在目标进程中指定一个地址--它本身并不知道它在该进程中的位置。
如果您想在某个进程中读取映射的可执行文件的一部分,通常会使用VirtualQueryEx来查找您关心的部分在内存中的加载位置,然后使用ReadProcessMemory来读取您关心的部分。例如,在another previous answer中,我发布了一些代码,这些代码在提交的、私有的或映射的流程的所有页面中搜索指定的模式。
根据您要查找的内容(特别是如果您希望查看目标进程中的代码),您可能希望使用符号处理程序API之类的东西来查找您所关心的部分。VirtualQueryEx以相当粗略的粒度查看事物--例如,它会告诉您映射了整个可执行文件的整个内存块的基地址和大小,但不会告诉您该块(通常很大)中的内容。
符号处理程序API可以告诉您(例如)该可执行文件中特定函数的地址(前提是信息可用,例如包含调试信息的可执行文件,或者您希望从exe/dll中导出的函数)。
发布于 2013-01-04 11:24:30
要确定哪个内存页属于加载到内存中的PE的哪个段,您必须读取它的PE头,解析它,并找到.text、.code、.bss等段。
VirtualQueryEx返回PMEMORY_BASIC_INFORMATION,其中包含有关该页内存的信息,如读、写、执行标志。
https://stackoverflow.com/questions/14150566
复制相似问题