如何从页眉或页脚确定PE可执行文件的大小

假设你有一个数据stream或一个字节块你想雕刻,你怎么能确定可执行文件的大小?

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

这是一个文件格式的图片。

PE文件格式

Solutions Collecting From Web of "如何从页眉或页脚确定PE可执行文件的大小"

如果PE文件格式正确,计算可以简化为(伪代码):

size = IMAGE_NT_HEADERS.OptionalHeader.SizeOfHeaders foreach section_header in section_headers: size += section_header.SizeOfRawData 

哪里:

  • SizeOfHeadersIMAGE_OPTIONAL_HEADER结构的成员。
  • IMAGE_OPTIONAL_HEADER结构是IMAGE_NT_HEADERS一部分)

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

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

记事本 (Windows 10) 示例

  • SizeOfHeaders :0x400

在这里输入图像说明

  • 每个部分的SizeOfRawData
    • .text:0x15400
    • .data: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是否形成不良,或者是否有覆盖。