Пароль папки Windows - PullRequest
       11

Пароль папки Windows

6 голосов
/ 02 апреля 2011

Я думал о реализации следующей программы, просто из любопытства и опыта обучения.Я хочу написать программу для защиты паролем папки, поэтому вы можете открыть папку только после ввода правильного пароля.Я знаю, что это специфично для операционной системы, поэтому пусть оно будет Windows.Я предполагаю, что это возможно только в C++, но если это также возможно простым C# или Java (в чем я сомневаюсь), то, пожалуйста, скажите мне.направление?Заранее спасибо!

С наилучшими пожеланиями, Петар

Ответы [ 3 ]

3 голосов
/ 02 апреля 2011

Если вам нужна пуленепробиваемая защита ваших файлов, то просто защиты доступа к папке недостаточно, вам придется зашифровать их, и на рынке есть защищенные контейнеры и правила файловой системы.

Если вам не нужен высокий уровень безопасности, вы можете подключиться к 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), но это будет настоящий обходной путь. Я бы использовал что-то, что можно скомпилировать в нативный код.

Edit: Аой Карасу предоставил ссылку на публикацию, в которой предлагается использовать FileSystemFilterDriver , что является , вероятно, лучшей концепцией для реализации рассматриваемого приложения.

0 голосов
/ 04 апреля 2011

Windows (NTFS) поддерживает «точки соединения».Это записи в файловой системе, которые говорят Windows, чтобы она выполняла немного кода.Распространенным типом точки соединения является жесткая ссылка на другой файл или папку.Однако вы можете добавить другие типы с соответствующими драйверами.

В вашем случае ваши зашифрованные папки могут действительно быть точками соединения, которые работают как защищенные жесткие ссылки.Вы можете разрешить жесткую ссылку только для авторизованных пользователей.Поскольку это работает на уровне ядра NTFS, вам не нужно беспокоиться о миллионе различных файловых функций, которые существуют в разных слоях Windows.

0 голосов
/ 02 апреля 2011

Идея "простой" реализации из головы в голову.

Идея состоит в том, чтобы использовать Windows-аутентификацию для создания таких защищенных папок.

Ваше приложение может генерировать пользователя длякаждая зашифрованная папка F. Таким образом, для папки Fi вы сгенерируете пользовательский интерфейс с паролем Pi.

Кроме того, для каждого Fi ваше приложение должно будет убедиться, что ТОЛЬКО пользовательский интерфейс имеет к нему доступ, и что никто не может добавитьдоступ к нему.Кроме того, зашифруйте файлы, используя шифрование окна в NTFS.sys (должна быть простая функция для шифрования файлов в Windows API, не помню его имени).

Теперь, если кто-то хочет получить доступ к Fi, выпоявится всплывающее окно с запросом пароля, если они верны (вы можете использовать AccessCheck ()), вы можете открыть проводник с учетными данными Ui, указывающими на Fi, или добавить учетные данные Ui пользователю (в этом случае вам придется удалить их в некоторых случаях).точка, так что это может быть сложно).

...