2011-12-08 167 views
0

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

+1

[自我修改代码](http://en.wikipedia.org/wiki/Self-modifying_code)是一个好开始 –

+1

@parapurarajkumar:我不认为我们在这里讨论的是自修改代码;可能它只是在真正的可执行文件末尾添加的一些档案。 –

+0

欢迎来到StackOverflow。请编辑您的问题,以确切指定您需要实现的功能。期望人们去研究一个外部网站,以便弄清楚你所要求的是不合理的。如果由于某种原因网站不可用,它会使您的问题变得毫无意义(并且对于未来的读者而言是不可测量的)。当你处于这种状态时,你可能应该添加一个标签来指明你的目标操作系统;他们之间有什么不同。谢谢。 :) –

回答

1

如果所有你真的问的是SmartUtils移动存储如何做它的魔力,那么我建议,这是一个自动执行的zip压缩包。档案的EXE(就像WinZip或7-Zip创建的那样)从临时文件夹中自动提取并执行你的应用程序exe,并为你提供一个API,这些API可以解压缩,处理,执行档案。

因此,Windows从不尝试修改正在运行的.exe。相反,你的.exe文件(temp文件解压缩为& run)是正在执行的操作(以及绑定到它的库),它操纵源.exe(真正的自执行存档 - 可能是.zip)。

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

我希望对你有意义。

而这只是一个最好的猜测!

1

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

典型方案是一个整数0×00000000写入到可执行的末尾,再附加的每个文件,然后在字节它的大小。

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

0

您可以附加一个TOC指针到一个EXE(和可能是一个神奇的ID的Cookie),所以你可以验证它是一个TOC指针,然后用它来备份到每个追加记录的开始。

只要你不惹了该文件的标题&主要内容,它应该还是由操作系统加载。

但是,你牺牲任何签署您的EXE了 - 你可能有不同的权限问题,以抗衡...

我写的工具打开一个Windows EXE我的开发环境,它推断的资源,修改各种各样的东西,并重新包装整个事情。我们使用它来将beta版标记为release(所以它修改了版本记录)。

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

+0

我不认为你可以获得当前正在执行的文件的可写句柄。 –

+0

这就是问题!使用CreateFile/WriteFile标准方法不能修改可执行文件。但似乎我写的应用程序实现了某种解决方法... –

+0

如果Windows不会让你写入正在执行的文件(并不奇怪),那么你必须提取资源并在其他地方操作它们(或将执行转移到不同的模块,这会打开并修改原始模块)。 – Mordachai

0

因为这个被标记为Windows,您也可以考虑“备用数据流”。这使您可以将单个文件视为目录。您可以将一个名为Program.EXE:ExtraData的流添加到您的程序中,并使用正常的文件功能写入该流。

话又说回来,你的可执行文件极有可能会在Program Files\,这是不写的正常(非升高)的用户。

+0

不幸的是,这是一个NTFS专用功能,据我了解,通常不能在DVD/CD/USB密钥等上使用。 有一段时间,Raymond Chan写道,表示Windows Shell团队停止使用因为它不可移植(我认为你可以推断出如果Windows Shell避免这种情况,它肯定是相当有限的) – Mordachai

+2

那么,CD或DVD上的自修改EXE将会面临独特的挑战;)。至于Windows Shell,可能是指[为什么在Windows 2000上创建的自定义属性丢失了...](http://blogs.msdn.com/b/oldnewthing/archive/2011/05/27/10168422 .aspx) – MSalters

+0

感谢您添加链接。是的,这就是我所指的。 OP的SmartUtils指的是不使用流,因此不会受到这种限制。不确定OP的要求是什么,但值得考虑这个限制。 ;) – Mordachai

相关问题