PE 格式的可执行文件中的 COFF 字节顺序

COFF byte ordering in PE formatted executable

我有一个 Windows 二进制文件的 hexdump,并通过查看 COFF 偏移量识别了此可执行文件中的 COFF header:

0000080: 4550 0000 014c 0003 6ec8 3add 0000 0000
0000090: 0000 0000 00e0 010f 010b 0301 2000 0000

我们可以进一步验证这是文件 header 因为它的 4 byte signature: 'PE' 后跟两个 NULL 字节。显然,该格式似乎是用小端表示的,因为如果我们要显式编写 PE,我们将得到十六进制 50 45.

如果我们查看 the PE format specification 并进行此观察,NumberOfSections 字段(从 Machine 字段跳过的签名末尾偏移 2 个字节),我们确定有 768 个部分(03 00 in little endian)。这与规范相矛盾,指出 Windows 加载程序将部分数限制为 96。

此外,Timestamp 字段(接下来的 4 个字节)中的字节顺序看起来很奇怪,因为只有排列 3add 6ec8 会产生过去的 Unix 时间戳。

是否有我缺少的更明确定义的字节顺序?为什么字段之间的字节顺序看起来不一致?

您的 hexdump 使用了误导性的格式。使用字节格式重试(-c 选项)

在您的转储中,输出已经进行了字节交换。事物出现顺序

(byte1)(byte0) ' ' (byte3)(byte2) ' ' (byte5)(byte4) ' '

等等。

PE header 如您所述

50 45

Hexdump 的默认显示规则将这两个字节解释为 16 位小端整数,0x4550,这就是为什么显示是 4550

节数为 3,(03 00 在文件中)。我不知道你为什么说 03 00 在小端字节序中是 768,因为那是错误的。在这种情况下,hexdump 的 16 位 LE 默认格式实际上有效,因为它是一个 16 位字段,0x0003 的解码是正确的。

时间戳显示为6ec8 3add,但文件中的实际字节数为c8 6e dd 3a。现在 32 位字段大小和 16 位 hexdump 格式不匹配,导致您完全混淆。