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