【问题标题】:IMAGE_OPTIONAL_HEADER.DataDirectory has fixed or variable size?IMAGE_OPTIONAL_HEADER.DataDirectory 的大小是固定的还是可变的?
【发布时间】:2017-04-09 21:18:46
【问题描述】:

我对@9​​87654324@ 有点困惑。正如PE/COFF Specification 所说,

标题部分:数据目录

大小:可变

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

还有

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

最后,

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

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

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

最后一段引用了下表:

据我了解,DataDirectory 不必具有固定大小的IMAGE_NUMBEROF_DIRECTORY_ENTRIES。它应该包含NumberOfRvaAndSizes 条目。实际上这与上面的目录条目表相矛盾,其中每种类型在表中都有自己的偏移量,并且令人困惑。

所以,我的问题是:是否允许在 DataDirectory 中包含小于 IMAGE_NUMBEROF_DIRECTORY_ENTRIES 的内容,或者必须始终为该大小?

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

对于一些误导性的标签,我们深表歉意。我添加它们是为了引起一些注意,因为指定 portable-executable 只会导致熟悉格式的人可能会错过问题

【问题讨论】:

  • is it allowed to include less - 是的。 I have only import directory. - 在这种情况下你需要有NumberOfRvaAndSizes >= 2 因为IMAGE_DIRECTORY_ENTRY_IMPORT==1

标签: c windows portable-executable


【解决方案1】:

是否允许包含少于 IMAGE_NUMBEROF_DIRECTORY_ENTRIES 的内容 DataDirectory 或者它必须始终是那个大小?

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

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

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

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

NumberOfRvaAndSizes 必须大于您使用的最大索引。因为 IMAGE_DIRECTORY_ENTRY_IMPORT == 1 - NumberOfRvaAndSizes 必须 > 1 - 最小 2。

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

【讨论】:

  • 嗯,这是有道理的。谢谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2016-10-29
    • 2017-04-29
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多