C++ 将数据存储在可执行文件中
我只是好奇了很久 应用程序是否可以在自己的可执行文件中存储一些可变数据(如配置和选项) 例如:是否可以设计一个单一的可执行文件,如果用户运行,设置一些配置,将其复制到另一台PC,然后应用程序在新PC中按其最后一个设置配置运行 这有可能吗C++ 将数据存储在可执行文件中,c++,C++,我只是好奇了很久 应用程序是否可以在自己的可执行文件中存储一些可变数据(如配置和选项) 例如:是否可以设计一个单一的可执行文件,如果用户运行,设置一些配置,将其复制到另一台PC,然后应用程序在新PC中按其最后一个设置配置运行 这有可能吗 更新:这似乎是可能的。那怎么办呢?是的,这是可能的。你可能不应该这么做 Mac OS X确实有“捆绑包”的概念,它们将可执行文件及其资源组合成一个“包”(文件以.app结尾),但我不确定应用程序修改自己的捆绑包是典型的,据我所知,大多数其他操作系统也不是这样工作
更新:这似乎是可能的。那怎么办呢?是的,这是可能的。你可能不应该这么做 Mac OS X确实有“捆绑包”的概念,它们将可执行文件及其资源组合成一个“包”(文件以.app结尾),但我不确定应用程序修改自己的捆绑包是典型的,据我所知,大多数其他操作系统也不是这样工作的。它更像是一种与代码一起存储图像和音频等的工具,而不是存储程序运行时要修改的配置数据。Ya,您可以这样做。 这很危险 你可能会搞砸,使应用程序无法运行 修改可执行文件是病毒和特洛伊木马经常做的事情。 他们的病毒扫描器很可能会注意到,阻止它,并将你贴上恶棍的标签
我对邪恶略知一二:)在可执行文件运行时修改它是一件痛苦的事。编译器可能应用的任何编译器优化都会使任务变得更加复杂,因为它会更改程序的结构,并且可能不允许您有一个“空白空间”来进行写入。是和否-
- 是的,在可执行映像中有足够的空间可以放置数据。您可以为此添加一个预先初始化的数据段,并将数据写入其中;或资源,也可以滥用某些段填充空间来存储值。您可以控制链接器设置,以便保证有空间
- 不,您可能无法在运行时执行此操作:
- Windows的缓存机制将锁定加载的任何可执行文件的磁盘上的文件。这样,如果需要卸载某个段,它就不必担心将数据写入缓存,它可以保证可以从磁盘上的同一位置获取相同的数据。如果操作系统确实遵守这一点,您可以通过使用其中一个.exe load copy to temp标志(从CD、从网络)运行来解决此问题,或者您可以将一个helper exe写入temp以将控制传输到,卸载原始文件,然后修改卸载的文件。(在Linux等系统上,这要容易得多。inode实际上是一个引用计数-即使它们具有相同的默认锁定策略,您也可以复制可执行文件,将设置编辑到副本中,然后在仍在执行时将其移到原始文件上。)
- 病毒检查器几乎肯定会因此而攻击你
扩展“如何”部分- 为了知道将数据写入文件的位置,您有两个或三个选项:
对于windows PE文件,可以在文件末尾写入数据。在写入自己的数据之前,您需要知道EXE大小,以便在第二次写入之后,您知道从EXE文件中的哪个位置开始写入
此外,在文件运行时,您不能修改该文件。主程序需要在某个地方提取并运行临时exe,以便在主程序完成时,临时exe将配置写入主exe文件。。困难。困难 但为了做到这一点,您基本上必须将文件读入缓冲区,或者读入另一个文件,您可以使用direct fstream。但是,请确保使用ios::binary标志。附加缓冲区或文件,我的意思是,实际上附加数据是一件非常简单的事情。问题在于增加它自己 下面是我要做的: 首先编写一个程序,将程序打包到其他程序中。你可能已经掌握了这些知识。一旦你有了它,让它自己打包到另一个程序中,确保你已经安排了外部消息传递或参数传递。然后,在主程序上,您只需解压缩该程序,并传入一个指向您创建的(临时)文件的链接,该文件将附加到您自己。终止当前程序。让从机附加数据并调用您的p