如何根据 headers 和/或页脚确定 PE 可执行文件的大小

How to determine the size of an PE executable file from headers and or footers

假设您有一个数据流或一个字节块要雕刻,您如何确定可执行文件的大小?

PE 可执行文件格式中有许多 header,但是我使用哪些 header 部分来确定(如果可能)可执行文件的总长度?

这是文件格式的图片。

如果PE文件格式正确,计算可以简化为(pseudo-code):

size = IMAGE_NT_HEADERS.OptionalHeader.SizeOfHeaders

foreach section_header in section_headers:
    size += section_header.SizeOfRawData

其中:

SizeOfHeaders 字段给出所有 header 的长度(注意:包括 16 位存根)。

  • 每个部分 header 是一个 IMAGE_SECTION_HEADER 结构
  • SizeOfRawData 字段给出磁盘上每个部分的长度。

记事本示例 (Windows 10):

  • SizeOfHeaders : 0x400

  • SizeOfRawData各部分:
    • .文本:0x15400
    • .数据:0x800
    • .idata: 0x1A00
    • .rsrc: 0x19C00
    • .reloc: 0x1600

(注:下图中SizeOfRawData被称为Raw Size):

总结一切:

>>> size_of_headers = 0x400
>>> sec_sizes = [0x15400, 0x800, 0x1a00, 0x19c00, 0x1600]
>>> size_of_headers + sum(sec_sizes)
207872
>>> 

总大小:207872 字节。

验证:

注意:上述计算未考虑 PE 格式是否错误或是否存在覆盖。