Я хочу создать драйвер минифильтра для прозрачного перенаправления дискового ввода-вывода, но у меня проблемы с началом работы

Проект, над которым я сейчас работаю, требует реализации механизма copy-on-w / m, который будет использоваться для перенаправления дискового ввода-вывода аналогично Deep Freeze или Sandboxie в Windows XP. Если бы я мог, я бы также хотел иметь возможность «монтировать» измененные пользователем файлы, подобно тому, как VirtualCloneDrive имитирует дисковые накопители и прозрачно монтирует на них образы ISO.

Насколько я понимаю, такие программы используют драйверы минифильтра для перенаправления запросов ввода-вывода. Стандартный процесс копирует любые измененные данные во вторичное расположение, а затем читает / изменяет это хранилище для последующего доступа к этим данным; так что я думаю, что понимаю, что мне нужно там делать. Когда дело доходит до моделирования привода CD / DVD и установки на него образа, я совершенно заблудился.

Я искал в Интернете (Google, MSDN, The Code Project и т. Д.) И в таких книгах, как Разработка драйверов с помощью Windows Driver Foundation и Внутреннее устройство файловой системы Windows NT: Руководство разработчика, но найти конкретную информацию и примеры (по мониторингу, перехвату и перенаправлению запросов и созданию устройств обратной связи) оказывается затруднительным. Я все еще новичок в используемых технологиях, так что, возможно, мне трудно разглядеть лес за деревьями.

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

Изменить: я нашел этот вопрос, который кажется полезным ресурсом (хотя и не для моего конкретного вариант использования), поэтому я привел его здесь, чтобы добавить к любым предстоящим ответам.

Некоторые пояснения:

Я пытаюсь создать программу, которая позволит пользователям устанавливать и использовать приложения без прав администратора. Программа будет работать, сохраняя любые изменения файловой системы / реестра в отдельной области хранения (например, файл на флеш-накопителе или в сетевом хранилище), а затем позволяя интегрировать их в любой рабочий стол, на котором запущена хост-программа, на лету. . Переносите свой рабочий стол с помощью USB-ручки, подключите его, и ваши настройки будут применены.

Чтобы перенаправить ввод-вывод, я мог:

  1. Заплатите процесс 'Импортировать таблицу адресов (IAT), чтобы вставить настраиваемый код на уровне приложения.
  2. Напишите драйвер фильтра пользовательского режима, чтобы оперативно изменять запросы.
  3. Для повышения (на самом деле вообще любой) безопасности внедрите драйвер режима ядра для исправления таблиц дескрипторов системных служб (SSDT) ​​аналогично программному обеспечению AV.

У каждого из этих подходов есть свои плюсы и минусы. Например, подход три намного сложнее, чем подход один. Он обеспечивает большую безопасность, но даже в этом случае может быть побежден (теоретические атаки существуют с 96-го, а практические - с 07-го.)

Изначально я рассматривал конкретные функции безопасности (в отличие от простого перенаправления ввода-вывода, аналогичного совместимости с WoW64 настройки); но с тех пор, как я начал смотреть на это, я вспомнил, что вы не можете защитить пользователя от самого себя навсегда, и что независимо от того, сколько работы я должен был вложить в защиту хост-системы от злонамеренного процесса или глупого пользователя, он может быть побежден (или Скорее всего, я совершу ошибку.) Я также решил не изобретать «песочницу» и антивирусные колеса и просто сконцентрировался на создании некоторых полезных функций. Философия «инструмент должен делать одну работу и делать ее хорошо» победила.

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

Ранний дизайн приложения


person Adam James    schedule 20.08.2011    source источник
comment
Вы не даете много подробностей о том, что хотите сделать, но я думаю, вам нужен очень хороший опыт работы с системными вызовами и программированием драйверов ...   -  person Pedro Ferreira    schedule 22.08.2011
comment
Ты делаешь доброе дело. Я добавил дополнительную информацию, чтобы немного прояснить ситуацию. Спасибо :-)   -  person Adam James    schedule 23.08.2011
comment
Для установки драйвера минифильтра требуются права администратора (для начальной настройки вы можете установить маршрут для использования этого драйвера без особых прав) ... Также обратите внимание, что функция служб терминалов в серверных версиях Windows имеет аналогичная функция редиректора   -  person bdonlan    schedule 23.08.2011
comment
@bdonlan Есть ли предпочтительный способ связи с драйвером минифильтра из непривилегированного приложения?   -  person Adam James    schedule 23.08.2011
comment
@ Адам, обычно у вас будет сервисный процесс пользовательского пространства, выступающий в роли привратника   -  person bdonlan    schedule 23.08.2011
comment
Также обратите внимание, что если у вас есть минифильтр, применяемый ко всем операциям ввода-вывода от данного процесса, вам не потребуется внедрение DLL.   -  person bdonlan    schedule 23.08.2011
comment
Кроме того, обязательно учитывайте последствия для безопасности теневого копирования файловой системы, когда другие процессы олицетворяют вашу (если они выполняют LoadLibrary, получают ли они теневую файловую систему? Если да, что мешает пользователю предоставить им измененную библиотеку?)   -  person bdonlan    schedule 23.08.2011
comment
@bdonlan Я думаю, что понимаю, что вы имеете в виду, говоря о других процессах, выдающих себя за мой, но если бы вы могли объяснить немного больше, я был бы признателен. Я думаю, вы говорите, что если для процесса я фильтрую ввод-вывод при вызовах LoadLibrary, они получат встроенную библиотеку или копию, которую я предоставил. Правильный?   -  person Adam James    schedule 23.08.2011
comment
Если вы перенаправляете весь ввод-вывод через драйвер минипорта, все запросы, включая LoadLibrary, фильтруются. Еще более странно, если вы удалите минифильтр после завершения LoadLibrary ...   -  person bdonlan    schedule 23.08.2011


Ответы (1)


В WDK есть все необходимые вам примеры минифильтров под samples/filesys/minifilter, они прилично документированы, но отчасти сбивают с толку. Однако, как упоминалось в комментариях, для этого требуются права администратора, а также любые формы исправления или подключения (см. SeDebugPrivilege)

person Necrolis    schedule 26.08.2011
comment
Как я этого раньше не нашел? Это должно быть очень полезно, спасибо! - person Adam James; 26.08.2011