【问题标题】:How do I determine where process executable code starts and ends when loaded in memory?如何确定进程可执行代码在内存中加载时的开始和结束位置?
【发布时间】:2012-02-01 22:17:39
【问题描述】:

假设我有应用程序 TestApp.exe 在 TestApp.exe 运行时,我希望有一个单独的程序能够读取驻留在内存中的可执行代码。我想忽略堆栈和堆以及其他任何相切的东西。

换一种说法,我想我在问如何确定磁盘上 .exe 二进制数据的内存端等效项所在的位置。我意识到这不是 1:1 的内存填充。

编辑:我认为我要求的内容在以下 vmmap.exe 屏幕截图中显示为 Image

编辑:我可以使用 VirtualQueryEx 和 ReadProcessMemory 从内存中获取所有带有 Execute*(PAGE_EXECUTE 等)保护标志的内存。有几个问题。首先,我为 notepad.exe 获取大约 2 兆字节的数据,这是磁盘上的 189 KB 文件。我抓取的所有东西都有一个 PAGE_EXECUTE 的保护标志。其次,如果我在不同的 Win7 64 位机器上运行它,我会得到相同的数据,只是分成两半并且顺序不同。我可以使用一些专家指导。 :)

编辑:另外,不知道为什么我在这个问题上是-1。如果我需要澄清任何事情,请告诉我。

【问题讨论】:

  • 当您将代码保存在文件中时,从内存中读取代码到底有什么意义?
  • 一个正当的理由是制作一个类似于屏幕截图中的应用程序?不过,为什么重要呢?
  • 您展示的应用不会尝试读取可执行代码。
  • 我展示的应用程序不是我打算写的。无论如何,你能提供帮助吗?
  • 答案隐藏在this question中。但是你在做什么很奇怪。为什么你需要像那样弄乱另一个进程的内存空间?这样做的程序可能会触发恶意软件检测器。

标签: windows winapi memory process


【解决方案1】:

我在做这个项目时学到了很多东西。我最终解析了 PE 标头并使用该信息来路由我。最后,我完成了我的目标,因此我的知识更加丰富。

【讨论】:

    【解决方案2】:

    无需注入 dll 使用原生 api hooking apis

    【讨论】:

      【解决方案3】:

      将 DLL 注入目标进程并使用可执行文件的名称调用 GetModuleHandle。这将指向其已加载到内存中的 PE 标头。获得这些信息后,您可以手动解析 PE 标头并找到 .text 部分相对于内存中图像的基地址的位置。

      【讨论】:

      • 注入 DLL 对我的应用程序来说是不可行的。如果我们从阅读不同过程的记忆转变为阅读自己的记忆,你的答案会有何变化?
      • 由于 ASLR,您无法知道可执行代码段在内存中的位置。
      • 我很清楚,您所说的“你无法知道”是指预先知道还是通过某种方式确定?
      • @RobotCaleb AFAIK,无法预测代码部分在内存中的位置(如果可以,那么 ASLR 实现将存在本质缺陷)。话虽如此,找到已加载内存的基地址的最简单方法是在该进程中调用 GetModuleHandle。
      猜你喜欢
      • 2021-04-28
      • 2017-04-02
      • 1970-01-01
      • 2011-11-27
      • 2020-04-30
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多