假设您想要刻录数据流或字节块,那么如何确定可执行文件的大小?
PE可执行格式中有许多标题,但我使用哪些标题部分来确定(如果可能)可执行文件的总长度?
这是文件格式的图片.
如果PE文件格式正确,则计算可以简化为(伪代码):
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
字段给出了所有标题的长度(注意:包括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是否形成错误或是否存在叠加.