XC™
Гость
|
|
« : 27-01-2004 17:13 » |
|
Мне надо всего-навсего перехватить обращение к файловой системе или к диску в XP и разрешить либо запретить выполнения перехваченной операции . Перехват API - не помог . Драйвер помог только на 98 ... Помогите пожалуйстя !!! Чуть больше, чем мастер - Не один мастер Delphi мне еще не ответил на этот вопрос ... и вообще - я просто хочу учиться ...
|
|
|
Записан
|
|
|
|
grozny
Гость
|
|
« Ответ #1 : 27-01-2004 20:09 » |
|
А как делался перехват API? Низкоуровневым хуком (с суффиксом _LL ?) Или как-то ещё?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #2 : 27-01-2004 21:27 » |
|
Мне надо всего-навсего перехватить обращение к файловой системе или к диску
Если только это, то вот тебе 100% правильное решение 1) для перехвата обращений к файловой системе, достаточно простого драйвера фильтра файловой системы, не пугайся рассказов о сложности фильтров файловых систем- это так только в случае если ты пытаешься нетривиально модифицировать передаваемые данные, для простого анализа и отклонения запросов все очень просто. Самая большая сложность тут- не трогать запросы от VMM, посланные на страничный файл, а также желательно не трогать запросы на подгрузку страниц в секции, но если это для юзер мода- можно отклонять. Все запросы к страничному файлу легко вылавливаются, если надо скажу как. 2) Перехват обращений к дискам- тут есть тонкость. Если на диск(раздел) смонтирована файловая система то ВСЕ интересные для тебя обращения чтения, записи и IOCTL пойдут сначала через нее(то есть тут ты их поймаешь на фильтре файловой системы), потом они будут переданы на DEVICE_OBJECT одного из драйверов- ftdisk.sys или dmio.sys, а уже с них на драйвер disk.sys. Первые два драйвера отвечают за разделы на диске, третий драйвер за разделы и весь диск(то есть запросы, адресованные всему диску пойдут на него, например модификация таблицы разбиения). Обращаю внимание- пользовательское приложение без привилегий админа не сможет напрямую работать через disk.sys.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #3 : 28-01-2004 06:58 » |
|
1) для перехвата обращений к файловой системе, достаточно простого драйвера фильтра файловой системы, не пугайся рассказов о сложности фильтров файловых систем- это так только в случае если ты пытаешься нетривиально модифицировать передаваемые данные, для простого анализа и отклонения запросов все очень просто.
я бы не согласился с таким утверждением... судя по всему человеку нужно блокировать открытие некоторых файлов (или блокировать любые другие операции на конкретном файле, а для этого надо знать имя файла), а получение нормализованного имени файла весьма трудоемкая операция... point.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #4 : 28-01-2004 07:20 » |
|
а получение нормализованного имени файла весьма трудоемкая операция...
Да ладно пугать. IRP_MJ_CREATE идет с полным именем, только нет имени диска- но это элементарно узнается или через FILE_OBJECT или через VPB. На IRP_MJ_READ/WRITE уже подправленный FILE_OBJECT, но все запросы можно прикрыть в момент создания FILE_OBJECT, или хранить соотвествие FILE_OBJECT- имя, созданное в момент обработки IRP_MJ_CREATE в фильтре.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #5 : 28-01-2004 09:07 » |
|
"Да ладно пугать. IRP_MJ_CREATE идет с полным именем"
угу, особенно если учесть что имя бывает короткое и длинное, плюс related & полное, плюс комбинации длинных и коротких имен в пути, плюс FileID, плюс streeam file object, hard links... Вам понравится... point
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #6 : 28-01-2004 10:06 » |
|
угу, особенно если учесть что имя бывает короткое и длинное, плюс related & полное, плюс комбинации длинных и коротких имен в пути, плюс FileID, плюс streeam file object, hard links... Вам понравится...
Ой Опять рассказы про страшные вещи. Про такую вещь как собственный запрос IRP_MJ_QUERY_INFORMATION из твоего фильтра на нижележащий драйвер файловой системы слышал? Я думаю хватит пугать страшными фильтрами, иначе человек никогда за это не возьмется. Надо так - "Сначала ввяжемся, потом разберемся".
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #7 : 28-01-2004 10:12 » |
|
Про такую вещь как собственный запрос IRP_MJ_QUERY_INFORMATION из твоего фильтра на нижележащий драйвер файловой системы слышал?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #8 : 28-01-2004 10:17 » |
|
Хмм. Что-то не так? Я не понял, что ты хотел сказать.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #9 : 28-01-2004 10:20 » |
|
Про такую вещь как собственный запрос IRP_MJ_QUERY_INFORMATION из твоего фильтра на нижележащий драйвер файловой системы слышал?
я не сказал что проблема не решаема, я сказал что есть определенные трудности, в частности с вызовом query (рекурсия)... в общем чтобы закончить обмен бессмысленными заявлениями я дам ссылки на ресурсы посвященные file system filter devs http://www.osronline.com - нужно зарегестрироваться (бесплатно) тогда станут доступны статьи и многе другое. http://www.osronline.com/article.cfm?id=17 - IFS FAQ http://www.ntfsd.org - архив конференции по FileSystem drivers point.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #10 : 28-01-2004 10:27 » |
|
я не сказал что проблема не решаема, я сказал что есть определенные трудности, в частности с вызовом query (рекурсия)...
Дабы закончить- нет там никакой рекурсии, я же призываю не функцию ядра вызывать, которая зашлет запрос сначала на фильтр, а сделать свой IRP, и слать его сразу на драйвер файловой системы- никакой рекурсии нет. А способ обхода рекурсии при использовании ф-ций ядра давно известен- создание вторго DEVICE_OBJECT для твоего фильтра и засылки запросов на него, на osr он где-то описан, есть в IFSD.
|
|
|
Записан
|
|
|
|
XC™
Гость
|
|
« Ответ #11 : 28-01-2004 10:33 » |
|
А как делался перехват API? Низкоуровневым хуком (с суффиксом _LL ?) Или как-то ещё? 1) Пишешь прототип API функции ... (в DLL) 2) Внедряешь DLL в чужой процесс 3) Просматриваешь таблицу импорта этого процесса , находишь адрес функции, которую хочешь перехватить (там втупую имена функций указаны) 4) Если надо запоминаешь старый адрес и вписываешь свой адрес .. 5) Все ...
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #12 : 28-01-2004 10:47 » |
|
2SlavaI Дабы закончить- нет там никакой рекурсии, я же призываю не функцию ядра вызывать, которая зашлет запрос сначала на фильтр, а сделать свой IRP, и слать его сразу на драйвер файловой системы- никакой рекурсии нет.
при таком подходе рекурсии не будет. а теперь раскажите мне пожалуйста как с помощью IRP_MJ_QUERY_INFORMATION Вы собираетесь получить нормализованное имя объекта? судя по Вашим знаниям Вы должны быть в курсе что с помощью нее можно получить то имя объекта которое было передано в IRP_MJ_CREATE и если оно было коротким, то таким же и останется. Есть способ заставить IRP_MJ_QUERY_INFORMATION вернуть длинное имя, но он не рекомендован к применению при большом количестве разных фильтров в стеке. Единственный (известный мне) рекомендованный к применению способ основан на использовании IRP_MJ_DIRECTORY_CONTROL/IRP_MN_QUERY_DIRECTORY - надо получить имина всех объектов поочередно опрашивая все каталоги входящие в путь. проблема с относительным путем чаще всего решается с помощью написания кеша открытых объектов - в этом решении есть свои тонкости... описание всех трюков можно найти в сети... btw не нужно вводить людей в заблуждение - написание полноценного FS фильтра достаточно трудоемкая задача point.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #13 : 28-01-2004 11:00 » |
|
Вы должны быть в курсе что с помощью нее можно получить то имя объекта которое было передано в IRP_MJ_CREATE
Кто это такое сказал? По моему никакого стандарта нет. Оно будет таким, как его реализовали в драйвере, в частности как оно сохранено в FCB, который один на несколько FILE_OBJECT, которые могут быть открыты по разному- коротким именем, через RelatedFileObject и т.д. То есть с этим утверждением я не согласен. Действительно из CCB можно вытянуть инфу об открытии и вернуть короткое имя например и обрезать возвращаемое имя, полученное из полного.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #14 : 28-01-2004 11:09 » |
|
Кто это такое сказал? По моему никакого стандарта нет. Оно будет таким, как его реализовали в драйвере, в частности как оно сохранено в FCB, который один на несколько FILE_OBJECT, которые могут быть открыты по разному- коротким именем, через RelatedFileObject и т.д. То есть с этим утверждением я не согласен.
да собственно Вы лично можете быть не согласны c чем угодно - факт остается фактом. это не мое утверждение - не сочтите за труд поискать в архивах ntfsd - там это обсуждалось... point.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #15 : 28-01-2004 11:15 » |
|
да собственно Вы лично можете быть не согласны c чем угодно
Так я с этим не согласен, так как если напрячься и открыть код, например fastfat, то там написано // 1) short name: use FinalNameLength to tear off the path from FullFileName // and append the UNICODE converted short name. // 2) long name: just use FullFileName // // We bias to the name the user thinks they opened by. This winds // up fixing some oddball tunneling cases where intermediate filters // translate operations like delete into renames - this lets them // do the operation in the context of the name the user was using. // // It also matches what NTFS does, and so we have the definition of // correct behavior.
bias. То есть сделан выбор, но никак не стандарт, а "fixing some oddball".
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #16 : 28-01-2004 11:24 » |
|
2SlavaI:
мне не нужно ничего доказывать - мне все равно... факт такого поведения зафиксирован... поддерживать это нужно (если конечно Вы разрабатываете коммерческий софт). все остальные соображения можно направлять в MS...
point.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #17 : 28-01-2004 11:38 » |
|
мне не нужно ничего доказывать - мне все равно... факт такого поведения зафиксирован... поддерживать это нужно (если конечно Вы разрабатываете коммерческий софт). все остальные соображения можно направлять в MS...
Да, ладно. Я поспорить хотел
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #18 : 28-01-2004 12:50 » |
|
2SlavaI:
ну если поспорить, то могу высказать свое imho по поводу именования объектов лежащих во внешних пространствах имен (на файловых системах, в реестре и пр.):
на мой взгляд MS плохо специфицировал требования к именам этих объектов. Если бы были четко определены требования то такой чехарды с именами не было бы изначально...
point
|
|
|
Записан
|
|
|
|
XC™
Гость
|
|
« Ответ #19 : 28-01-2004 13:57 » |
|
Мне надо всего-навсего перехватить обращение к файловой системе или к диску
Если только это, то вот тебе 100% правильное решение 1) для перехвата обращений к файловой системе, достаточно простого драйвера фильтра файловой системы, не пугайся рассказов о сложности фильтров файловых систем- это так только в случае если ты пытаешься нетривиально модифицировать передаваемые данные, для простого анализа и отклонения запросов все очень просто. Самая большая сложность тут- не трогать запросы от VMM, посланные на страничный файл, а также желательно не трогать запросы на подгрузку страниц в секции, но если это для юзер мода- можно отклонять. Все запросы к страничному файлу легко вылавливаются, если надо скажу как. 2) Перехват обращений к дискам- тут есть тонкость. Если на диск(раздел) смонтирована файловая система то ВСЕ интересные для тебя обращения чтения, записи и IOCTL пойдут сначала через нее(то есть тут ты их поймаешь на фильтре файловой системы), потом они будут переданы на DEVICE_OBJECT одного из драйверов- ftdisk.sys или dmio.sys, а уже с них на драйвер disk.sys. Первые два драйвера отвечают за разделы на диске, третий драйвер за разделы и весь диск(то есть запросы, адресованные всему диску пойдут на него, например модификация таблицы разбиения). Обращаю внимание- пользовательское приложение без привилегий админа не сможет напрямую работать через disk.sys. Мне нужен именно 1-й пункт ... Помогите пожалуйста !
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #20 : 28-01-2004 14:46 » |
|
Мне нужен именно 1-й пункт ... Помогите пожалуйста !
Пиши свой e-mail, вышлю пример драйвера фильтра. Там есть все, что тебе нужно, переделай его как тебе надо(на самом деле- выкинь не нужное). Драйвер естественно на C.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #21 : 28-01-2004 14:54 » |
|
на мой взгляд MS плохо специфицировал требования к именам этих объектов. Если бы были четко определены требования то такой чехарды с именами не было бы изначально...
Если бы только там. Вся драйверная подсистема- это чехарда, когда разрабатывали в 1988-1993 годах спецификацию NT такая модель драйверов подходила хорошо, а потом началось- впихивание в IRP и другие устоявшиеся структуры указателей на новые структуры, связанных с появлением новых типов устройств и другого принципа взаимодействия, из-за чего логика построения IRP вобще исчезла. Но в принципе так всегда- первоначально разработанная красивая и понятная модель обрастает множеством добавок, которые все изменяют, нгаверняка у многих так было- программа превращается в этакого монстра, совершенно не совпадающего с первоначальными задумками. Создается впечатление(во всяком случае у меня)- эта модель драйверов находится на своем пределе, она неконтроллируема и тяжело понимаема.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #22 : 28-01-2004 15:23 » |
|
Создается впечатление(во всяком случае у меня)- эта модель драйверов находится на своем пределе, она неконтроллируема и тяжело понимаема. похоже... а еще создается ощущение что вся внутренняя иерархия драйверов не предусматривала разработки драйверов сторонними фирмами (за исключением разве что драйверов оборудования) - MS все собиралась делать сама... отсюда отсутствие документации (как можно документировать набор условий который с трудом умещается на странице кода?) и всевозможные заплатки... point
|
|
|
Записан
|
|
|
|
XC™
Гость
|
|
« Ответ #23 : 29-01-2004 07:15 » |
|
Пиши свой e-mail, вышлю пример драйвера фильтра. Prog.TM@mail.ru за ранее спасибо !
|
|
|
Записан
|
|
|
|
XC™
Гость
|
|
« Ответ #24 : 29-01-2004 07:21 » |
|
SlavaI, И еще один очень глупый вопрос не по теме (извините за это) : а кто имеет право нажимать '+' / '-' ? Только админы ?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #25 : 29-01-2004 07:30 » |
|
а кто имеет право нажимать '+' / '-' ? Только админы ?
По моему любой имеет право жать на эти кнопки. На этом форуме вобще нет злостных ограничений, максимальная свобода.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #26 : 29-01-2004 07:33 » |
|
А вот еще- в следующий раз не пиши почтовый адрес в открытую, делай например так Prog.TM $собака_гав_гав$ на сайте $ mail.ru а то спамерские роботы, сканирующие сеть в посиках адресов тебя засекут. Чем сильнее извратишь, тем лучше.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #27 : 29-01-2004 07:40 » |
|
XC™, послал, там аттачмент в пол мега, но по моему должен пролезть на mail.ru, если не пройдет- пиши, будем резать на части.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #28 : 29-01-2004 08:10 » |
|
XC™, только набрав определенное колличество сообщений ты можешь жать + и -
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Anonymous
Гость
|
|
« Ответ #29 : 29-01-2004 11:28 » |
|
SlavaI, да прогу получил и спасибо за совет на счет мыла ... ща буду исходники смотреть ...
|
|
|
Записан
|
|
|
|
|