【问题标题】:PE File Format - What is between the section table and the first section?PE 文件格式 - 节表和第一节之间是什么?
【发布时间】:2012-09-07 02:51:23
【问题描述】:

在十六进制编辑器中查看 PE 文件时,我经常在节表和第一节之间遇到一些字节,这对我来说真的没有意义。就我而言,应该有一个 00 字节的填充以适应对齐方式。但是,这里有一个截屏,展示了相反的情况:

事实证明,突出显示的块几乎就是绑定导入表。但我仍然很困惑。为什么此表不在一个部分中?总是这样还是只是某个编译器/链接器的规范?我没有找到有关此特定问题的任何文档。关于这个主题的所有内容基本上都说:

  1. DOS MZ 头文件
  2. DOS 存根
  3. PE 标头
  4. 截面表
  5. 第 1 节
  6. 第 2 节
  7. 第 3 节

...等等

在我遇到这个问题之前,我什至没有意识到这些部分之外的东西(当然,除了我上面列出的那些)。

[编辑]

概念证明(因为 Mox 不相信我):

【问题讨论】:

  • 你怎么能说突出显示的块是绑定导入表的一部分?您使用了哪些(其他)知名的 PE 工具来确认此断言?
  • @mox 好吧,这很容易。 DataDirectory 数组从偏移量 0x178 开始,到偏移量 0x1EF(包括两者)结束。该数组的第 12 个元素位于 0x1D0 并包含绑定导入表的 RVA。如果您查看屏幕截图,您可以很容易地看到该位置指向 0x2E8,这是突出显示部分的一部分。我还尝试用 00 填充选择,这会“破坏”二进制文件(无法再启动)。将 RVA 和 BIT 的大小设置为 0 会导致二进制文件重新启动,这只是另一个指示。但是,我也用 LordPE 仔细检查了它。

标签: windows executable portable-executable coff


【解决方案1】:

据我在 LordPe 中看到的,iexplore.exe 的 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 条目是空的。

【讨论】:

  • 也许你有不同的版本(你试过 64 位版本吗?)。但我可以向你保证我的发现是正确的
【解决方案2】:

IEXPLORE.EXE 的 32 位和 64 位版本都没有 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 条目。

这是 LordPE 的快照,显示了 Windows 7 机器上的 64 位版本的 IEXPLORE.EXE 和(绿色)缺少的 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 条目:

您似乎没有查看正确的目录条目。

【讨论】:

  • 我从未更新过我的 IE。所以我确信这与不同的版本有关。我正在寻找正确的条目,相信我:)。我发现,这有时会出现在 Microsoft 二进制文件中,因为节表之后的那些字节只是未使用的字节,有时用于存储绑定导入表。但它仍然没有记录。
  • 很高兴看到您的图片。你能提供(发送?)吗?
【解决方案3】:

IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 等数据目录可以存在于部分之外。存在于任何已知部分之外的数据目录的另一个示例是IMAGE_DIRECTORY_ENTRY_CERTIFICATE 数据目录,它是在签署可执行文件时用于存储证书信息的数据目录。

数据目录可以指向节外、节内的数据,也可以指向整个节。 IMAGE_DIRECTORY_ENTRY_RESOURCE 数据目录指向整个“.rsrc”部分。某些数据目录指向已知部分,这些部分记录在 PE format specification by Microsoft 中。

【讨论】:

    【解决方案4】:

    可以将绑定导入表之类的项目写入链接器希望将它们放入原始图像的任何位置。它只是用表覆盖零字节并使指针在数据目录中正确。您甚至可以用导入表覆盖 DOS 标头或存根的中间部分,只要目录中的指针正确,它就可以工作。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多