【问题标题】:What is the relationship between sections and data directories in a PE file?PE文件中的section和数据目录有什么关系?
【发布时间】:2015-06-16 14:37:26
【问题描述】:

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

我了解节标题的名称值可以更改,因此不能保证对特定块的引用,因此应依赖此类数据目录来查找文件中的特定块。

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

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

【问题讨论】:

    标签: windows portable-executable


    【解决方案1】:

    Section 旨在用“几乎”相同的内存保护来打包内容。

    以 calc.exe 为例:

    这里的代码段有一个段保护(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),此处为 @987654325 @(2/2) 和.chm 格式(1/2)(2/2)):

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

    如果这些部分共享相同的 IMAGE_SCN_MEM_READ / IMAGE_SCN_MEM_WRITE 保护,这通常是正确的:这就是为什么在某些情况下您可能会将导入表放入代码部分(即使很困难,导入表显然也不会被执行)。由于您只能阅读代码并导入部分(您不能写入它们),因此链接器足以将它们合并到同一部分中。

    来自同一篇文章:

    例如,可以将 .rdata 合并为 .text,但不应该 将 .rsrc、.reloc 或 .pdata 合并到其他部分。视觉之前 Studio .NET,您可以将 .idata 合并到其他部分。在视觉 Studio .NET,这是不允许的,但链接器经常合并部分 在发布时将 .idata 放入其他部分,例如 .rdata 构建。

    AFAIK,资源 (.rsrc) 和重定位 (.reloc) 部分总是单独放置。资源部分被单独留下的原因可能是因为some APIs 依赖它。

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

    【讨论】:

    • 数据目录更像是解释器在内存中设置进程时的快捷方式,它们并不是执行 pov 中二进制文件的真正重要部分
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多