我有一个PE文件(记事本),COFF标头中的NumberOfRvaAndSize值为0x10,并且按预期有16个DataDirectory条目。

文档说此值可以更改(尽管我从来没有看到它),这意味着条目数少于16个。

紧随其后的是包含名称的16个数据目录的列表。


这些名称是否总是按照正确的顺序相同?
如果少于16个,是否总是缺少末尾的目录?
如果大于16个,则他们打过电话吗?


#1 楼

简而言之:


是的
正确的
您必须要了解一个规范。

数据目录是固定的稀疏数组,每个插槽的含义由规范定义,因此(例如)导出表始终是第一个条目,它不能移动。如果您没有Export表(但您还有其他目录),则SizeVirtualAddress字段将为零。


请注意,目录数不是固定的。在查找特定目录之前,请检查可选标题中的NumberOfRvaAndSizes字段。


因此,如果NumberOfRvaAndSizes成员为2,则可以查看Export表和Import表,但是没有其他内容。

解析器是根据规范构建的,因此,如果遇到的PE文件的NumberOfRvaAndSizes值大于所知道的值,则他们将不知道数据是什么或如何解释。它(并且无法通过检查PE文件来找出)。对于保留的目录或其他未记录的目录也是如此。