windows - 如果更改 PE 的 .text,是否需要修改任何 header ?

标签 windows exe binaryfiles portable-executable

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

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

为了让 .exe 仍然工作,我需要修改任何 header 吗?

我需要在 PE 文件中注意什么,以确保它在 .text 手术后仍然按预期工作?

最佳答案

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

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

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

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

关于windows - 如果更改 PE 的 .text,是否需要修改任何 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66910126/

相关文章:

java - Java 中的 "last accessed"与 "last modified"文件日期(Windows)

c++ - DLL依赖问题/SetDLLDirectory

创建线程

c++ - 双字节交换

compilation - 如果保留二进制文件,删除目标文件是否安全?

Rselenium - 如何禁用 Firefox 配置文件中的图像

c# - 向外部调用程序 C++ 返回一个值

python - 无法在 Windows Powershell 中打开 python.exe

docker - 如何在 Docker 上运行 .exe 文件?

c - 将 "blank"数据 block 分配给 .dat 文件的最简单方法