假设您有一个数据流或一个字节 block 要分割,您如何确定可执行文件的大小?
PE 可执行文件格式中有许多 header ,但我使用哪些 header 部分来确定(如果可能)可执行文件的总长度?
这是文件格式的图片。
最佳答案
如果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
字段给出所有 header 的长度(注意:包括 16 位 stub )。
- 每个部分标题都是一个
IMAGE_SECTION_HEADER
结构 SizeOfRawData
字段给出磁盘上每个部分的长度。
记事本示例(Windows 10):
SizeOfHeaders
: 0x400
SizeOfRawData
每个部分:- .文本: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 是否形成不良或是否存在覆盖。
关于windows - 如何从页眉和/或页脚确定 PE 可执行文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34684660/