Windows文件夹密码

Pet*_*hev 6 c++ directory password-protection

出于好奇心和学习经验,我一直在考虑实施以下计划.我想编写一个用于保护文件夹密码的程序,因此您只能在输入正确的密码后打开该文件夹.我知道这是特定于操作系统的,所以就这样吧Windows.我想这只是可能的C++,但如果它也可能在普通C#Java(我怀疑),那么请告诉我.

有人能指出我正确的方向吗?提前致谢!

最好的问候,Petar

Fal*_*con 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;
    }
Run Code Online (Sandbox Code Playgroud)

你想做的事情也可以用 Java (JNI) 或 C# (pinvoke) 来完成,但这确实是一条弯路。我会使用可以编译为本机代码的东西。

编辑: Aoi Karasu 提供了一个帖子的链接,建议使用 FileSystemFilterDriver 这可能是实现相关应用程序的最佳概念。