【问题标题】:Do I need to modify any headers if I change .text of PE?如果更改 PE 的 .text,是否需要修改任何标题?
【发布时间】:2021-04-01 18:58:16
【问题描述】:

我想编辑 PE 文件的 .text 部分并插入机器代码或更改机器代码。

最终 .text 最终会比原始大小更大或更小。

要让 .exe 仍然可以工作,我需要修改任何标头吗?

我需要注意 PE 文件中的哪些内容,以确保它在 .text 手术后仍能按预期工作?

【问题讨论】:

    标签: windows exe binaryfiles portable-executable


    【解决方案1】:

    我建议如果 .text 部分最终小于 比原始部分,您只需将其填充,使其大小与原始部分相同,这样您就不必再制作了许多其他变化。如果它最终比原来的更大,那么事情可能会变得相当困难。

    .text 节通常是可执行文件中的第一个节,由于节在内存中根据 PE 头中的“节对齐”条目对齐,因此下一节通常会以下一个整数倍放置在内存中.text 部分结束后的部分对齐方式。通常的部分对齐似乎是 4KiB(0x1000 字节),因此根据 .text 部分的原始大小,在与下一个部分发生冲突之前,您可能有 0 到 4095 个字节的可用空间来扩展 .text 部分在内存中。

    如果内存中有足够的可用空间来进行更改,那么您还必须处理可执行文件本身中各节的对齐方式,这由 PE 标头中的“文件对齐”条目决定。可执行文件中用于更改的可用空间量将是 .text 部分的原始大小与其虚拟大小之间的差异,并且由于通常的文件对齐方式似乎是 512 (0x200) 字节,因此将介于 0 和 511 之间字节。如果文件中没有足够的可用空间(但内存中有足够的空间),则必须将以下部分移动文件对齐的整数倍,并相应地调整每个部分的文件指针。您还需要更新 PE 标头中的“代码大小”值,以说明 .text 部分的大小增加。

    如果您需要将其扩展超过内存中的可用可用空间,那么事情可能会变得非常困难 - .text 之后的部分通常包含可执行代码引用的数据,因此您不能只调整 in-以下部分的内存地址以腾出额外空间,因为这几乎可以保证破坏可执行文件。您可以尝试更新可执行代码以说明对以下部分地址的更改,但您不可能在所有情况下都可靠地执行此操作。

    【讨论】:

    • 我想给.text添加很多代码。所以我想我必须找到所有数据引用并相应地更新地址。这并不容易。
    • @jafarlihi - 我认为找到所有对数据的引用可能很困难/不可能,具体取决于相关的可执行文件。如果您需要添加大量代码,可以创建一个全新的部分,将其放在所有现有部分(内存中和文件中)之后,然后您可以添加任意数量的代码,因为您不受现有可用空间的限制,也不必移动内存中的任何部分。如果这样做,则需要更新 PE 标头中的“代码大小”和“图像大小”值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2021-08-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多