PE标头的大小

时间:2011-11-19 11:52:49

标签: windows portable-executable

有没有办法找出PE标题的大小而不读取所有标题或整个文件?

1 个答案:

答案 0 :(得分:3)

您可以像这样计算PE头的总大小:

sizeof(Signature) + sizeof(FileHeader) + sizeof(OptionalHeader) + sizeof(SectionTable)

文件头总是具有相同的大小,但OptionalHeader的大小可以不同,部分表的大小也是如此。

OptionalHeader的大小存储在FileHeader.SizeOfOptionalHeader中,而且表格大小等于FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)

还有一些C代码:

DWORD SizeOfPEHeader(const IMAGE_NT_HEADERS * pNTH)
{
    return (offsetof(IMAGE_NT_HEADERS, OptionalHeader) + pNTH->FileHeader.SizeOfOptionalHeader + (pNTH->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER)));
}

您所要做的就是读取DOS标头,获取PE偏移量(e_lfanew)并将PE.Signature + PE.FileHeader读入内存。这是两个固定大小的阅读操作,您可以获得所需的所有信息。