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

时间:2011-12-08 21:40:26

标签: c++ windows runtime storage executable

是否可以在运行时修改可执行文件(我问的是Windows XP / Vista / 7 / Server)?我刚刚评估了SmartUtils Portable Storage application。它可以创建所谓的“托管可执行存储文件”,在运行时自行修改它们......这样的存储文件就像标准的自解压存档(数据被附加到可执行模块),但主要区别在于它能够在没有主程序的情况下查看和修改其内容。这怎么可能?我需要在我的项目中使用类似的功能(C ++):我希望能够创建可以修改附加到它的数据的可执行文件。

4 个答案:

答案 0 :(得分:2)

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

因此,Windows永远不会尝试修改正在运行的.exe。相反,你的.exe(临时文件提取和运行)是正在执行的(以及绑定到它的库),它操纵源.exe(实际上是一个自执行的存档 - 可能是.zip)。

下次用户“运行”修改后的“exe”时,再次提取您的.exe文件。运行,它可以再次操纵自解压.exe。

我希望这对你有意义。

这只是一个最好的猜测!

答案 1 :(得分:1)

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

典型的方案是将0x00000000整数写入可执行文件的末尾,然后附加每个文件,后跟其大小(以字节为单位)。

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

答案 2 :(得分:0)

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

只要你不搞乱文件的标题&主要内容,它仍然可以由操作系统加载。

但是,你牺牲了你的EXE签名 - 你可能有各种权限问题需要解决......

我为我的开发环境编写了一些工具,用于打开Windows EXE,推断其中的资源,修改各种资源,并重新打包整个事物。我们使用它来标记beta版本(因此它会修改版本记录)。

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

答案 3 :(得分:0)

由于此标记为Windows,您可能还会考虑“备用数据流”。这允许您将单个文件视为目录。您可以将名为Program.EXE:ExtraData的流添加到程序中,并使用普通文件函数写入。{/ p>

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