为我的汇编项目学习一些nasm和文件格式。我现在对SizeOfHeaders非常困惑。
查看文档https://learn.microsoft.com/en-us/previous-versions/ms809762(v=msdn.10)?redirectedfrom=MSDN
PE标头和节(对象)表的大小。节的原始数据在所有标题组件之后立即开始。
让我们看看另一个官方文档https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header32。
以下各项的组合大小,舍入为FileAlignment成员中指定值的倍数。
e_lIMAGE_DOS_HEADER4字节签名IMAGE_FILE_HEADER 4个新成员可选标题大小所有节标题大小
网上其他消息称
MS-DOS存根、PE标头和节标头的组合大小,四舍五入为FileAlignment的倍数。
正如您所看到的,每个源都对SizeOfHeaders的组成给出了不同的解释。
我尝试过的:
在NASM中,SizeOfHeaders可以这样计算:
第一个月
这将是最简单的源代码实现的例子,也是我使用过的一个,但是我列出的第二个官方源代码,特别指出了dos头的e_lfanew成员,而不是整个dos存根,或者根本没有任何dos头或存根。
所以这个例子很可能是不正确的。网上看了一下,似乎没有任何确凿的信息,以前在互联网上记录关于这个问题。
1条答案
按热度按时间4urapxun1#
下面是IMAGE_OPTIONAL_HEADER中SizeOfHeaders成员的计算方法:
PE可执行文件以DOS_HEADER开头(大小为64),后面是MZ可执行16位DOS存根文件,该文件的大小可能可变。
DOS_HEADER.e_lfanew(最后一个DWORD)指定PE、LE或NE签名在可执行文件中的文件地址(偏移量)。将签名大小(4)与e_lfanew值相加,得到IMAGE_FILE_HEADER的偏移量。此文件头的大小是固定的(20)。
文件头后面是IMAGE_OPTIONAL_HEADER,大小为224或240字节(32位或64位版本)。
MemberIMAGE_FILE_HEADER.NumberOfSections指定可选标头后面有多少个IMAGE_SECTION_HEADER示例。每个区段标头为40字节长。将其全部相加并四舍五入为IMAGE_OPTIONAL_HEADER.FileAlignment(通常为512),得到IMAGE_OPTIONAL_HEADER.SizeOfHeaders的最终值。
W.J.Radburn的PEview是一个很好的GUI工具,可以用来检查32位COFF和PE文件。