【问题标题】:Is it possible to modify an executable file on runtime?是否可以在运行时修改可执行文件?
【发布时间】:2011-12-08 21:40:26
【问题描述】:

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

【问题讨论】:

  • Self modifying code 是一个好的开始
  • @parapurarajkumar:我不认为我们在这里讨论的是自修改代码;可能它只是附加在真正可执行文件末尾的某种存档。
  • 欢迎来到 StackOverflow。请编辑您的问题以准确指定您需要实现的功能。期望人们去研究外部网站以弄清楚您在问什么是不合理的。如果由于某种原因该站点不可用,它会使您的问题变得毫无意义(并且对于未来的读者来说无法搜索)。当您使用它时,您也许应该添加一个标签来指示您所针对的操作系统;它们之间的可能性有所不同。谢谢。 :)
  • 另外,您可能希望查看此question 以及从那里链接的页面(请参阅tagged 列表右下方的Linked Questions 列表)。
  • 可执行文件是文件,您可以像修改任何其他文件一样修改它们(不过,取决于操作系统,而不是在它们运行时,您必须处理副本)。你可以感谢John von Neumann 和Alan Turing。您在使用普通文件操作功能时遇到了什么样的问题?

标签: c++ windows runtime storage executable


【解决方案1】:

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

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

下次用户“运行”修改后的“exe”时,你的.exe再次被解压并运行,它可以再次操作自解压的.exe。

我希望这对你有意义。

这只是一个最好的猜测!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      只要你不弄乱文件的标题和主要内容,它应该仍然可以被操作系统加载。

      但是,您牺牲了您的 EXE 的任何签名 - 您可能需要应对各种权限问题...

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

      如果您知道 EXE 文件的结构并正确重建它,您可以对它执行任何操作。

      【讨论】:

      • 我认为您无法获得当前正在执行的文件的可写句柄。
      • 这就是问题所在!无法使用使用 CreateFile/WriteFile 的标准方法修改可执行文件。但似乎我写的应用程序实现了某种解决方法......
      • 如果 Windows 不允许您写入执行文件(这并不奇怪),那么您必须提取资源并在其他地方操作它们(或将执行转移到另一个模块,该模块会打开并修改原文)。
      【解决方案4】:

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

      再一次,您的可执行文件很可能位于Program Files\,这对于普通(非提升)用户是不可写的。

      【讨论】:

      • 不幸的是,这是一个仅限 NTFS 的功能,据我所知,它通常不适用于 DVD/CD/USB 密钥等。不久前,Raymond Chan 写过一些关于表明Windows Shell 团队停止使用备用数据流,因为它的不可移植性(我认为您可以推断,如果 Windows Shell 避免使用它,它实际上一定是非常有限的)
      • 好吧,CD 或 DVD 上的自修改 EXE 将面临相当独特的挑战 ;)。至于 Windows Shell,你可能指的是Why are custom properties created on Windows 2000 lost...
      • 感谢您添加链接。是的,这就是我所指的。 OP 所指的 SmartUtils 不使用流,因此不受该限制。不确定 OP 的要求是什么,但值得考虑该限制。 ;)
      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 2017-04-26
      • 2018-12-28
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多