如何根据 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
是 IMAGE_OPTIONAL_HEADER
结构的成员。
- (
IMAGE_OPTIONAL_HEADER
结构是 IMAGE_NT_HEADERS
) 的一部分
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 格式是否错误或是否存在覆盖。
假设您有一个数据流或一个字节块要雕刻,您如何确定可执行文件的大小?
PE 可执行文件格式中有许多 header,但是我使用哪些 header 部分来确定(如果可能)可执行文件的总长度?
这是文件格式的图片。
如果PE文件格式正确,计算可以简化为(pseudo-code):
size = IMAGE_NT_HEADERS.OptionalHeader.SizeOfHeaders
foreach section_header in section_headers:
size += section_header.SizeOfRawData
其中:
SizeOfHeaders
是IMAGE_OPTIONAL_HEADER
结构的成员。- (
IMAGE_OPTIONAL_HEADER
结构是IMAGE_NT_HEADERS
) 的一部分
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 格式是否错误或是否存在覆盖。