了解标题大小

问题描述 投票:0回答:1

学习一些 nasm 和我的汇编项目的文件格式。我目前对

SizeOfHeaders
很困惑。

查看官方文档

PE头和节(对象)表的大小。这些部分的原始数据在所有标题组件之后立即开始。

看一下另一个官方文档

以下项目的组合大小,四舍五入为 FileAlignment 成员中指定的值的倍数。

  • e_lfanew
    IMAGE_DOS_HEADER
  • 成员
  • 4字节签名
  • 尺寸
    IMAGE_FILE_HEADER
  • 可选标题的大小
  • 所有节标题的大小

网上其他消息来源说:

MS-DOS 存根、PE 标头和节标头的组合大小,四舍五入为 FileAlignment 的倍数。

正如您所看到的,每个来源都对 SizeOfHeaders 的组成给出了不同的解释。

在 NASM 中,SizeOfHeaders 可以这样计算:

dd sections_start - dos_stub_start + (FileAlignment - 1)) // FileAlignment

这将是最简单源的实现示例,也是我使用过的一个,但是我列出的第二个官方源,具体说明了 dos 标头的 e_lfanew 成员,而不是整个 dos 存根或任何 dos第一个源的标题或存根。

所以这个例子很可能是不正确的。

网上查了一下,之前网上好像没有关于这个问题的确凿信息。

windows assembly nasm portable-executable file-format
1个回答
1
投票

这就是我计算 IMAGE_OPTIONAL_HEADER 中成员 SizeOfHeaders 的值的方法:

PE 可执行文件以 DOS_HEADER(大小 64)开头,后面是 MZ 可执行 16 位 DOS stub 文件,该文件可能具有可变大小。

DOS_HEADER.e_lfanew(最后一个DWORD)指定可执行文件中PE、LE或NEsignature的文件地址(偏移量)。 将签名大小 (4) 添加到 e_lfanew 值得出IMAGE_FILE_HEADER 的偏移量。该文件头的大小是固定的 (20)。

文件头后面是 IMAGE_OPTIONAL_HEADER,对于 32 位或 64 位版本,大小为 224 或 240 字节。

Member IMAGE_FILE_HEADER.NumberOfSections 指定可选标头后面有多少个 IMAGE_SECTION_HEADER 实例。每个节头的长度为 40 字节。 将它们全部加在一起并四舍五入到 IMAGE_OPTIONAL_HEADER.FileAlignment(通常为 512)给出最终值 IMAGE_OPTIONAL_HEADER.SizeOfHeaders

用于检查 32 位 COFF 和 PE 文件的一个很好的 GUI 工具是 W.J.Radburn 的 PEview

© www.soinside.com 2019 - 2024. All rights reserved.