PE Header 的大小

Ido*_*dov 6 windows portable-executable

有没有办法在不阅读所有内容或整个文件的情况下找出 PE 标头的大小?

pez*_*ode 6

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

sizeof(Signature) + sizeof(FileHeader) + sizeof(OptionalHeader) + sizeof(SectionTable)
Run Code Online (Sandbox Code Playgroud)

文件头始终具有相同的大小,但 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)));
}
Run Code Online (Sandbox Code Playgroud)

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