【问题标题】:How to make folder uncopyable如何使文件夹不可复制
【发布时间】:2014-02-28 17:45:01
【问题描述】:

我有一个程序可以解密一个 zip 文件,将其解压缩到一个秘密位置,然后在解压缩的文件夹中运行一个程序。我想确保没有外部程序可以将提取文件夹复制到另一个位置(程序完成后将删除秘密文件夹)。

我已经通过使我的解密程序成为“始终在最上面”的程序来消除 Windows 资源管理器,如果它被杀死(通过使用解密程序启动的另一个隐藏程序),它会删除秘密文件夹。我担心的是另一个程序可以查看进程列表,发现文件夹位置并执行复制。

有没有办法防止以编程方式复制目录或文件?

【问题讨论】:

  • 有人可以将调试器附加到正在运行的程序并转储其内容。
  • 使用专用用户帐户运行您的应用程序,然后在您正在工作的文件夹上配置文件夹权限,以便只有该用户可以访问它。
  • 完成后“删除”。存放数据的扇区是否被随机的 1 和 0 覆盖七次? (严肃的问题)。在这种情况发生之前(有时,即使发生这种情况),数据仍然可以恢复。你正在与坚定的对手打一场失败的战斗,那么你愿意走多远?
  • 不,我还没有做到随机覆盖。我怀疑它有什么不同,但它实际上被提取到一个 VHD(这是我然后删除的)。大多数情况下,我正在寻找最简单/最快的方法来使其尽可能安全。

标签: c# windows c#-4.0


【解决方案1】:

Directory.CreateDirectory(string,DirectorySecurity)

您需要创建一个封装所需权限集的DirectorySecurity 对象。最简单的方法是创建一个模型目录,该目录由进程的用户 ID 拥有,并具有所需的权限集(例如,“只有我可以遍历此目录或查看甚至打开其中的任何内容。”)。完成后,使用DirectorySecurity 构造函数重载DirectorySecurity(String, AccessControlSections) 实例化具有相同权限的DirectorySecurity 对象。

当然,另一种方法是创建与上述相同类型的“模型目录”,并创建您的“秘密”工作目录作为其子目录,继承父级的权限集。

至于安全删除磁盘上的内容,看问题“Shredding files in .NET

如果信息如此敏感,您可能应该将其解密到内存而不是磁盘中。但是您应该意识到这也不安全。 Target 的 POS 系统最近遭受的数据泄露是由于定制设计的恶意软件从进程内存中获取纯文本信用卡和其他 PCI/敏感数据。

【讨论】:

  • 我解密到内存,然后解压到磁盘。是否可以从内存中启动新进程?
【解决方案2】:

为此,您需要设置共享模式。不确定 C# 解决方案,但据我所知,在 C# 中您可以使用 Win32,因此您需要使用 CreateFile 打开该文件夹中的文件并将 dwShareMode 设置为零。

另外如果你想在程序终止后删除所有的东西,你可以使用FILE_FLAG_DELETE_ON_CLOSE标志。


所以正如我所提到的,不确定使用 C# 是否容易做到这一点,但您始终可以信任 C++,它可以让您在较低级别完成工作。

【讨论】:

  • 我喜欢这个主意。如果我理解您的建议,在启动该过程后,我会打开一个 dwShareMode 为零的文件句柄,以防止其他人访问它?
  • 是的,您应该保持文件打开,不要与其他人共享。这应该可以工作,但是,正如 cmets 中提到的,没有办法 100% 保证它可以工作,因为用户可以附加调试器,将驱动器作为物理设备读取等等。
  • +1 尽管不是 100%,但这是我见过的第一个解决方案,它表明至少可以使攻击者难以执行复制。
【解决方案3】:

从用户上下文运行时,文件系统始终是公共的。

您总是可以尝试将“文件夹”提取到二进制流中 - 并在文件系统上创建一个原始的二进制文件,这没有明显的意义 - 例如制作自己的临时“文件系统”

【讨论】:

  • 我可以让 windows 从这样的文件启动一个进程吗?
【解决方案4】:

简短的回答:你不能。

  • 请注意,隐藏窗口/始终在顶部显示窗口是非常薄弱的​​保护措施,很容易从另一个进程中更改。
  • 另外请注意,您始终可以暂停进程而不是终止它们,因此也很容易防止执行任何诸如“如果您被杀死,那么我执行 XXX”之类的逻辑

您可以做的最好的事情是创建一个用户帐户并将读取您的文件/目录的权限限制为仅此帐户。当然,管理员仍然可以访问它。

【讨论】:

  • 不幸的是,运行所有内容的帐户都是管理员帐户,所以我不确定这是否能解决很多问题。感谢您的意见。
  • 您能否针对您在回答中提到的问题提出更好的保护建议?保护程序对我来说有点新鲜。
猜你喜欢
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 2020-03-22
  • 2022-10-14
  • 2013-05-10
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多