1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Програмная защита директорий от модификаций в них

Тема в разделе "Оффтопик", создана пользователем LuckyZeeRo, 17 дек 2018.

  1. Автор темы
    LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Привет всем, вот занялся непростым вопросом, решил обратится к вам, возможно получу хоть какую нибудь информацию, куда направится.

    В общем есть задача - сделать защиту конкретной папки от любых модификаций (а по крайней возможности и доступа по чтению) файлов в ней и желательно с фильтром по процессам. Конкретно под Windows. Вопрос - как это сделать? В первую очередь беру Java, но судя по тому, что язык имеет довольно низкие привилегии в работе, скорее всего с ним никак нельзя. Отсюда хочу узнать, можно ли этого добиться через C#, или C++, и с чего начать? Я так то искал искал инфу по инету, ничего толком не нашел. Только типичные File Watcher'ы, которые не могут ничем управлять.

    Вдруг что нибудь встречали подобное. Решение есть к примеру в антивирусе Bitdefender и его модуле Safe Folder (где можно указать защищенные папки и какие процессы могут иметь доступ к модификации внутри их)
     
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Через ринг 0 только. Готов подписывать свои драйвера?
     
  3. Автор темы
    LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Жость...
    Но по слухам видел, писали тот же CSXGuard (тип защитка от скачивания там всякого мусора) на паскале (судя по сурсам). Я в нем не шарю, но фишка в том, что якобы есть защита от скачивания (создания) файлов, а не только изменения. Неужели столько прав надо чтобы запретить процессу создать файл?
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Тебе лучше к хошимиду. Он точно шарит.
     
  5. jwplaster

    jwplaster Старожил Пользователь

    Баллы:
    173
    Skype:
    jwplaster.smartworld
    Имя в Minecraft:
    QviNSteN
    Ну а ты прикинь, появится какой-нить вирусняк, который тупо нельзя будет удалить, ибо запрещено изменять его каталог. Кншн для безопасности виндоуса это такое себе.
    Так что остаётся лишь следить за изменением веса или хэш-суммы файлов отдельной программой, а после такой ОПА ТАМ ЧТО-ТА НЕ ТАК и удалять
     
  6. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Чтобы запретить доступ к папке или к файлам, тебе нужно написать минифильтр.
    Это несложный драйвер, в репозитории Microsoft есть примеры таких фильтров.
    Если в общих чертах, то ставишь фильтр на событие IRP_MJ_CREATE (открытие файла, папки или диска), в нём проверяешь открываемый путь и, если он принадлежит твоей защищаемой папке, возвращаешь статус, например, STATUS_ACCESS_DENIED и завершаешь запрос. Таким образом, ты завернёшь запрос к файловой системе, не дав ему дойти до драйвера диска и внести соответствующие изменения.

    Если не хочешь писать сам, можешь попробовать готовое решение: https://github.com/HoShiMin/Kernel-Bridge
    Здесь все фильтры уже написаны за тебя и на каждое событие отправляется сообщение в юзермод.
    Ты можешь в юзермоде подписаться на рассылку таких сообщений (как в Bukkit'e подписываешься на эвенты через EventHandler), обрабатывать события и отменять. Всё достаточно просто и не требует каких-то специальных знаний (достаточно подробное описание можно почитать здесь: https://habr.com/post/429198/).
    И примерчик, как будет выглядеть блокировка доступа к файлам и папкам:
    Код:
    #include <Windows.h>
    #include <fltUser.h>
    
    #include "CommPort.h"
    #include "WdkTypes.h"
    #include "FltTypes.h"
    #include "Flt-Bridge.h"
    
    // Должен быть глобальным, т.к. деструктор отключит нас от порта:
    CommPortListener<KB_FLT_PRE_CREATE_INFO, KbFltPreCreate> FilesCallbacks;
    
    int main()
    {
    
        ...
    
        // Подписываемся на рассылку событий:
        FilesCallbacks.Subscribe([](
            CommPort& Port,
            MessagePacket<KB_FLT_PRE_CREATE_INFO>& Message
        ) -> VOID {
            auto Data = static_cast<PKB_FLT_PRE_CREATE_INFO>(Message.GetData());
     
            // Если в имени файла есть ".prot" - запрещаем к нему доступ:
            if (wcsstr(Data->Path, L".prot"))
                Data->Status = 0xC0000022; // STATUS_ACCESS_DENIED
    
            // Отправляем драйверу ответ:
            ReplyPacket<KB_FLT_PRE_CREATE_INFO> Reply(Message, ERROR_SUCCESS, *Data);
            Port.Reply(Reply);
        });
    
        ...
    
    }
    
     
  7. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Останется найти спонсора, кто подпишет драйвер :D. Что и следовало доказать.
     
  8. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    На unknowncheats недавно выкладывали EV'шку, я ей подписываю. Выпущена в 2014м, SecureBoot её принимает, никаких проблем
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Так его отозвали сразу же после слива не? Иначе бы все стали свои вирусняки подписывать.
     
  10. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Их отзывают только в самых исключительных случаях. Сертификаты от уязвимых драйверов VBox'a и CAPCOM'a до сих пор валидны, хотя через них в ядро не лазил только ленивый.

    Тот опубликованный китайский серт просроченный, НО! Просроченный - не значит отозванный. Просроченные серты остаются валидными навсегда, их принимает винда, их принимает SecureBoot. Единственное ограничение - нельзя будет подписать на портале Microsoft и пройти WHQL, но для сертификатов, выпущенных до 2015го года, это не имеет значения (кросс-подпись нужна, чтобы загрузиться на SecureBoot-машинах, и все серты, выпущенные после 2015го, требуют подпись MS).

    Кроме того, сертификаты уже давно не являются критерием "недетектируемости" антивирусами
     
  11. Автор темы
    LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    На самом деле кое что является критерием.
    Вот на днях стучусь в тех поддержку Bitdefender по поводу багов в модуле Safe Files (защита папок от изменений). Так вот помимо багов они ответили, что подписанные не блочатся. И вправду. Тот же Word / Paint.NET создать файлы может без всяких проблем. Может быть там особо как то проверяется доверенность, но что есть то есть.

    Спасибо за инфу, на днях попробую с этим разобраться.
     
  12. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Все крупные антивирусы (Касперский и Доктор Веб, как минимум) уже давно отказались от безусловных блокировок. В спорных случаях, когда файл похож на подозрительный, но, в целом, и вирусной активности явной не проявляет, наличие подписи может немножко сдвинуть решение о блокировке в ту или иную сторону, но явную малварь, которая бьётся по всем базам, они не пропустят, хоть сто раз подпиши.

    Если захочешь использовать Kernel-Bridge, аналогичным способом в нём можно заблокировать общение с драйверами (например, заблочить драйвер CheatEngine через фильтр IRP_MJ_DEVICE_CONTROL) или запретить доступ к процессу для защиты от инжектов - через юзермодные эвенты.
     
  13. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Антивирь за такое не кастрирует?
     
  14. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Нет - это легальный и полностью документированный способ. Все античиты и DLP работают через него. И сами антивирусы через него защищают свои процессы.
     
  15. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Тогда норм.
     
  16. Автор темы
    LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Будем много спрашивать. Я же с С++ ни-ни, ток начинать буду учить теперь. В общем начал на CLion. Взял закинул нужные хедеры в папку с main.cpp, скопипастил код, результат - куча ошибок:
    https://hastebin.com/bebefisaxa.coffeescript

    Так же я пытался, но не разобрался толком, как эту библиотеку правильно подключить и не делать лишнего. Там нужно добавлять что то в CMake конфиг, но на разных сурсах разные варианты, и возможно где то вообще не то что нужно.
     
  17. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Для начала, забудь про CLion и скачай Visual Studio. Это единственная правильная IDE для разработки на плюсах под винду.
    Если понравятся плюсы и захочешь делать GUI - возьмёшь QtCreator, но как самостоятельная IDE, в отрыве от Qt, он плох.
    CLion же рекомендую только для разработки под линукс.
     
  18. Автор темы
    LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    VS не потянет мой ноут, я уж ее знаю.
    Мне вот интересно, если я поставлю этот драйвер, значит по сути любой кто попытается, сможет через API все это проделывать? По сути открою прямую уязвимость на самый нижний уровень?
     
  19. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    И да, и нет. Через те же самые фильтры ты можешь запретить общаться с драйвером всем, кроме своего процесса. Тем самым запретишь использование этого драйвера против тебя самого.

    Без VS будет трудно. Сомневаюсь, что API соберётся в MinGW. Давай вот как: поставь Visual Studio 2017 и, если будет невозможно работать, попробуем собрать на CMake в CLion. Или в QtCreator в связке с MSVC.
     
  20. Автор темы
    LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Ну как бы приложение не будет работать постоянно, как сервис. Вот тут и загвоздка первая.

    А нет никакой возможности обойти сборку самого API? В том смысле, что взять релиз (он там уже собран нормально на гитхабе), и если нужно - залинковать хедеры. Я так к слову (не расшарил пока полностью в этом).

    Извини, но VS я не хочу ставить принципиально. Одна из причин выше, она фризила на компьютере помощнее моего ноута, тут даж сам CLion немного фризит при каждом запуске (собирает символы). Тяжелая штука, должен быть норм вариант для CMake.
     

Поделиться этой страницей