假设你有一个数据stream或一个字节块你想雕刻,你怎么能确定可执行文件的大小?
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
:
(注意: SizeOfRawData
被称为Raw Size
):
总结一切:
>>> size_of_headers = 0x400 >>> sec_sizes = [0x15400, 0x800, 0x1a00, 0x19c00, 0x1600] >>> size_of_headers + sum(sec_sizes) 207872 >>>
总大小 :207872字节。
验证:
注意:上述计算不考虑PE是否形成不良,或者是否有覆盖。