Минифильтр и API-хукинг для мониторинга \ фильтрации операций файловой системы - PullRequest
1 голос
/ 16 сентября 2011

Мне нужно разработать приложение, которое отслеживает и потенциально фильтрует (отклоняет вызовы) файловые операции.

Похоже, что разработка минифильтра является "стандартным" решением.Другой потенциальный метод - использование API-хуков.

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

есть ли другие варианты?

Ответы [ 6 ]

4 голосов
/ 18 сентября 2011

Перехват API (по крайней мере, в пространстве ядра) по существу не поддерживается Microsoft. На x64 (начиная с Vista и выше) patchguard обычно убивает машину, если обнаруживает перехват SSDT или какие-либо изменения в критических компонентах системы. Перехват API очень сложен для общесистемного уровня, потому что примитивы синхронизации, которые использует Windows, не экспортируются, поэтому даже если вам удастся перехватить код, это не гарантирует, что машина не выйдет из строя из-за необычного значения EIP в данный момент (это особенно актуально, когда вы выгружаете драйвер, подключивший функцию).

Вероятно, вам лучше всего это сделать - без использования драйвера минифильтра - попытаться напрямую перехватить объекты ядра памяти. Возможно, вы захотите взглянуть на OBJECT_TYPE_INITIALIZER Definition структуру, которая есть у каждого окна объекта (FILE, EVENT, PORT и т. Д. - Google для их просмотра). Вы особенно заинтересованы в * указателях функций процедуры.

1 голос
/ 18 сентября 2011

Если вы запрещаете пользователю доступ к определенным ресурсам (файлам) с точки зрения безопасности, правильный путь - это минифильтр. Это потому, что только так вы можете быть уверены, что пользователь не сможет получить доступ к отфильтрованным ресурсам.

Если вы используете перехват API, вы можете перехватывать вызовы в kernel32.dll (CreateFileW, FindFirstFile и т. Д. И т. Д.), Но злоумышленник может использовать Native API (ntdll.dl). Конечно, вы можете перехватывать данные на нативном уровне (это сложнее, поскольку у него нет документов), но злоумышленники могут использовать разные API на уровне переключателей ядра. На этом уровне он не переносим. Практически невозможно запретить творческим злоумышленникам доступ к ресурсам с помощью API-перехватчика, поэтому это не рекомендуется для программного обеспечения безопасности.

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

1 голос
/ 17 сентября 2011

Все сводится к тому, что вы хотите / нужно выполнить.

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

Если вам нужен более специфичный для приложения элемент управления или если вы захотитеКак контроль над уровнем WINAPI, переходите к перехвату API.Его легче разрабатывать, но есть много «мин», которые взрываются на вашем пути (посмотрите на EasyHook, он неплохо справляется с минимальной работой).

удачи!

0 голосов
/ 26 января 2018

Мне бы пришлось противоречить LordDoskias , так как OBJECT_TYPE_INITIALIZER не является документированным объектом, и это может иметь и будет меняться с исправлениями и обновлениями ОС. Не подходите к этой проблеме, так как она только вызовет больше проблем и ничего не решит. Не говоря уже о патч-гвардии, которая будет BSOD системы, если вы измените структуру системы. Если вы хотите ограничить доступ к файлам, нет другого пути, чем просто использовать минифильтр. Есть несколько примеров Microsoft здесь , из которых вы можете черпать вдохновение, а также научиться реализовывать свой драйвер правильным и поддерживаемым способом. И наконец, что еще более важно, иллюзорно думать, что вы сможете блокировать все, что хотите, с помощью методов перехвата, и я просто приведу один пример: сопоставленные файлы. Вот сценарий с использованием блокнота, который использует сопоставленные файлы для записи своих данных на диск.

  1. CreateFile -> получает дескриптор файла -> вы видите это
  2. CreateFileMapping -> получает дескриптор отображения -> вы не видите этого
  3. CloseHandle (FileHandle) -> вы видите это
  4. MapViewOfFile, возвращающий буфер памяти, страница которого поддерживается файлом -> вы не видите этого
  5. Изменить буфер памяти -> вы не видите этого
  6. Распаковать и закрыть FileMappingHandle -> вы не видите этого
  7. Асинхронизация системных рабочих потоков диспетчера памяти выполняет запись в файл подкачки для синхронизации. Даже после того, как все дескрипторы были закрыты или во время изменения буфера в памяти, в зависимости от того, когда ОС хочет. -> вы не видите этого

Это то, чего вам не хватает при зацепке. И это только один сценарий. Их множество, поэтому, пожалуйста, делайте все правильно. Как это изменится, если вы используете минифильтр? Вы, конечно, также перехватите CreateFile, CreateFileMapping (проверьте FltAcquireForSectionSynchronization callback), а затем из минифильтра вы увидите все PAGING_WRITE, поступающие из диспетчера памяти (см. IoGetTopLevelIrp () ) в обратном вызове отправки.

Удачи дальше.

0 голосов
/ 08 октября 2014

Я получил дополнительный вопрос по почте, поэтому я добавляю сюда решение, которое мы использовали

Проект был отменен, прежде чем он не был запущен, но мы оценили продукт ( Eldos CallbackFilter), который позволяет писать фильтры ядра с использованием кода пространства пользователя.

Продукт имеет универсальный драйвер ядра, который связывается с кодом пространства пользователя, который определяет логику фильтрации.

0 голосов
/ 17 сентября 2011

Если вы можете выполнить задачу без зацепок - сделайте это.Потому что перехват не является поддерживаемым способом разработки приложений.Существует много подводных камней, и антивирусное программное обеспечение будет рассматривать ваше приложение как более опасное.Также вы можете столкнуться с проблемами с более новыми / более старыми версиями операционной системы.

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

...