使用VC++在windows上保护虚拟磁盘
Secured virtual disk on windows with VC++
我有一个想要使用的软件的DLL。在API DLL中,有一个函数"LoadConfigFile(char*file)",它需要一个文件名,该文件名的路径不明确(例如"C:\TestFolder\ConfigFile.cfg")。然后该函数加载配置文件本身。
由于安全原因,我想只允许使用DLL的程序访问文件(内容)。
所以我想知道如何做到这一点,并在互联网上搜索解决方案。在寻找解决方案时,脑海中浮现出以下选项和问题:
-
我可以加密文件。->有人知道有免费的图书馆吗?->那么,是否可以将文件作为字符串赋予函数,并且函数可以读取文件?
-
也许有可能使用虚拟文件系统。我的意思是从加密源加载文件,解密并将其保存在虚拟磁盘或文件夹的RAM中。然后将链接作为DLL函数的字符串->这可能吗?->有人知道有免费图书馆可以这样做吗?
-
我还读了一些关于"内存数据库"的文章。->这能解决我的问题吗?
我的开发环境是VC++2010,操作系统是Windows XP。
我希望有人能帮我处理这件事。
太复杂了。最简单的解决方案(因为你是过程的控制者)是:
- 创建一个临时文件,并以独占方式打开它(甚至不共享读取)。传递
FILE_ATTRIBUTE_TEMPORARY
和FILE_FLAG_DELETE_ON_CLOSE
,因为它不是持久的 - 将配置文件解密为此临时文件。保持把手打开
- 将临时文件名传递给DLL。它在您的进程中,因此不受独占锁的影响
- DLL完成后,将临时文件清零
- 关上你的把手。这将删除该文件
由于临时文件在包含机密内容时都会被锁定,因此没有其他进程可以访问它。由于它被标记为临时文件,关闭时删除,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的答案,而不是我的答案)。
- 覆盖作为另一个类的好友的虚拟受保护方法
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- 虚拟继承和受保护的成员访问
- 在派生类中使用虚拟基类的受保护的CTOR
- 保护页面在虚拟保护之后立即触发
- 在C 中的多级虚拟继承中受保护的构造函数
- 使用具有虚拟功能的受保护或公共功能
- Keil:虚拟或受保护的析构函数和堆
- 如何使用Windows Server 2003及更高版本上的虚拟磁盘服务(VDS)登录ISCSI目标
- VDS(虚拟磁盘服务)COM接口通知-仅在注销期间调用回调(接收器)(Unadvise)
- 这种使用虚拟受保护方法扩展库的方式是否安全
- 基类中受保护的非虚拟析构函数
- 如何创建文件路径可以像磁盘一样访问的虚拟文件系统
- 在C++中调用受保护的虚拟方法
- 使用VC++在windows上保护虚拟磁盘
- 私有和受保护的纯虚拟函数之间有什么区别吗
- 映射到程序的虚拟磁盘
- 如何从虚拟磁盘中提取文件
- 使用Windows虚拟磁盘服务时,ISO文件无法打开,错误码50:ERROR_NOT_SUPPORTED