Драйвер-фильтр файловой системы
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 13.12.07 20:16
Оценка:
Приветствую, уважаемые!

Заранее прошу сильно не пинать за ламерские вопросы, в поиске был, пока тема для меня новая, потому уповаю на ваши пинки.

Задача стоит простая: ознакомиться на личном примере с написанием простейшего фильтра файловой системы. Фильтр, собственно, должен делать только одно: если запрошенный объект файловой системы (файл, папка) удовлетворяет каким-то критериям, то запретить к нему доступ. Вопросы буквально следующие:

1. Я правильно понимаю, что надо ставить обработчик на IRP_MJ_CREATE, и возвращать

Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;


если мы хотим запретить доступ к объекту?

2. Посмотрел исходник sfilter из IFS SDK — там черт ногу сломит. Сильно подозреваю, что существует некая базовая совсем минимальная функциональность, которую мне надо реализовать. Пните в нужном направлении, плз.

3. Как правильно осуществлять обмен данными между фильтром и программой user-mode? Задача в общем-то типовая: программа хранит список правил фильтрации и при добавлении/удалении/изменении правила должна как-то сообщить об этом драйверу. Сильно подозреваю, что дергать прогу из драйвера на каждый IRP_MJ_CREATE — это ну совсем атас.

4. Я правильно понимаю, что функциональность minifilter поддерживается начиная с WinXP SP2? И если да, то стало быть единственный путь, позволяющий фильтровать файловую систему на WinXP ниже SP2 — это полноценный file system filter driver?

5. И последний: подозреваю, что времени на грамотное вхождение в тему уйдет просто масса, потому как бы два подвопроса: а) что посоветуете почитать _онлайн_ и, б) сколько будет стоить разработка драйвер-фильтра с подобной функциональностью (надо лишь запрещать достп к объектам файловой системы, если матчится правило, например, запретить доступ к "C:\Windows", и чтобы этой папки вообще не было видно в файловой системе, как если бы ее не было)?

Извиняюсь за обилие вопросов, но плодить кучу маленьких ламерских топиков имхо еще хуже Буду благодарен за ваши ответы.
<< Рабство не отменено — оно сменилось 8-часовым рабочим днем. >>
Re: Драйвер-фильтр файловой системы
От: Unmanaged Россия ICQ 476611995
Дата: 13.12.07 20:56
Оценка: 27 (1)
F>Задача стоит простая: ознакомиться на личном примере с написанием простейшего фильтра файловой системы. Фильтр, собственно, должен делать только одно: если запрошенный объект файловой системы (файл, папка) удовлетворяет каким-то критериям, то запретить к нему доступ.

Начни с sfilter из WDK.

F>1. Я правильно понимаю, что надо ставить обработчик на IRP_MJ_CREATE, и возвращать STATUS_INVALID_DEVICE_REQUEST если мы хотим запретить доступ к объекту?


STATUS_ACCESS_DENIED

F>2. Посмотрел исходник sfilter из IFS SDK — там черт ногу сломит. Сильно подозреваю, что существует некая базовая совсем минимальная функциональность, которую мне надо реализовать. Пните в нужном направлении, плз.


sfilter уже очень сильно урезан, очень сильно.
Хочешь испугаться, посмотри исходник фильтра filespy.
Хочешь инфаркт, посмотри исходник ntfs — он там рядом лежит.

F>3. Как правильно осуществлять обмен данными между фильтром и программой user-mode? Задача в общем-то типовая: программа хранит список правил фильтрации и при добавлении/удалении/изменении правила должна как-то сообщить об этом драйверу. Сильно подозреваю, что дергать прогу из драйвера на каждый IRP_MJ_CREATE — это ну совсем атас.


Если надо быстро и просто, тогда как-то так:

1. Делаешь некую базу данных конфигурации, например, тупо какой-нибудь файло — C:\fsconfig.dat.
2. Далее реализуешь как минимум два IOCTL-запроса:
2.1. Запрос для уведомления драйвера о том, что конфигурация изменилась. В ответ на этот запрос драйвер уничтожает текущую конфигурацию в памяти, и перечитывает конфиг из БД (в нашем случае — файло), создавая при этом конфиг в памяти.
2.2. Запрос для вкл/выкл фильтрации. По получении данного запроса, драйвер тупо устанавливает глобальный флажок, что-то типа:

