使用VC++在windows上保护虚拟磁盘



我有一个想要使用的软件的DLL。在API DLL中,有一个函数"LoadConfigFile(char*file)",它需要一个文件名,该文件名的路径不明确(例如"C:\TestFolder\ConfigFile.cfg")。然后该函数加载配置文件本身。

由于安全原因,我想只允许使用DLL的程序访问文件(内容)。

所以我想知道如何做到这一点,并在互联网上搜索解决方案。在寻找解决方案时,脑海中浮现出以下选项和问题:

  • 我可以加密文件。->有人知道有免费的图书馆吗?->那么,是否可以将文件作为字符串赋予函数,并且函数可以读取文件?

  • 也许有可能使用虚拟文件系统。我的意思是从加密源加载文件,解密并将其保存在虚拟磁盘或文件夹的RAM中。然后将链接作为DLL函数的字符串->这可能吗?->有人知道有免费图书馆可以这样做吗?

  • 我还读了一些关于"内存数据库"的文章。->这能解决我的问题吗?

我的开发环境是VC++2010,操作系统是Windows XP。

我希望有人能帮我处理这件事。

太复杂了。最简单的解决方案(因为你是过程的控制者)是:

  1. 创建一个临时文件,并以独占方式打开它(甚至不共享读取)。传递FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE,因为它不是持久的
  2. 将配置文件解密为此临时文件。保持把手打开
  3. 将临时文件名传递给DLL。它在您的进程中,因此不受独占锁的影响
  4. DLL完成后,将临时文件清零
  5. 关上你的把手。这将删除该文件

由于临时文件在包含机密内容时都会被锁定,因此没有其他进程可以访问它。由于它被标记为临时文件,关闭时删除,Windows不会麻烦将其刷新到物理磁盘。

当然,这不是完美的安全。任何能够读取进程内存(即拥有SeDebugPrivilege)的人都可以访问这些信息,但这是显而易见的。只需在LoadConfigFile上设置一个调试断点。

您的数据有多敏感?您的应用程序的目标是什么?

在许多情况下,一个简单的自制加密机制可能足以吓跑普通读者。

如果您的数据需要彻底加密,请查看Windows加密功能(例如CryptProtectData,请参阅http://msdn.microsoft.com/en-us/library/aa380261(VS.85).aspx).

在某些情况下,你不想加密你的数据,但你只想确保没有人更改它。在这种情况下,添加一个哈希值(SHA-2,请参阅http://en.wikipedia.org/wiki/SHA-2)到您的文件。

我唯一能想到的——我手头没有它的源代码——就是散列和解密。

使用从代码哈希中派生的密钥,用任何东西对文件进行加密。不要把钥匙放在任何地方。你的代码是关键。更好的是,散列一些只有成功运行程序才能创建的内存结构。

不过,每次更新代码时,它都可能会中断。您必须考虑32位和64位体系结构。也许指针校准可以发挥作用。确保您的安全需求是值得的,不要低估维护工作。

通常,CryptProtectData会这样做,并提供pOptionalEntropy参数以增加安全性(然后接受@Patrick的答案,而不是我的答案)。

最新更新