【问题标题】:How to permanently store information using C program?如何使用 C 程序永久存储信息?
【发布时间】:2020-08-15 08:47:04
【问题描述】:

我试图从用户那里获取程序每次运行时都会记住的输入。我想在 C 中执行此操作。基于我对计算机的有限知识,这将存储在存储/硬盘驱动器/ssd 而不是 RAM/内存中。我知道我可以使用数据库或写入文本文件,但我不想使用外部文件或数据库,因为我认为数据库对此有点矫枉过正,并且可能会弄乱外部文件由用户。我该如何做到这一点(让用户输入一次输入并让程序永远记住它)?谢谢! (如果有人需要我澄清我的问题,我很乐意这样做,当我得到答案时,我会为未来的用户澄清这个问题。)

【问题讨论】:

  • 任何需要永久存储在用户 PC 上的东西都可能被用户弄乱。您最多可以通过使用操作系统特定的功能让他们更难搞砸它
  • 除非有任何非常不寻常且对系统稳定性有风险的事情,否则您将需要创建一个文件(或数据库,最终由文件支持)。您始终可以将文件放置在用户不会轻易到达的位置。
  • @nanofarad 商业程序如何做到这一点?他们使用什么文件类型?
  • @Serket 他们使用开发人员想要的任何文件格式。您正在编写一个程序,因此您可以创建任何您想从文件中读取/写入的逻辑,例如文本表示、序列化、protobuf 等。您可以将其放入 Linux 上的隐藏主目录或 Windows 上的 AppData。
  • Hint,然后像打开文件一样打开您的可执行文件,寻找该存储空间,并用正确的填充和对齐量覆盖。恶意软件经常做类似的事情。

标签: c storage hard-drive


【解决方案1】:

人们以各种方式做到了这一点。从最好到最坏的顺序(在我看来):

  1. 使用registry 或等效项。这就是它的用途。
  2. 使用environment variable。 IMO 这很容易出错,可能不是您真正想要的。
  3. 将文件存储在用户的计算机上。简单易行。
  4. 在服务器上存储文件并通过网络读取/写入服务器。很烦你必须使用网络,但没关系。
  5. 在磁盘上修改您自己的二进制文件。作为一种学习体验,这很有趣,但在生产代码中通常是不可取的。有时仍然可以完成,尤其是使用安装程序。
  6. 生成一个“永不”终止的后台进程。这比使用文件更糟糕。

【讨论】:

  • 如何修改自己的二进制文件。一些名叫主教的人也提出了这个建议,但我不知道从哪里开始。他还表示,很多恶意软件都使用这种方法。
  • 可以使用openreadwrite修改您的二进制文件。困难的部分是找到哪些部分可以安全写入而不会弄乱你的程序。这在很大程度上取决于您的操作系统。如果您可以使用更好的文档记录方法,例如注册表,您会做得更好。
  • 您说这将是一次有趣的学习经历,而这正是我想从这个问题中得到的。我准备好迎接学习如何做到这一点的挑战。我可以从哪里开始?
  • 您使用的是什么操作系统?您需要找出可执行文件的格式,然后寻找可以解析这些文件的库。例如,在 Windows 上,您正在寻找 PE 修改库。我推荐 Avast 的 pelib。
  • 我在 Mac 上。有没有可以推荐的用于解析 UNIX 可执行文件的库?
【解决方案2】:

如果用户真的想修改文件,您将无法阻止他们。你可以做的是创建一个文件名或扩展名,使其明显不应该被修改,或者对用户隐藏。

【讨论】:

  • 我觉得创建一个文件只是为了存储一行数据有点矫枉过正
  • 有没有办法在程序中嵌入文件?
  • 我认为这不是一个好习惯。另外,在这种情况下可能无法实现,因为您的程序在用户运行时已经编译完毕。
  • 为此创建一个文件一点也不为过。文本文件实际上与其内容一样重,因此您将创建一个非常小且无害的文件
【解决方案3】:

实际上没有任何常见的方法可以写入文件并同时阻止用户访问它。您需要操作系统/平台级别的支持才能拥有某种受保护的存储。

唯一真正常见的替代方法是将信息在线存储在您控制的服务器上,然后通过网络从那里获取信息。您可以缓存具有到期日期的加密签名本地副本,以避免每次运行程序时都必须连接。当然,如果您将其作为某种 DRM 或类似措施(例如,限时演示),您还需要保护您的软件不被修改。

(请注意,您在评论中提到的修改程序本身与修改其他文件并没有什么不同。特别是,用户可以从备份中恢复程序的早期版本或重新下载它,即使是普通用户也可能会尝试。另外,软件上的任何签名都会因您的修改而失效,并且可能会触发杀毒软件。)

如果您只是想将文件隐藏在某个地方以防止临时用户(仅),请给它一个晦涩的名称并使用文件系统属性和命名将文件设置为隐藏(在 *nix 系统中,. 作为第一个文件名字符)。 (根据操作系统,您可以使其隐藏到何种程度可能会受到权限和/或沙盒的阻碍。)

另外请注意,如果您的目标是向用户隐藏信息,您应该以某种方式对其进行加密。这包括编写它的程序中的任何数据。

编辑:如果我猜错了,想要这样做的原因只是为了保持“干净”,那么只需将其存储在平台通常的“用户设置”区域。例如,Windows 上的 AppData 或注册表,macOS 上的用户默认值或 ~/Library/Application Support,通用 *nix 系统上的“dotfile”等。请勿因此修改应用程序本身。

【讨论】:

    【解决方案4】:

    如果您想要持久化数据,典型的方法是将其存储到文件中。只需使用 FILE* 即可开始您的业务。

    为此使用数据库可能有点过头了,这取决于您希望以后如何访问数据。

    如果您只是从文件中加载数据并通过它进行搜索,那么就不需要数据库,如果您有大量数据并且想要进行复杂的搜索,那么数据库就是您的选择。如果您需要冗余、用户处理、安全性,那么请选择一个数据库,因为每个数据库的开发人员已经花费了大量时间来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 2020-03-20
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多