答案 0 :(得分:5)
如果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
:
(注意:SizeOfRawData
在下图中称为Raw Size
:
总结一切:
>>> size_of_headers = 0x400
>>> sec_sizes = [0x15400, 0x800, 0x1a00, 0x19c00, 0x1600]
>>> size_of_headers + sum(sec_sizes)
207872
>>>
总大小:207872字节。
验证
注意:上述计算并未考虑PE是否形成错误或是否存在覆盖。