PE文件可选标题幻数

时间:2016-02-26 21:32:15

标签: portable-executable

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

规范明确指出:

  

目标文件可能有一个可选的标题,但通常是这个标题   除了增加大小外,在目标文件中没有任何功能。

这对我来说似乎有些模棱两可。我倾向于将其视为"在目标文件中忽略可选标头并且仅使文件膨胀。"但是,它可以被读作"可以在目标文件中使用可选的头来将大小从32位增加到64位。"这意味着什么?

编辑:根据规范,值0x10b表示32位,值0x20b表示64位,值0x107表示ROM图像。 ROM映像总是32位吗?

1 个答案:

答案 0 :(得分:1)

  

可选标题通常不用于目标文件

这是正确的

  

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

也正确

  

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

如果你的意思是你可以编译PE32 .obj并将其链接到PE32 + app,那么由于指针的大小不同而无论如何都是错误的。

  

我倾向于将其读作"在目标文件中忽略可选标题,只会使文件膨胀。"

这是正确的,我相信。

可选标头是图像的必需品(a.k.a.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 ++编译的文件都是如此