以可执行文件存储数据

时间:2011-03-15 18:16:03

标签: c++

我很长时间以来都很好奇。

应用程序是否可以在其自己的可执行文件中存储一些可更改的数据(如配置和选项)?

例如:是否可以设计单个可执行文件,如果用户运行,设置一些配置,将其复制到另一台PC,然后应用程序通过其在新PC中的最后一次设置配置运行。

这有可能吗?

更新:似乎有可能。怎么样?

6 个答案:

答案 0 :(得分:11)

是和否 -

  • 是的,可执行图像中有足够的空间可以放置数据。您可以为此添加预先初始化的数据段,并将数据写入其中;或者您可以滥用某些段填充空间来存储值。您可以控制链接器设置,以确保存在空间。

  • 不,您可能无法在运行时执行此操作:

    1. Windows'缓存机制将锁定任何已加载可执行文件的磁盘上的文件。这样,如果需要卸载段,则无需担心将数据写入高速缓存 - 它可以保证它可以从磁盘上的相同位置获取相同的数据。你可以通过运行一个.exe加载复制到临时标志(从CD,从网络)来解决这个问题,如果操作系统实际上尊重它,或者你可以写一个帮助程序exe到temp来传输控制to,卸载原始文件然后修改卸载的文件。 (这在Linux等上更容易,其中inode实际上是引用计数 - 即使它们具有相同的默认锁定策略,您可以复制可执行文件,将设置编辑到副本中,然后在仍然执行时将其移动到原始文件上。)

    2. 病毒检查员几乎肯定会因此而跳过你。

总的来说,我认为只要将设置写入注册表或某处,并提供和导入/导出设置选项(如果您认为需要它),这是一个更好的主意。


扩展'how'部分 -

为了知道将数据写入文件的位置,您确实有两个或三个选项:

  1. 使用魔术字符串,例如声明一个在开始时具有已知序列的全局静态变量,例如“---我的数据---”,然后是足够的空白空间来存储你的设置。打开磁盘上的文件,扫描它的序列(注意扫描代码实际上不包含字符串)件,即所以你找不到扫描代码) - 然后你找到了要写入的缓冲区。执行修改后的副本时,它将具有全局静态数据。

  2. 了解并解析二进制文件中的可执行标头数据,以找到您使用过的位置。一种方法是在链接器中向二进制文件添加命名部分,例如称为“mySettings”的4K部分将其标记为初始化数据。您可以(虽然这是我所不知的)将其作为外部缓冲区连接起来,您可以在代码中通过名称来引用它。要编写,找到可执行文件头中的section表,找到一个名为'mySettings'的表,你将在二进制文件中找到你需要修改的偏移量。

  3. 硬编码需要读/写的缓冲区的偏移量。构建文件一次,在十六进制编辑器中找到偏移量,然后将其硬编码到程序中。由于程序段通常四舍五入到4K,你可能会通过微小的变化获得相同的硬编码值,尽管它可能只会在你下面发生变化。

答案 1 :(得分:4)

呀,你可以做到。 这很危险。

你可能搞砸了,让应用程序无法运行。

修改可执行文件是病毒和特洛伊木马倾向于做的事情。 他们的病毒扫描程序可能会注意到,阻止它,并将你打扮成邪恶的行为者。

我对邪恶有点了解。)

答案 2 :(得分:2)

如果是Windows PE文件,您可以在文件末尾写入数据。在编写自己的数据之前,您需要知道EXE大小,以便在第二次写入时,您知道从exe文件中的哪个位置开始编写。

此外,您无法在文件运行时修改该文件。您的主程序需要在某处提取并运行临时exe,以便在主程序完成时,temp exe将配置写入主exe文件。

答案 3 :(得分:1)

是的,这是可能的。你可能不应该这样做。

Mac OS X确实具有“捆绑”的概念,它将可执行文件及其资源组合成一个“包”(以.app结尾的文件),但我不确定应用程序修改自己的捆绑包是否典型,据我所知,大多数其他操作系统都不会那样工作。它更像是一种存储图像和音频的工具以及代码,而不是存储程序运行时将要修改的配置数据。

答案 4 :(得分:0)

在可执行文件运行时修改它是一件痛苦的事。编译器可能应用的任何编译器优化都会使任务变得更加复杂,因为它改变了程序的结构,并且可能不允许您有一个“空白”来写入。

答案 5 :(得分:-1)

困难。难。难。

但是为了做到这一点,你基本上必须将文件读入缓冲区,或者进入另一个文件,你可以使用直接的fstream。但请确保使用ios :: binary标志。并附加缓冲区或文件,我的意思是实际附加数据是一个非常简单的事情。问题在于增加自身。

这就是我要做的事情:

首先编写程序将程序打包到其他程序中。你可能已经掌握了这些知识。一旦你拥有它,让它自己打包到另一个程序,请确保你已安排外部消息或传递参数。然后在您的主程序上,您可以简单地解压缩该程序并传递一个链接到您创建的文件(临时),您希望自己添加该文件。杀死你当前的节目。让奴隶附加数据并再次调用你的程序。

blam 附加的可执行文件。