Windows文件夹密码

时间:2011-04-02 11:51:58

标签: c++ directory password-protection

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

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

最好的问候,Petar

3 个答案:

答案 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的不同层中存在的百万种不同的文件功能。