PE文件中的节和数据目录之间有什么关系?

时间:2015-06-16 14:37:27

标签: windows portable-executable

我试图更好地理解PE格式,并且我想知道PE文件中节和数据目录之间的关系是什么。打开一个PE文件我注意到它们经常重叠,但我不清楚为什么或它们如何相关,而且微软的官方PE文件格式规范似乎并没有真正实现这一点。更清楚。

我知道可以更改节标题的名称值,因此不能保证对特定块的引用,并且应该依赖这些数据目录来查找文件中的特定块。 / p>

在我打开的示例PE文件中,我注意到.text部分与导入地址表数据目录头具有相同的偏移量,尽管IAT大小列为8,而.text段大小为6804。对比资源数据目录标题表明它从16384开始,长度为1568 - 与.rsrc部分的条目精确对齐。后者对我有意义,前者没有。

那么部分与数据目录的不同用途是什么?为什么这两个概念都存在,为什么它们有时会重叠在它看起来没有意义的地方呢?

1 个答案:

答案 0 :(得分:4)

部分用于包装"几乎"相同的记忆保护。

例如,让我们来看calc.exe:

enter image description here

此处的代码部分的部分保护(IMAGE_SECTION_HEADER.Characteritics)设置为0x60000020:

IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ

.idata部分(导入部分)的值为0x40000040:

IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

在某些情况下,链接器可能会决定将相同的内存保护应用于不同的部分并将它们合并在一起(您可以使用/MERGE链接器选项强制执行此设置)。

引用Matt Pietrek的精彩的两篇文章"深入研究Win32可移植可执行文件格式" (可在此处找到(1/2) (2/2)(1/2) (2/2)和.chm格式(1/2) (2/2)):

  

如果两个部分具有相似的兼容属性,通常可以   在链接时合并为一个部分

如果这些部分共享相同的IMAGE_SCN_MEM_READ / IMAGE_SCN_MEM_WRITE保护,则通常会出现这种情况:这就是为什么在某些情况下您可能会将导入表放入代码部分(甚至难以导入表显然不是要执行的)。因为你只能读取代码和导入部分(你不能写入它们),这足以让链接器将它们合并到同一部分。

来自同一篇文章:

  

例如,可以将.rdata合并到.text中,但你不应该这样做   将.rsrc,.reloc或.pdata合并到其他部分。在Visual之前   Studio .NET,您可以将.idata合并到其他部分。在视觉中   Studio .NET,这是不允许的,但链接器经常合并部分   执行发布时,.idata会进入其他部分,例如.rdata   建立。

AFAIK,资源(.rsrc)和重定位(.reloc)部分始终保持不变。资源部分保持不变的原因可能是因为some APIs依赖它。

另一方面,数据目录告诉您在哪里可以找到PE文件的重要部分(导入,导出,调试,TLS,资源,重定位等),即使合并了不同的部分,您仍然可以找到相关的数据。