以可执行文件存储数据

MBZ*_*MBZ 10 c++

我很好奇这件事很久了.

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

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

这有可能吗?

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

Rup*_*Rup 11

是的没有 -

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

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

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

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

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


扩展"如何"部分 -

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

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

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

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


Evi*_*ach 5

是的,你能做到。这是有风险的。

您可能会搞砸并导致应用程序无法运行。

修改可执行文件是病毒和木马经常做的事情。他们的病毒扫描程序很可能会注意到、阻止它,并将您标记为作恶者。

我对邪恶略知一二:)