C++ 将数据存储在可执行文件中

C++ 将数据存储在可执行文件中,c++,C++,我只是好奇了很久 应用程序是否可以在自己的可执行文件中存储一些可变数据(如配置和选项) 例如:是否可以设计一个单一的可执行文件,如果用户运行,设置一些配置,将其复制到另一台PC,然后应用程序在新PC中按其最后一个设置配置运行 这有可能吗 更新:这似乎是可能的。那怎么办呢?是的,这是可能的。你可能不应该这么做 Mac OS X确实有“捆绑包”的概念,它们将可执行文件及其资源组合成一个“包”(文件以.app结尾),但我不确定应用程序修改自己的捆绑包是典型的,据我所知,大多数其他操作系统也不是这样工作

我只是好奇了很久

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

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

这有可能吗


更新:这似乎是可能的。那怎么办呢?

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

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

Ya,您可以这样做。 这很危险

你可能会搞砸,使应用程序无法运行

修改可执行文件是病毒和特洛伊木马经常做的事情。 他们的病毒扫描器很可能会注意到,阻止它,并将你贴上恶棍的标签


我对邪恶略知一二:)

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

是和否-

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

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

  • Windows的缓存机制将锁定加载的任何可执行文件的磁盘上的文件。这样,如果需要卸载某个段,它就不必担心将数据写入缓存,它可以保证可以从磁盘上的同一位置获取相同的数据。如果操作系统确实遵守这一点,您可以通过使用其中一个.exe load copy to temp标志(从CD、从网络)运行来解决此问题,或者您可以将一个helper exe写入temp以将控制传输到,卸载原始文件,然后修改卸载的文件。(在Linux等系统上,这要容易得多。inode实际上是一个引用计数-即使它们具有相同的默认锁定策略,您也可以复制可执行文件,将设置编辑到副本中,然后在仍在执行时将其移到原始文件上。)

  • 病毒检查器几乎肯定会因此而攻击你

总的来说,我认为最好是将设置写入注册表或其他地方,如果您认为需要的话,提供和导入/导出设置选项


扩展“如何”部分-

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

  • 使用一个神奇的字符串,例如,声明一个全局静态变量,该变量的开头是一个已知的序列,例如“--my data here--”,后面是足够的空间来存储您的设置。打开磁盘上的文件,扫描该序列(注意扫描代码实际上并不包含完整的字符串,也就是说,您不会找到扫描代码),然后您就找到了要写入的缓冲区。当修改后的副本被执行时,它的数据已经在全局静态文件中

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

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


  • 对于windows PE文件,可以在文件末尾写入数据。在写入自己的数据之前,您需要知道EXE大小,以便在第二次写入之后,您知道从EXE文件中的哪个位置开始写入


    此外,在文件运行时,您不能修改该文件。主程序需要在某个地方提取并运行临时exe,以便在主程序完成时,临时exe将配置写入主exe文件。

    。困难。困难

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

    下面是我要做的:

    首先编写一个程序,将程序打包到其他程序中。你可能已经掌握了这些知识。一旦你有了它,让它自己打包到另一个程序中,确保你已经安排了外部消息传递或参数传递。然后,在主程序上,您只需解压缩该程序,并传入一个指向您创建的(临时)文件的链接,该文件将附加到您自己。终止当前程序。让从机附加数据并调用您的p