如何使文件完全不可变(不可删除和只读)?

时间:2009-08-26 10:42:17

标签: windows security delphi winapi

我需要让文件真正只读 - 保持原样。没有删除,没有任何内容。

(设置'ReadOnly'属性不是一个选项)

我现在看到一些方法:

  1. 使用程序保持文件打开。缺点:人们可以杀死进程然后文件关闭。

  2. 使用程序设置安全属性。缺点:可以删除文件。此外,可以更改属性。

  3. 有什么想法吗?此外,我们将非常感谢示例代码(最好是在Delphi中)。

    更新:到目前为止,感谢所有答案。他们真的很棒。我意识到我不是很清楚。我们要解决的问题是:

    有一些类似.txt的文件包含敏感信息。我们的客户希望确保这些文件不会在其计算机上“幕后”更改。我们应该提一下,他们的PC很容易被恶意软件感染,专门用来做这件事。我们的客户应该能够使用记事本,写字板等打开这些文件,但他们接受这些文件是只读的。如果我们的任何客户采取决定性的行动,如进入“安全模式”等,并从他们的责任篡改文件。我们应该防范任何恶意软件,包括零日攻击。 (因此,经典的防病毒解决方案并不合适)。

    你现在可以提出一些想法吗?

    PS:我最诚挚的道歉是从一开始就不那么清楚。

12 个答案:

答案 0 :(得分:17)

这是“如果真的会发生什么?”的问题。它与操作系统无关,这些要点同样适用于任何通用计算机。

想象一下,有办法以某种方式创建一个不可变的文件。

  • 有什么能阻止某人用不可变文件(或许多文件)填满文件系统?

  • 如果有人用操作系统需要的路径名创建不可变文件怎么办(Windows示例 - 某些用户使用NTUSER.DAT,* nix示例 - / bin / ls等)?

  • 如果操作系统决定必须移动文件(例如,在对文件系统进行碎片整理或重新组织时),该怎么办?

  • 如果一个恶意软件用自己的副本替换系统文件然后使该文件不可变,以防止任何人清理系统该怎么办?

我觉得这个问题现在还不完整。您是否可以对其进行编辑以包含有关您尝试解决的基本问题的更多详细信息?

答案 1 :(得分:14)

你做不到这一点,原因很简单,你不应该被允许。正如米哈尔指出的那样,这有可能对计算机造成严重破坏。

编程道德101:如果您的程序将在其他人的计算机上运行,​​请记住它是他们的财产,而不是您的财产。这意味着他们有权修改和/或删除他们想要的任何内容。尝试像对待您的财产一样对待系统,他们会将您的程序视为恶意软件。

如果您需要确保文件可用,可能是最好的解决方案,Massif的想法是将其作为资源嵌入您的程序中。这样,任何篡改EXE的人都会阻止你使用EXE,如果发生,你就会有更大的问题需要担心。

答案 2 :(得分:12)

刻录光盘。

答案 3 :(得分:7)

确保这些文件不会在“幕后”更改的方法是在文件中添加签名。

要签署文件,例如: 使用文件的全部内容+密码创建一个字符串,并计算字符串的SHA1-Hash。然后在文件的第一行或最后一行添加此哈希值。

检查签名: 读取文件,删除带有散列的行,添加密码,重新计算散列并检查它是否与文件中的相同。

要使用Delphi计算SHA-1-Hashes,您可以使用MessageDigests

答案 4 :(得分:6)

购买PROM和微控制器编程器套件,并将文件刻录到ROM中......

答案 5 :(得分:4)

你注定要失败。如果我启动进入安全模式,即使是Windows也无法阻止我任意删除文件。

如果要更改文件,如何在有问题的文件上设置观察者并将其替换为原始文件?或者将文件嵌入需要它的程序的资源中?

答案 6 :(得分:4)

如果我知道如何执行此操作,我会将其作为错误报告给Microsoft。

答案 7 :(得分:3)

将其刻录为一次性写入媒体。

答案 8 :(得分:2)

你为什么要这个?它对我来说就像一个奇怪的要求。

我认为你不能这样做。我能想到的最好的结果是: 以管理员身份创建文件并设置权限,以便普通用户更改不会更改它(这假设不同的用户)或创建一个应用程序,如果文件发生更改,则会重置该文件。

答案 9 :(得分:2)

您可以使用Windows security acls来保护文件。但是,如果此人可以访问硬件,那么他们总是可以称为引导到另一种模式或操作系统并删除它。

答案 10 :(得分:2)

为什么不加密文件并将其与可执行文件一起打开/关闭?或者将它放在你自己制作的文件系统中?

答案 11 :(得分:2)

来自微软的Raymond Chen最近写了一篇与之密切相关的文章:The way to stop people from copying files to a folder is to use NTFS security, not to block drag/drop。虽然这个提到试图阻止某人将文件复制到特定文件夹,但您可以使用相同的解决方案来解决您的问题。

要正确保护文件并防止篡改,您可以将文件上的ACL设置为具有读取权限但拒绝写入,删除和更改权限。您可以为特定用户,组甚至每个人设置它!该文件的所有者将始终拥有更改权限的权限,因此您无法永久锁定自己(即使您尝试拒绝CREATOR OWNER特殊对象)。请记住,要从安全性对话框中手动设置这些,您必须进入高级权限区域,它们不能从标准页面获得。您可能还希望中断继承,以便该文件仅具有您设置的权限,而不包含其父项。

在这种情况下,最好利用已经存在的选项,这样您就不必尝试破解系统来完成工作。 NTFS具有强大的安全性,无需编写代码即可实现您的目标。您还可以使用与File Security and Access Rights (MSDN)相关的方法直接通过WINAPI使用安全性。您可以在致电第一个CreateFile时提供权限,也可以在事后使用SetNamedSecurityInfoSetSecurityInfo更改权限。

编辑:为了解决恶意软件的问题,您甚至可以拒绝SYSTEM访问,因此即使在系统帐户下运行的服务也无法删除或写入。我实际上在那种方法中照顾了一种讨厌的病毒。它会继续创建一个目录,所以我启动了PE,清空了目录,然后拒绝所有人访问它,包括SYSTEM帐户。在我删除它时,病毒无法传播。