...

BOOLEAN gbActive = FALSE;

...

if (gbActive)
{
  //
  // логика
  //
}


Это если быстро и просто.
Если долго и сложно — ну сам понимаешь, это долго и сложно .

F>4. Я правильно понимаю, что функциональность minifilter поддерживается начиная с WinXP SP2?


Да.

F>И если да, то стало быть единственный путь, позволяющий фильтровать файловую систему на WinXP ниже SP2 — это полноценный file system filter driver?


Да.
Такие фильтры ещё называются legacy.

F>5. И последний: подозреваю, что времени на грамотное вхождение в тему уйдет просто масса


Это да.
Вот помню я начинал... эх, одна мысль только в голове:

жопа полная!
какая же это жопа, господи!..


F>что посоветуете почитать _онлайн_


Список ресурсов, которые помогли мне в своё время:

MSDN
RSDN
WASM
OSR Online
Yandex
Google

Больше ничего не нужно, правда.

F>сколько будет стоить разработка драйвер-фильтра с подобной функциональностью (надо лишь запрещать достп к объектам файловой системы, если матчится правило, например, запретить доступ к "C:\Windows", и чтобы этой папки вообще не было видно в файловой системе, как если бы ее не было)?


Стукни в асько, пообщаемся.

F>Буду благодарен за ваши ответы.


$100 баксов за консультацию .
STATUS_INVALID_DEVICE_REQUEST
Re: Драйвер-фильтр файловой системы
От: Ivan Россия www.rsdn.ru
Дата: 13.12.07 21:09
Оценка: 27 (1)
Здравствуйте, Flamer, Вы писали:

F>1. Я правильно понимаю, что надо ставить обработчик на IRP_MJ_CREATE, и возвращать

F>
Irp->>IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
F>


лучше STATUS_ACCESS_DENIED

F>2. Посмотрел исходник sfilter из IFS SDK — там черт ногу сломит. Сильно подозреваю, что существует некая базовая совсем минимальная функциональность, которую мне надо реализовать. Пните в нужном направлении, плз.


к сожалению, для обычного (legacy) фильтра файловой системы большая часть этого кода необходима

F>3. Как правильно осуществлять обмен данными между фильтром и программой user-mode? Задача в общем-то типовая: программа хранит список правил фильтрации и при добавлении/удалении/изменении правила должна как-то сообщить об этом драйверу. Сильно подозреваю, что дергать прогу из драйвера на каждый IRP_MJ_CREATE — это ну совсем атас.


для минифильтрах есть двухсторонний канал обмена информацией. для legacy фильтров только UM -> KM

F>4. Я правильно понимаю, что функциональность minifilter поддерживается начиная с WinXP SP2? И если да, то стало быть единственный путь, позволяющий фильтровать файловую систему на WinXP ниже SP2 — это полноценный file system filter driver?


минифильтры имеют ряд очень важных преимуществ по сравнению с legacy фильтрами, поэтому если это возможно лучше поднять системные требования до SP2, чем связываться с legacy фильтром. вкратце у минифильтров преимущемства следующеие:
— возможность загрузки/выгрузки без рестарта системы (для legacy фильтров это невозможно)
— меньше различий в коде для поддержки разных ОС — 2K, XP,Vista и т.п.
— существенно более простая логика драйвера
— поддержка контекстов на уровне волюма, файла, хэндла
— двухсторонний канал обмена с UM, особенно ценна возможность вызовов KM -> UM
— некоторые необходимые функции ядра появились только с выходом filtermanager, поэтому некооторые вещи принципиально не могут быть безопасно реализованы на системах ниже требований filtermanager.
Re[2]: Драйвер-фильтр файловой системы
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 13.12.07 21:26
Оценка:
Здравствуйте, Ivan, Вы писали:

[]

I>минифильтры имеют ряд очень важных преимуществ по сравнению с legacy фильтрами, поэтому если это возможно лучше поднять системные требования до SP2, чем связываться с legacy фильтром. вкратце у минифильтров преимущемства следующеие:

