【发布时间】:2016-08-31 14:09:58
【问题描述】:
MS 加载器将 PE 文件的哪些部分映射到内存中?
从 PE 文档中,我可以推断出 PE 可执行文件的典型格式(见下文)。
我知道,通过检查,PE 文件的所有内容,包括节头在内,都被映射到内存中,就像存储在磁盘上一样。
接下来会发生什么?
文件的其余部分是否也被映射(这里我指的是下图中的图像页面部分),以便整个文件在内存中就像存储在磁盘上一样,还是加载器比这更有选择性?
在文档中,我发现了以下 sn-p:
另一个例外是属性证书和调试信息 必须放在图像文件的最后,带有属性 紧接在调试部分之前的证书表,因为 loader 不会将这些映射到内存中。属性规则 证书和调试信息不适用于目标文件, 但是。
这就是我能找到的关于加载器行为的全部内容;它只是说这两个部分必须放在文件的最后,因为它们不会进入内存。
但是,如果加载器加载除了这两个部分之外的所有内容,并且我将 RVA 部分设置得足够高,那么部分数据实际上会在内存中复制(一次在映射文件中,一次在 RVA 指定的位置)?
如果可能,请链接到我可以进一步了解加载特定于 MS Windows 的地方。
【问题讨论】:
-
注意加载和映射之间的区别:即使是一个巨大的 exe 在映射到内存时实际上也不必从磁盘读取。您可以映射一个大文件并将其按需分页到内存中。您的问题标题显示“已加载”,但您是在询问程序加载器如何映射它。
-
已更正,谢谢。
-
整个 PE 文件使用内存映射文件机制映射到内存中。随后的访问尝试会导致页面错误,从而触发加载。似乎您所询问的大部分内容都是您不应该依赖的实现细节。换句话说,故意无证。目前尚不清楚您要解决什么问题。 RVA 只是相对于文件内存映射位置的偏移量,所以我不明白内存中怎么会有任何重复。
-
@CodyGray - 我不是要解决问题。这只是兴趣。但是,如果您知道整个文件被映射到内存中,这是否意味着可以在内存中复制部分(一次用于文件映射,一次用于指定的 RVA)。另外,如果可能的话,你能否提供一个来源:-)?
-
@nlykkei: “部分可以在内存中复制(一次用于文件映射,一次用于指定的 RVA)” - 我不明白,你想做什么在这里说。但是不,不涉及重复。 “如果可能,您能否提供来源” - 如前所述,这些内容是“故意未记录的”。没有人编写文档的唯一目的是记录任何事物的无证性质。
标签: windows assembly x86 loader portable-executable