是否可以在运行时修改可执行文件

Is it possible to modify an executable file on runtime?

本文关键字:修改 可执行文件 运行时 是否      更新时间:2023-10-16

是否可以在运行时修改可执行文件(我正在询问Windows XP/Vista/7/Server)?我刚刚评估了SmartUtils便携式存储应用程序。它可以创建所谓的"托管可执行存储文件",在运行时修改自己…这种存储文件类似于标准的自提取存档(数据附加到可执行模块),但主要区别在于您可以在没有主程序的情况下查看和修改其内容。这怎么可能?我需要在我的项目(c++)类似的功能:我希望能够创建可执行文件,可以修改附加到它的数据。

如果你真正想问的是SmartUtils Portable Storage是如何实现它的魔力的,那么我建议它是一个自动执行的zip存档。档案的EXE(就像WinZip或7-Zip创建的那样)自动从临时文件夹中提取并执行应用程序EXE,并为您提供一个API,该API归结为提取,操作和修改原始自动执行档案的方法。

所以Windows永远不会试图修改一个正在运行的。exe。相反,您的.exe(临时文件提取&Run)是正在执行的(以及绑定到它的库),它操作源。exe(实际上是一个自动执行的存档文件-可能是。zip)。

下次用户"运行"修改后的"exe"时,您的。exe再次被提取&运行,它可以再次操作自解压的。exe。

我希望这对你有意义。

这只是一个最好的猜测!

是-一种常见的技术是在可执行文件末尾附加数据文件。

典型的方案是在可执行文件的末尾写一个0x00000000整数,然后在每个文件后面加上它的字节大小。

然后,当可执行文件需要读取数据时,它检查自己文件中的最后4个字节,将其作为文件长度并从自己的文件中复制该字节数,然后检查接下来的4个字节作为另一个长度并将其复制为文件,直到它得到的长度为0000。如果您还需要对文件名进行编码—这会增加一些复杂性,但基本上是相同的想法。

您可以将TOC指针附加到EXE(可能还有一个魔术ID cookie),以便您可以验证它是TOC指针,然后使用它来备份到每个附加记录的开始。

只要你不弄乱文件的头&

然而,你牺牲了你的EXE拥有的任何签名-并且你可能有各种权限问题来应对…

我已经为我的开发环境编写了工具,可以打开Windows EXE,推断其中的资源,修改各种资源,并重新打包整个东西。我们用它来标记测试版作为发布版(这样它就修改了版本记录)。

如果你知道EXE文件的结构并正确地重建它,你可以对它做任何你想做的事情。

由于这被标记为Windows,您也可以考虑"Alternate Data Streams"。这允许您几乎将单个文件视为目录。你可以添加一个名为Program.EXE:ExtraData的流到你的程序中,并使用普通的文件函数对其进行写入。

然后,您的可执行文件很可能将在Program Files中,这对于普通(非提升)用户来说是不可写的。