Pet*_*hev 6 c++ directory password-protection
出于好奇心和学习经验,我一直在考虑实施以下计划.我想编写一个用于保护文件夹密码的程序,因此您只能在输入正确的密码后打开该文件夹.我知道这是特定于操作系统的,所以就这样吧Windows.我想这只是可能的C++,但如果它也可能在普通C#或Java(我怀疑),那么请告诉我.
有人能指出我正确的方向吗?提前致谢!
最好的问候,Petar
如果您想要对文件进行防弹保护,那么仅保护对文件夹的访问是不够的,您必须对它们进行加密,并且市场上有安全的容器和文件系统加密。
如果不需要高安全性,我想你可以连接到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;
}
Run Code Online (Sandbox Code Playgroud)
你想做的事情也可以用 Java (JNI) 或 C# (pinvoke) 来完成,但这确实是一条弯路。我会使用可以编译为本机代码的东西。
编辑: Aoi Karasu 提供了一个帖子的链接,建议使用 FileSystemFilterDriver ,这可能是实现相关应用程序的最佳概念。