VirtualQueryEx和ReadProcessMemory的关系
Relationship between VirtualQueryEx and ReadProcessMemory
我知道Windows进程是通过加载PE头映射到ram中的,然后是以下部分(文本。数据等),我可以读取他们与ReadProcessMemory,但什么是VirtualQueryEx的点?我认为它应该一次读取一页(分页系统使用的内存页),但我不知道内存页与PE部分有什么关系。如果我只想扫描。text部分,我是否也应该使用VirtualQueryEx,或者页面与其内容不相关?
VirtualQueryEx为您提供有关页面如何分配,它包含哪些一般类型的信息等信息。我在之前的回答中发布了一些演示代码。这将遍历一个进程,并转储有关从操作系统为目标进程分配的每个内存块的一些信息。
ReadProcessMemory将允许您读取指定进程中内存块的实际内容。要使用它,您需要在目标进程中指定一个地址,但它本身并不知道该进程中的位置。
如果你想在某个进程中读取映射的可执行文件的一部分,你通常会使用VirtualQueryEx来查找你关心的部分在内存中的位置已经加载,然后使用ReadProcessMemory来读取你关心的部分。例如,在之前的另一个答案中,我发布了一些代码,用于在提交的进程的所有页面中搜索指定的模式,无论是私有的还是映射的。
根据你正在寻找的东西(特别是如果你想要查看目标进程中的代码之类的东西),你可能想要使用像符号处理程序API这样的东西来找到你关心的部分。VirtualQueryEx以相当粗粒度的方式查看事情——例如,它会告诉您整个可执行文件所在的内存块的基址和大小,但不会告诉您该块(通常是大块)内部的内容。
符号处理程序API可以告诉您(例如)可执行文件中特定函数的地址(如果该信息可用,例如包含调试信息的可执行文件,或者您关心的从exe/dll导出的函数)
要确定哪个内存页属于内存中加载的PE的哪个部分,您必须读取它的PE头,解析它并找到。text, .code, .bss等部分。
VirtualQueryEx返回PMEMORY_BASIC_INFORMATION,其中包含有关该内存页的信息,如读,写,执行标志。
- C++GTKMM gui循环依赖关系
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- 如何记住这种递归关系?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 移动语义和深层/浅层复制之间有什么关系?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 对在不同二进制文件中创建的对象文件的依赖关系
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 模拟测试中类的依赖关系
- 关于记忆后这种递归关系的时间复杂度
- C++模板方法中的循环依赖关系
- 解析正交模块的依赖关系
- 超市管理系统的类别之间应该是什么关系?
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?