пароль папки виндовс

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

Может ли кто-нибудь указать мне в правильном направлении? Заранее спасибо!

С уважением, Петар


person Petar Minchev    schedule 02.04.2011    source источник
comment
Вы имеете в виду, что ваша программа будет сервисом и все действия пользователя с папками должны совершаться через ваш сервис? Звучит сложно...   -  person Armen Tsirunyan    schedule 02.04.2011
comment
@Армен Цирунян - Да, можно так сказать. Некоторые папки будут защищены паролем, некоторые нет.   -  person Petar Minchev    schedule 02.04.2011
comment
Вот каверзный вопрос (и я думаю, что решение - драйвер шифрования): Алиса и Боб подключились к машине с зашифрованной папкой F. Алиса знает пароль для F, а Боб не знает пароль для F. Боб пытается войти в папку странным образом (cmd.exe или его собственное приложение) и находит зашифрованные файлы, как и должно быть. Алиса вставляет пароль для F, так что вы расшифровываете файлы. Как теперь расшифровать файлы и убедиться, что Боб не сможет их трогать? Каким-то образом нужно убедиться, что пользователи, не имеющие доступа к F, не смогут получить к нему доступ!   -  person TCS    schedule 02.04.2011
comment
похоже на драйвер файловой системы. osr.com/fddk.html   -  person kenny    schedule 02.04.2011
comment
@Petar Minchev: взгляните на это: stackoverflow.com/questions/ 1109564/intercept-windows-open-file Принятый ответ относится и к папкам.   -  person Aoi Karasu    schedule 02.04.2011
comment
Я думаю, что ссылка Аой Карасу обеспечивает лучшую концепцию для реализации вашей программы.   -  person Falcon    schedule 02.04.2011


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

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

person Falcon    schedule 02.04.2011
comment
Какой крючок вы бы использовали для этого? Я имею в виду, какой хук позволяет вам отслеживать определенные вызовы API? - person Adham Atta; 02.04.2011
comment
Вы их не мониторите, вы прошиваете звонки через манипуляции с памятью. - person Falcon; 02.04.2011
comment
Вы уверены, что FindNextFile и FindFirstFile используются проводником? И даже в этом случае, что происходит, когда вы расшифровываете? как запретить другим пользователям в системе доступ к расшифрованным файлам? - person TCS; 02.04.2011
comment
@falcon: Я, возможно, не очень хорошо это понимаю, поэтому, пожалуйста, поправьте меня, если я ошибаюсь, не буду ли я сгибать вызовы, сделанные только из моего пространства процесса? Я имею в виду, почему это может иметь какое-либо влияние на вызовы, поступающие из других процессов, где адрес функции ядра не затрагивается. - person Adham Atta; 02.04.2011
comment
@ Адхам, ты прав, но обычно ты все равно подключаешь этот код к любому запущенному процессу. Это не проблема, если вы запускаете какую-то программу с повышенными привилегиями на целевой машине. - person Falcon; 02.04.2011
comment
@Т.С. Прочтите внимательно мой пост. Если вам нужна хорошая защита, используйте криптоконтейнер или зашифрованную файловую систему. Кто-то, у кого есть доступ к необработанным данным, всегда может получить доступ к незащищенным данным. В многопользовательской системе кто-то, кто может читать вашу память, всегда сможет прочитать содержимое ваших расшифрованных файлов. - person Falcon; 02.04.2011
comment
Чтобы уточнить, насколько ненадежным является второй случай: я написал серьезное приложение, которое распаковывает такие модификации. (Причина: люди, пишущие такой защитный код, тоже не очень хорошие программисты. Их код дал сбой, но, конечно, это было в нашем процессе.) - person MSalters; 04.04.2011

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

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

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

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

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

person TCS    schedule 02.04.2011

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

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

person MSalters    schedule 04.04.2011