Недавно я интересовался на форуме, какие функции нужно перехватывать чтобы мониторить операции с файлами. Используя статью по перехвату функций в юзермоде от МС-РЕМа, часть 1, написал перехватчик, и он вполне нормально работал. Но увы, все же нужно переходить к более правильному решению. Итак, было решение написать драйвер, ведущий перехват файловых операций (аналог FileMon Руссиновича). Так же драйвер перехватывал бы весь сетевой трафик. Все эти данные сливались бы в юзермодное приложение и так бы осуществлялась прикладная обработка. Там проводится сложный анализ файлов и трафика. В чем-то задача схожа с написанием антивируса. Изучил досканально статью МС-РЕМа про перехват АПИ в нулевом кольце. Разобрался с нескольокими примерами. Установил ДДК, научился компилить и читать сообщения dbgprint, приводились примеры общения юзермода с драйвером (создание устройства и Createfile его в юзермоде). Изучил исходники,практически все понятно, откуда взялось и для чего. Изучил первые 5 статей из Цикла: Драйверы режима ядра. Прочел первые 5 глав книженции "Программирование драйверов Windows В. П. Солдатов". Много понятно, разобрался с IRP, и прочими тонкостями. Вопросы: Как правильнее перехватывать информаю об открытии/закрытии файлов?? У меня сейчас в голове 2 способа 1. Код (Text): DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDispatcher; Далее обработчик DriverDispatcher уже извлекает информацию о том, какие действия производились и отправляет в юзермод (или для начала dbgprint сообщения) Код (Text): .. PIO_STACK_LOCATION irpStack; .. irpStack = IoGetCurrentIrpStackLocation (Irp); Далее получали ХЕНДЛ процесса, который открывал определенное устройство ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode; Беглый поиск пока мне не дал описание структуры PIO_STACK_LOCATION и какие данные можно выдернуть оттуда, но думаю что имя файла, который открывался я узнать смогу. Таким образом будет вестись наблюдение за открытием файлов. 2. Установить перехватчик. В юзермоде я ловил zwCreateFile, zwCloseFile. Работало. В примерах к той статье был перехватчик функции NtOpenProcess (менялся адрес функции) Так вот, может мне аналогично и вести перехват ntCreateFile, ntCloseFile?? И выводить кто и что открывает? (за последние пару дней много информации прочел новой, поэтому может в голове каша получилась). Прошу постояльцев пояснить предложенные мной 2 способа, какой из них лучше, хуже, или какой то из них вообще не имеет права на существование. Это для начала. А так же будет задача перехватывать сетевой трафик. Да, пока не стоит требований скрыть драйвер или метод перехвата, которым он пользуется. Спасибо за ответы. Продолжаю изучать форум, книжки и статьи. Просто хотелось бы узнать, в правильном ли направлении я двигаюсь..
Перехваты в секциях кода мертвы, всё о чём говорил Рэма не актуально сейчас. Следует искать альтернативу.
CrystalIC, многоуважаемый, разрешите поинтересоваться, почему предложенное не актуально? Чем оба способа плохи и.. что собственное по вашему мнению можно придумать новичку в решении своей задачи? Рэма же предлогал в статье изменить способ перехвата, записью кодов вначале функции. Если рассматривать и так, то можно добавить пункт 2а, но способ внедрения своей функции - другой, запись кода вначало функции. Собственно в задаче пока нету требования чтобы код нельзя было обнаружить и исправить..
test555 Автор хочет траф фильтровать, а зачем. Это либо руткит, либо антивирус. Второе маловероятно. Если руткит, то с этими способами перехватов он руткитом называться не может, ибо он будет слишком тормозить систему, так как скрывается вся страница с кодом и подменён хэндлер исключений, изза чего юзер снесёт ось, либо он будет детектитсо всем чем тока можно. Изначально, если подход такой, что нужно похукать, а как значения не имеет - это впустую потраченные усилия, ибо в конце концов возникнет задача сокрытия и потребуетсо пересмотреть методы полностью, переписав код с нуля, а иногда это довольно сложно. Поэтому, либо пишетсо антивирус(на антируткит это не тянет, ибо поверхностный контроль), либо в случае руткита код не жизниспособный.
K10 Если ядро выполняет файловую операцию, то сервисы не юзаются, сст для них и служит. Если следить за сервисами, то это всёравно что не за чем не следить.
CrystalIC, написал же, что нет задачи скрыть свою утилиту. Она будет законно устанавливаться на компы, И задача у нее мониторить операции с файлами, чтобы юзера не записывали некоторые данные на несанкционированные флешки и тд. Ну и аналогично контролировать сетевой трафик, как минимум SMTP.. Задача драйвера - отдать данные трафика юзермодному приложению которое будет разбираться дальше. Что еще мне подробнее описать? По делу интересует, чтобы 1, 2а, 2б способы работали как можно незаметнее для юзера, в том смысле чтобы не было глюков и тормозов всяких...
Перехватывай NtCreateFile ,посылай имя файла в юзер-мод, если надо выполняй оригальную NtCreateFile,если нет - какой-нибудь статус ошибки возвращай. PS. новичек, не ругайте если бред написал
в правильном нужно два драйвера-фильтра, сервис, гуй и возможно сервер управления тема примерно на год-два разработки для хорошей команды в одиночку такое поднимать это все равно что устанавливать в продакшен нетестированный код т.е. можно вместо бабла еще и по шее получить be warned
Писать пару дней максимум, только тормозить будет довольно (если все операции со всеми файлами мониторить, ибо, к примеру, при нажатии кнопки пуск открываються сотни файлов) даже если делать комуникацию через LPC (макс быстрый способ). Я такое делал да только заказчики мозги запарили и я перестал им дописывать, могу скинуть незаконченную прожку (ща пороюсь в аналах истории)
tylerdurden, посмотрел бы... На данные момент изучаю лит-he и буду перехватывать NTOpenFile и тд. Проверяться будут только некоторые файлы, то есть все кроме некоторых, путь к которым начинается со съемного диска... Ладно, всем спасибо.
Максимально быстрый способ это регистрировать свой вектор прерывания для коммуникации (свободных векторов много).
Статья супер. Перехвати операций с файлами срабатывает, но одно НО. При открытии файла из сети защита идет лесом, например: \\comp\test or \\comp\c$\test. Получается что не все файловый операции идут через CreateFile? Кто может подсказать? Спс.
Про фильтрацию локальных файловых систем я писал здесь - Механизмы фильтрации файловой системы. Информация весьма общая, но возможно, чем-то поможет; более подробно распишу как будет время. Что касается обращений к файлам по сети, то фильтрация локальных FSD здесь не поможет - этим занимаются сетевые миниредиректоры.