出于好奇心和学习经历,我一直在考虑实施以下计划。我想编写一个用于保护文件夹密码的程序,因此您只能在输入正确的密码后打开该文件夹。我知道这是特定于操作系统的,所以让它为Windows
。我想这只能在C++
中实现,但如果它也可以在普通C#
或Java
(我怀疑),那么请告诉我。
有人能指出我正确的方向吗?提前谢谢!
最好的问候,Petar
答案 0 :(得分:3)
如果您想要对文件进行防弹保护,那么仅仅保护对该文件夹的访问权限是不够的,您必须对它们进行加密,并且市场上存在安全容器和文件系统限制。
如果它不需要高安全性,我猜你可以挂钩到Windows。你尤其需要挂钩目录列表函数,比如FindFirstFile,FindNextFile和OpenFile也可能(以及FindFirstFileW等派生词)以及其他一些函数。
您可以通过将对kernel32.dll的调用重定向到自定义函数来实现,请参阅我在互联网上找到的一些代码示例:
unsigned char Store[10];
//redirect FindNextFileW to your custom function
void HookAPI()
{
DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
HMODULE hmod = GetModuleHandle("Kernel32.dll");
long pa = (long)GetProcAddress(hmod,"FindNextFileW");
long pa2 = (long)MyFindNextFile;
long dAddr = pa2 - pa - 5;
unsigned char *p = (unsigned char *)pa;
unsigned char *p2 = (unsigned char *)(&dAddr);
VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
for (int i=0;i<5;i++)
Store[i] = p[i];
p[0] = (unsigned char)0xE9;
for (int i=0;i<4;i++)
p[i + 1] = p2[i];
VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
}
void UnHookAPI()
{
DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
HMODULE hmod = GetModuleHandle("Kernel32.dll");
long pa = (long)GetProcAddress(hmod,"FindNextFileW");
unsigned char *p = (unsigned char *)pa;
VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
for (int i=0;i<5;i++)
p[i] = Store[i];
VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
}
BOOL WINAPI MyFindNextFile(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData)
{
UnHookAPI();
BOOL ans = FindNextFileW(hFindFile, lpFindFileData);
//your logic here, display password prompt to user e.g.
HookAPI();
return ans;
}
你想做的事情也可以用Java(JNI)或C#(pinvoke)来完成,但这是一个真正的绕道而行。我会使用可以编译为本机代码的东西。
修改强> Aoi Karasu提供了一个帖子的链接,建议使用FileSystemFilterDriver,可能是最好的概念来实现相关应用程序。
答案 1 :(得分:0)
从头脑中想出一个“简单”的实现。
我们的想法是使用Windows身份验证来创建此类受保护的文件夹。
您的应用程序可以为每个加密文件夹F生成一个用户。 因此,对于文件夹Fi,您将使用密码Pi生成用户Ui。
此外,对于每个Fi,您的应用程序必须确保只有Ui才能访问它,并且没有人可以添加对它的访问权限。另外,在NTFS.sys中使用窗口加密来加密文件(应该有一个简单的函数来加密Windows API中的文件,不记得它的名字)。
现在,如果有人想要访问Fi,您将弹出一个要求输入密码的消息框,如果它们是正确的(您可以使用AccessCheck()),您可以使用指向Fi的Ui凭据打开资源管理器或向用户添加Ui凭据(在这种情况下,你必须在某些时候删除它们,所以它可能很棘手)。
答案 2 :(得分:0)
Windows(NTFS)支持“连接点”。这些是文件系统中的条目,告诉Windows执行一些代码。常见类型的连接点是指向另一个文件或文件夹的硬链接。但是,您可以添加具有匹配驱动程序的其他类型。
在您的情况下,您的加密文件夹可能真的是像安全硬链接一样工作的联结点。哟只解析授权用户的硬链接。因为这适用于NTFS内核级别,所以您不必担心Windows的不同层中存在的百万种不同的文件功能。