I>- возможность загрузки/выгрузки без рестарта системы (для legacy фильтров это невозможно)
I>- меньше различий в коде для поддержки разных ОС — 2K, XP,Vista и т.п.
I>- существенно более простая логика драйвера
I>- поддержка контекстов на уровне волюма, файла, хэндла
I>- двухсторонний канал обмена с UM, особенно ценна возможность вызовов KM -> UM
I>- некоторые необходимые функции ядра появились только с выходом filtermanager, поэтому некооторые вещи принципиально не могут быть безопасно реализованы на системах ниже требований filtermanager.

Спасибо, действительно, стоит задуматься. Вот только где бы взять пример minifilter для ознакомления — у меня чего-то в IFS DDK ничего похожего не нашлось. Ы?
<< Не присоединяйся к нашему миру наркоманов: нас много, а наркоты мало. >>
Re[3]: Драйвер-фильтр файловой системы
От: Unmanaged Россия ICQ 476611995
Дата: 13.12.07 21:35
Оценка:
F>Вот только где бы взять пример minifilter для ознакомления — у меня чего-то в IFS DDK ничего похожего не нашлось. Ы?

Папки \src\filesys\miniFilter\*.
Например, minispy.
STATUS_INVALID_DEVICE_REQUEST
Re: Драйвер-фильтр файловой системы
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 13.12.07 21:48
Оценка: 27 (1)
Здравствуйте, Flamer, Вы писали:

F>1. Я правильно понимаю, что надо ставить обработчик на IRP_MJ_CREATE, и возвращать


F>
Irp->>IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
F>


F>если мы хотим запретить доступ к объекту?

STATUS_ACCESS_DENIED однозначно.

F>2. Посмотрел исходник sfilter из IFS SDK — там черт ногу сломит. Сильно подозреваю, что существует некая базовая совсем минимальная функциональность, которую мне надо реализовать. Пните в нужном направлении, плз.

взять WDK с MSFT Connect поновее, сейчас базовым является WDK 6001 но есть и релизы для 2008й

F>3. Как правильно осуществлять обмен данными между фильтром и программой user-mode? Задача в общем-то типовая: программа хранит список правил фильтрации и при добавлении/удалении/изменении правила должна как-то сообщить об этом драйверу. Сильно подозреваю, что дергать прогу из драйвера на каждый IRP_MJ_CREATE — это ну совсем атас.

уже коллеги ответили

F>4. Я правильно понимаю, что функциональность minifilter поддерживается начиная с WinXP SP2? И если да, то стало быть единственный путь, позволяющий фильтровать файловую систему на WinXP ниже SP2 — это полноценный file system filter driver?

уточню по доступности минифильров — начиная с 2000 SP4 + rollup 1, существуют варианты доставить минифильтры с помощью redistributable компонент но за ними надо в MSFT support идти и запрашивать. Сам этим не занимался.

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

F>5. И последний: подозреваю, что времени на грамотное вхождение в тему уйдет просто масса, потому как бы два подвопроса: а) что посоветуете почитать _онлайн_ и, б) сколько будет стоить разработка драйвер-фильтра с подобной функциональностью (надо лишь запрещать достп к объектам файловой системы, если матчится правило, например, запретить доступ к "C:\Windows", и чтобы этой папки вообще не было видно в файловой системе, как если бы ее не было)?

Дмитрий, свяжитесь со мной по этому вопросу в частном порядке?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[4]: Драйвер-фильтр файловой системы
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 13.12.07 22:04
Оценка:
Здравствуйте, Unmanaged, Вы писали:


U>Папки \src\filesys\miniFilter\*.

U>Например, minispy.

Блин, нету такого у меня Есть только src\filesys\cdfs, src\filesys\filter сотоварищи. Да, вечер перестает быть томным Версия DDK 3790 — в этой папке стоит все добро.
<< Важно не знать, а иметь под рукой номер телефона того, кто знает. >>
Re[2]: Драйвер-фильтр файловой системы
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 13.12.07 22:04
Оценка:
Здравствуйте, Valery A. Boronin, Вы писали:

[]

