我对IMAGE_OPTIONAL_HEADER.DataDirectory
感到有些困惑。正如PE/COFF Specification所说,
标题部分数据目录
大小:变量
描述:在映像文件中找到并由操作系统使用的特殊表的地址/大小对(例如,导入表和导出表)。
还
NumberOfRvaAndSizes:可选标头的其余部分中的数据目录条目数。每个都描述了一个位置和大小。
最后,
3.4.3。可选标头数据目录(仅限图像)
请注意,目录数量不固定。在查找特定目录之前,请检查可选标头中的NumberOfRvaAndSizes字段。
此外,不要假设此表中的RVA指向节的开头,或者包含特定表的节具有特定名称。
最后一段引用下表:
正如我从上面所理解的那样,DataDirectory
不必具有IMAGE_NUMBEROF_DIRECTORY_ENTRIES
的固定大小。它应包含NumberOfRvaAndSizes
个条目。实际上这与上面的目录条目表相矛盾,其中每个类型在表中都有自己的偏移量,并且它会混淆。
所以,我的问题是:是否允许在IMAGE_NUMBEROF_DIRECTORY_ENTRIES
中包含少于DataDirectory
或者它必须始终是那么大?
在这种情况下如何正确计算NumberOfRvaAndSizes
?例如,我只有导入目录。那么NumberOfRvaAndSizes
应该是1.但我仍然会在DataDirectory
中有16个条目并且在索引1处导入条目?
很抱歉有一些误导性标签。我添加了它们以引起注意,因为指定portable-executable
只会导致熟悉格式的人可能会错过这个问题
答案 0 :(得分:1)
是的,它允许。 NumberOfRvaAndSizes 可以是任何值,包括0是否允许包含少于 IMAGE_NUMBEROF_DIRECTORY_ENTRIES DataDirectory或它必须始终是那么大?
奇怪的问题。只需阅读并使用它 - 计算在这种情况下如何正确计算NumberOfRvaAndSizes?
DataDirectory
数组中的有效条目。
<例如,我只有导入目录。然后
NumberOfRvaAndSizes
应该是1。
NumberOfRvaAndSizes
必须是&gt;比你使用的最大索引。因为 IMAGE_DIRECTORY_ENTRY_IMPORT == 1
- NumberOfRvaAndSizes
必须是&gt; 1 - 最低2。
并查找source代码以了解更多信息
答案 1 :(得分:-1)
在映像文件中找到并由操作系统使用的特殊表的地址/大小对(例如,导入表和导出表)。