Как перехватывать функции (операции с файлами)..

Тема в разделе "WASM.NT.KERNEL", создана пользователем test555, 15 ноя 2008.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Недавно я интересовался на форуме, какие функции нужно перехватывать чтобы мониторить операции с файлами.
    Используя статью по перехвату функций в юзермоде от МС-РЕМа, часть 1, написал перехватчик, и он вполне нормально работал.

    Но увы, все же нужно переходить к более правильному решению.

    Итак, было решение написать драйвер, ведущий перехват файловых операций (аналог FileMon Руссиновича).
    Так же драйвер перехватывал бы весь сетевой трафик.

    Все эти данные сливались бы в юзермодное приложение и так бы осуществлялась прикладная обработка. Там проводится сложный анализ файлов и трафика. В чем-то задача схожа с написанием антивируса.

    Изучил досканально статью МС-РЕМа про перехват АПИ в нулевом кольце.
    Разобрался с нескольокими примерами. Установил ДДК, научился компилить и читать сообщения dbgprint, приводились примеры общения юзермода с драйвером (создание устройства и Createfile его в юзермоде).
    Изучил исходники,практически все понятно, откуда взялось и для чего.

    Изучил первые 5 статей из Цикла: Драйверы режима ядра.

    Прочел первые 5 глав книженции "Программирование драйверов Windows В. П. Солдатов".

    Много понятно, разобрался с IRP, и прочими тонкостями.

    Вопросы:
    Как правильнее перехватывать информаю об открытии/закрытии файлов??
    У меня сейчас в голове 2 способа
    1.
    Код (Text):
    1. DriverObject->MajorFunction[IRP_MJ_CREATE] =
    2.     DriverObject->MajorFunction[IRP_MJ_CLOSE]  = DriverDispatcher;
    Далее обработчик DriverDispatcher уже извлекает информацию о том, какие действия производились и отправляет в юзермод (или для начала dbgprint сообщения)
    Код (Text):
    1. ..
    2.     PIO_STACK_LOCATION irpStack;
    3. ..
    4.     irpStack = IoGetCurrentIrpStackLocation (Irp);
    Далее получали ХЕНДЛ процесса, который открывал определенное устройство
    ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

    Беглый поиск пока мне не дал описание структуры PIO_STACK_LOCATION и какие данные можно выдернуть оттуда, но думаю что имя файла, который открывался я узнать смогу.
    Таким образом будет вестись наблюдение за открытием файлов.

    2. Установить перехватчик. В юзермоде я ловил zwCreateFile, zwCloseFile. Работало.
    В примерах к той статье был перехватчик функции NtOpenProcess
    (менялся адрес функции)
    Так вот, может мне аналогично и вести перехват ntCreateFile, ntCloseFile??

    И выводить кто и что открывает?


    (за последние пару дней много информации прочел новой, поэтому может в голове каша получилась).

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

    Это для начала. А так же будет задача перехватывать сетевой трафик.

    Да, пока не стоит требований скрыть драйвер или метод перехвата, которым он пользуется.

    Спасибо за ответы. Продолжаю изучать форум, книжки и статьи. Просто хотелось бы узнать, в правильном ли направлении я двигаюсь..
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Перехваты в секциях кода мертвы, всё о чём говорил Рэма не актуально сейчас. Следует искать альтернативу.
     
  3. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    CrystalIC
    Речь идет о правке SST.
     
  4. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    K10
    Модификация сст не лучше.
    IoGetCurrentIrpStackLocation() как связана с ССТ ?
     
  5. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    CrystalIC, многоуважаемый, разрешите поинтересоваться, почему предложенное не актуально?

    Чем оба способа плохи и.. что собственное по вашему мнению можно придумать новичку в решении своей задачи?

    Рэма же предлогал в статье изменить способ перехвата, записью кодов вначале функции.
    Если рассматривать и так, то можно добавить пункт 2а, но способ внедрения своей функции - другой, запись кода вначало функции.

    Собственно в задаче пока нету требования чтобы код нельзя было обнаружить и исправить..
     
  6. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    test555
    Да так он понтуется... Правка SST - для таких целей стандартный способ...
     
  7. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    test555
    Автор хочет траф фильтровать, а зачем. Это либо руткит, либо антивирус. Второе маловероятно. Если руткит, то с этими способами перехватов он руткитом называться не может, ибо он будет слишком тормозить систему, так как скрывается вся страница с кодом и подменён хэндлер исключений, изза чего юзер снесёт ось, либо он будет детектитсо всем чем тока можно. Изначально, если подход такой, что нужно похукать, а как значения не имеет - это впустую потраченные усилия, ибо в конце концов возникнет задача сокрытия и потребуетсо пересмотреть методы полностью, переписав код с нуля, а иногда это довольно сложно. Поэтому, либо пишетсо антивирус(на антируткит это не тянет, ибо поверхностный контроль), либо в случае руткита код не жизниспособный.
     
  8. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    K10
    Если ядро выполняет файловую операцию, то сервисы не юзаются, сст для них и служит. Если следить за сервисами, то это всёравно что не за чем не следить.
     
  9. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    CrystalIC
    Челу надо мониторить юзермодные открытия файлов.
     
  10. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    CrystalIC, написал же, что нет задачи скрыть свою утилиту.
    Она будет законно устанавливаться на компы,
    И задача у нее мониторить операции с файлами, чтобы юзера не записывали некоторые данные на несанкционированные флешки и тд.
    Ну и аналогично контролировать сетевой трафик, как минимум SMTP..
    Задача драйвера - отдать данные трафика юзермодному приложению которое будет разбираться дальше.

    Что еще мне подробнее описать?

    По делу интересует, чтобы 1, 2а, 2б способы работали как можно незаметнее для юзера, в том смысле чтобы не было глюков и тормозов всяких...
     
  11. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Перехватывай NtCreateFile ,посылай имя файла в юзер-мод, если надо выполняй оригальную NtCreateFile,если нет - какой-нибудь статус ошибки возвращай.

    PS. новичек, не ругайте если бред написал :)
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проще всего сделать фильтр файловой системы.
    см IoAttachDeviceToDeviceStackSafe
     
  13. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    в правильном
    нужно два драйвера-фильтра, сервис, гуй и возможно сервер управления
    тема примерно на год-два разработки для хорошей команды
    в одиночку такое поднимать это все равно что устанавливать в продакшен нетестированный код
    т.е. можно вместо бабла еще и по шее получить
    be warned
     
  14. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Писать пару дней максимум, только тормозить будет довольно (если все операции со всеми файлами мониторить, ибо, к примеру, при нажатии кнопки пуск открываються сотни файлов) даже если делать комуникацию через LPC (макс быстрый способ). Я такое делал да только заказчики мозги запарили и я перестал им дописывать, могу скинуть незаконченную прожку (ща пороюсь в аналах истории)
     
  15. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    tylerdurden, посмотрел бы... На данные момент изучаю лит-he и буду перехватывать NTOpenFile и тд.
    Проверяться будут только некоторые файлы, то есть все кроме некоторых, путь к которым начинается со съемного диска...

    Ладно, всем спасибо.
     
  16. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Максимально быстрый способ это регистрировать свой вектор прерывания для коммуникации (свободных векторов много).
     
  17. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    Статья супер. Перехвати операций с файлами срабатывает, но одно НО. При открытии файла из сети защита идет лесом, например: \\comp\test or \\comp\c$\test.
    Получается что не все файловый операции идут через CreateFile?
    Кто может подсказать? Спс.
     
  18. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Про фильтрацию локальных файловых систем я писал здесь - Механизмы фильтрации файловой системы. Информация весьма общая, но возможно, чем-то поможет; более подробно распишу как будет время. Что касается обращений к файлам по сети, то фильтрация локальных FSD здесь не поможет - этим занимаются сетевые миниредиректоры.
     
  19. Cristoff

    Cristoff New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2009
    Сообщения:
    20
    Есть пример разработки фильтра для сетевого редиректора?
     
  20. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Думаю, стоит почитать WDK.