IMAGE_OPTIONAL_HEADER.DataDirectory的大小是固定的还是可变的?

时间:2017-04-09 12:53:58

标签: c windows portable-executable

我对IMAGE_OPTIONAL_HEADER.DataDirectory感到有些困惑。正如PE/COFF Specification所说,

  

标题部分数据目录

     

大小:变量

     

描述:在映像文件中找到并由操作系统使用的特殊表的地址/大小对(例如,导入表和导出表)。

  

NumberOfRvaAndSizes:可选标头的其余部分中的数据目录条目数。每个都描述了一个位置和大小。

最后,

  

3.4.3。可选标头数据目录(仅限图像)

     

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

     

此外,不要假设此表中的RVA指向节的开头,或者包含特定表的节具有特定名称。

最后一段引用下表:

enter image description here

正如我从上面所理解的那样,DataDirectory不必具有IMAGE_NUMBEROF_DIRECTORY_ENTRIES的固定大小。它应包含NumberOfRvaAndSizes个条目。实际上这与上面的目录条目表相矛盾,其中每个类型在表中都有自己的偏移量,并且它会混淆。

所以,我的问题是:是否允许在IMAGE_NUMBEROF_DIRECTORY_ENTRIES中包含少于DataDirectory或者它必须始终是那么大?

在这种情况下如何正确计算NumberOfRvaAndSizes?例如,我只有导入目录。那么NumberOfRvaAndSizes应该是1.但我仍然会在DataDirectory中有16个条目并且在索引1处导入条目?

很抱歉有一些误导性标签。我添加了它们以引起注意,因为指定portable-executable只会导致熟悉格式的人可能会错过这个问题

2 个答案:

答案 0 :(得分:1)

  

是否允许包含少于 IMAGE_NUMBEROF_DIRECTORY_ENTRIES   DataDirectory或它必须始终是那么大?

是的,它允许。 NumberOfRvaAndSizes 可以是任何值,包括0

  

在这种情况下如何正确计算NumberOfRvaAndSizes?

奇怪的问题。只需阅读并使用它 - 计算 DataDirectory 数组中的有效条目。

  

例如,我只有导入目录。然后NumberOfRvaAndSizes   应该是1。

<NumberOfRvaAndSizes 必须是&gt;比你使用的最大索引。因为 IMAGE_DIRECTORY_ENTRY_IMPORT == 1 - NumberOfRvaAndSizes 必须是&gt; 1 - 最低2。

并查找source代码以了解更多信息

答案 1 :(得分:-1)

在映像文件中找到并由操作系统使用的特殊表的地址/大小对(例如,导入表和导出表)。