【问题标题】:PE File Optional Header Magic NumberPE 文件可选标题幻数
【发布时间】:2016-02-27 06:53:58
【问题描述】:

我目前正在编写一个从 PE 文件读取和写入的库。据我从规范中了解到,可选标头通常不用于目标文件。但是,它包含指定 PE32 和 PE32+ 变体之间的字段。 PE 是否允许 PE32+ 目标文件?

规范中具体说:

一个目标文件可能有一个可选的头文件,但通常这个头文件 除了增加大小之外,在目标文件中没有其他功能。

这对我来说似乎有点模棱两可。我倾向于将其解读为“可选标头在目标文件中被忽略,只会使文件膨胀”。但是,它可以被解读为“可在目标文件中使用可选标头以将大小从 32 位增加到 64 位”。这是什么意思?

编辑:根据规范,0x10b 的值表示 32 位,0x20b 的值表示 64 位,0x107 的值表示 ROM 映像。 ROM 映像是否始终为 32 位?

【问题讨论】:

    标签: portable-executable


    【解决方案1】:

    Optional Header 通常不用于目标文件

    没错

    但是,它包含指定 PE32 和 PE32+ 变体之间的字段。

    也是正确的

    PE 是否允许 PE32+ 目标文件?

    如果你的意思是你能编译 PE32 .obj 并将其链接到 PE32+ 应用程序,那么由于指针大小不同,这是错误的。

    我倾向于将其解读为“可选标头在目标文件中被忽略,只会使文件膨胀。”

    这是正确的,我相信。

    可选的标头是图像(也称为 exe 或 dll)的必需项。

    您可以通过在 .obj 或 .exe 文件上执行 dumpbin /header 自行收集所有这些信息。 Dumpbin 随每个 VC++ 安装一起分发。比如小文本项目

    dumpbin.exe /headers PE.exe | findstr PE
    

    会产生

    Dump of file PE.exe
    PE signature found
                 20B magic # (PE32+)
    

    但是在 .obj 文件上使用dumpbin 不会产生任何结果,没有可选的标题。

    ROM 映像是否总是 32 位?

    我怀疑是这样,但坦率地说,我不知道,从未使用过 ROM 映像

    PS 我相信上述所有内容都适用于使用 Visual C++ 编译的文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多