Я хочу создать мини-драйвер для прозрачного перенаправления дискового ввода-вывода, но у меня возникли проблемы с запуском
Проект, над которым я сейчас работаю, требует реализации механизма copy-on-w/m, который будет использоваться для перенаправления дискового ввода-вывода аналогично Deep Freeze или Sandboxie в Windows XP. Если бы я мог, я бы также хотел "смонтировать" измененные пользователем файлы, подобно тому, как VirtualCloneDrive имитирует диски и прозрачно монтирует ISO-изображения на них.
Насколько я понимаю, такие программы используют драйверы minifilter для перенаправления запросов ввода-вывода. Стандартный процесс копирует любые измененные данные во вторичное местоположение и затем считывает/изменяет это хранилище для последующего доступа к этим данным; поэтому я думаю, что понимаю, что мне нужно делать там. Когда дело доходит до моделирования CD/DVD-привода и установки изображения на нем, хотя я полностью потерял.
Я смотрю онлайн (Google, MSDN, Проект кода и т.д.) и в таких книгах, как Разработка драйверов с помощью Windows Driver Foundation и Внутренние файлы файловой системы Windows NT: Руководство для разработчиков, но нахождение конкретной информации и примеров (по мониторингу, перехвату и перенаправлению запросов и созданию замыкающих устройств ) оказывается сложным. Я по-прежнему новичок в технологиях, поэтому, возможно, мне не удается увидеть лес для деревьев.
Мне было интересно, если кто-то был в подобной ситуации и обнаружил какие-либо полезные ресурсы, или мог указать мне в правильном направлении, чтобы я мог реализовать аналогичную функциональность.
Изменить: я нашел этот вопрос, который кажется полезным ресурсом (хотя и не для моего конкретного случая использования), поэтому я связал его здесь, чтобы добавить к любому предстоящие ответы.
Некоторое уточнение:
Я пытаюсь создать программу, которая позволит пользователям устанавливать и использовать приложения, не требуя административных привилегий. Программа будет работать, сохраняя любую модификацию файловой системы/реестра в отдельную область хранения (например, файл на ручном диске или сетевом хранилище), а затем позволяет интегрировать их на любой рабочий стол, на котором запускается хост-программа, на лету, Перенесите свой рабочий стол на ручку USB, подключите его, и ваши настройки будут применены.
Чтобы перенаправить ввод-вывод, я мог:
- Зафиксировать процесс 'Импорт адресной таблицы (IAT) для вставки настроенного кода на уровне приложения.
- Напишите драйвер фильтра пользовательского режима для изменения запросов "на лету".
- Для повышения (вообще-то, действительно) безопасности внедрите драйвер режима ядра для исправления таблиц дескрипторов системной службы (SSDT) аналогичным образом с программным обеспечением AV.
У каждого из этих подходов есть недостатки и недостатки. Например, подход три гораздо сложнее, чем подход один. Это обеспечивает большую безопасность, но даже тогда может быть избито (теоретические атаки были с тех пор, как с96, практические атаки с '07.)
Я начинал рассмотрение конкретных функций безопасности (в отличие от простого перенаправления ввода-вывода, аналогичного WoW64 совместимости); но, начиная с этого взгляда, я помню, что вы не можете защитить пользователя от себя навсегда, и что независимо от того, сколько работы я должен был внести в защиту хост-системы от вредоносного процесса или глупого пользователя, ее можно было бы избить (или скорее я бы ошибся.) Я также решил не изобретать экраны для песочницы и антивируса и просто сосредоточиться на создании полезных функций. Философия "инструмента должна делать одну работу и делать это хорошо" выиграла день.
В двух словах все, что я хочу сделать, это реализовать функции, аналогичные тем, которые выполняются в моментальных копиях VM, и перенаправить изменения в мою собственную область хранения. Диаграмма ниже немного устарела, но может быть лучше сообщить мои намерения, чем я на данный момент: -)
![Early application design]()
Ответы
Ответ 1
В WDK есть все примеры, которые вам нужны на мини-фильтрах под samples/filesys/minifilter
, они прилично документированы, но немного запутаны по частям. Однако, как упоминалось в комментариях, для этого необходимо использовать привилегии для использования, но также любая форма исправления или перехвата (см. SeDebugPrivilege
)