VAB>Дмитрий, свяжитесь со мной по этому вопросу в частном порядке?


Отписал на мыло в профайле. Заранее благодарен за ответ.
<< Важно не знать, а иметь под рукой номер телефона того, кто знает. >>
Re[3]: Драйвер-фильтр файловой системы
От: Ivan Россия www.rsdn.ru
Дата: 13.12.07 22:08
Оценка: 18 (1)
Здравствуйте, Flamer, Вы писали:

F>Спасибо, действительно, стоит задуматься. Вот только где бы взять пример minifilter для ознакомления — у меня чего-то в IFS DDK ничего похожего не нашлось. Ы?


кстати, на channel9 есть интервью с Neal Christiansen о filter manager и минифильтрах — там рассказывается о том, зачем и почему создавался filter manager.

http://channel9.msdn.com/ShowPost.aspx?PostID=36907
http://channel9.msdn.com/ShowPost.aspx?PostID=37302
Re: Драйвер-фильтр файловой системы
От: Maxim S. Shatskih Россия  
Дата: 13.12.07 22:10
Оценка:
F>
Irp->>IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
F>


Лучше STATUS_ACCESS_DENIED.

F>2. Посмотрел исходник sfilter из IFS SDK — там черт ногу сломит. Сильно подозреваю, что существует некая базовая совсем минимальная функциональность, которую мне надо реализовать. Пните в нужном направлении, плз.


Тогда нужен FltMgrшный минифильтр.

F>3. Как правильно осуществлять обмен данными между фильтром и программой user-mode? Задача в общем-то типовая: программа хранит список правил фильтрации и при добавлении/удалении/изменении правила должна как-то сообщить об этом драйверу. Сильно подозреваю, что дергать прогу из драйвера на каждый IRP_MJ_CREATE — это ну совсем атас.


Почему атас? вот на paging IO так дергать нельзя, дедлокнется все, а на CREATE — пожалуйста. Хотя первоначальную обработку лучше таки в драйвере делать.

F>4. Я правильно понимаю, что функциональность minifilter поддерживается начиная с WinXP SP2? И если да, то стало быть единственный путь, позволяющий фильтровать файловую систему на WinXP ниже SP2 — это полноценный file system filter driver?


Кажется, FltMgr перенесен назад до w2k SP4.

На XP ниже SP2 я бы просто забил. Ничего нет страшного в том, чтобы потребовать SP2.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: Драйвер-фильтр файловой системы
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 13.12.07 22:21
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:


MSS>Тогда нужен FltMgrшный минифильтр.


С этого момента можно поподробнее? Что такое FltMgr? Поиск в гугле выдает чего-то невнятное...
<< Ни один дурак не жалуется на то, что он таковым является. Значит, не так уж у них все плохо. >>
Re: Драйвер-фильтр файловой системы
От: Злость Россия  
Дата: 14.12.07 06:59
Оценка:
Здравствуйте, Flamer, Вы писали:

[skip]

Добавлю к тому что сказали — посмотри WINDDK\3790.1414 или старше\src\filesys\minifilter\scanner\ — этот минифильтр. Он бли всего подойдет для того что вы хочите реализовать (кое что выкинете, чуть чуть добавите и все.)

А это окно. и никаких личный бесед — пишите все сюда
... << RSDN@Home 1.2.0 alpha rev. 685>>
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[3]: Драйвер-фильтр файловой системы
От: Maxim S. Shatskih Россия  
Дата: 14.12.07 17:38
Оценка: 8 (1)
F>С этого момента можно поподробнее? Что такое FltMgr? Поиск в гугле выдает чего-то невнятное...

Фреймворк для фильтров файловых систем, который прячет от вас все кишки sfilterа.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: Драйвер-фильтр файловой системы
От: Аноним  
Дата: 18.12.07 12:40
Оценка:
Здравствуйте, Unmanaged, Вы писали:


U>sfilter уже очень сильно урезан, очень сильно.

U>Хочешь испугаться, посмотри исходник фильтра filespy.
U>Хочешь инфаркт, посмотри исходник ntfs — он там рядом лежит.

Можно ссылку на исходники fliespy и NTFS

Лишние цитаты удалены. ДХ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.