Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Чуть больше, чем мастер ... или работа с ОС XP на низком уро  (Прочитано 24593 раз)
0 Пользователей и 1 Гость смотрят эту тему.
XC™
Гость
« : 27-01-2004 17:13 » 

Мне надо всего-навсего перехватить обращение к файловой системе или к диску  в XP и разрешить либо запретить выполнения перехваченной операции .
Перехват API - не помог . Драйвер помог только на 98 ...
Помогите пожалуйстя !!!
Чуть больше, чем мастер - Не понял
Не один мастер Delphi мне еще не ответил на этот вопрос ... и вообще - я просто хочу учиться ...
Записан
grozny
Гость
« Ответ #1 : 27-01-2004 20:09 » 

А как делался перехват API? Низкоуровневым хуком (с суффиксом _LL ?) Или как-то ещё?
Записан
SlavaI
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline Offline

« Ответ #10 : 28-01-2004 10:27 » 

Цитата

я не сказал что проблема не решаема, я сказал что есть определенные трудности, в частности с вызовом query (рекурсия)...


Дабы закончить- нет там никакой рекурсии, я же призываю не функцию ядра вызывать, которая зашлет запрос сначала на фильтр, а сделать свой IRP, и слать его сразу на драйвер файловой системы- никакой рекурсии нет. А способ обхода рекурсии при использовании ф-ций ядра давно известен- создание вторго DEVICE_OBJECT для твоего фильтра и засылки запросов на него, на osr он где-то описан, есть в IFSD.
Записан
XC™
Гость
« Ответ #11 : 28-01-2004 10:33 » 

Цитата: grozny
А как делался перехват 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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 » 

Цитата: SlavaI
Цитата

Мне надо всего-навсего перехватить обращение к файловой системе или к диску


Если только это, то вот тебе 100% правильное решение
1) для перехвата обращений к файловой системе, достаточно простого драйвера фильтра файловой системы, не пугайся рассказов о сложности фильтров файловых систем- это так только в случае если ты пытаешься нетривиально модифицировать передаваемые данные, для простого анализа и отклонения запросов все очень просто. Самая большая сложность тут- не трогать запросы от VMM, посланные на страничный файл, а также желательно не трогать запросы на подгрузку страниц в секции, но если это для юзер мода- можно отклонять. Все запросы к страничному файлу легко вылавливаются, если надо скажу как.
2) Перехват обращений к дискам- тут есть тонкость. Если на диск(раздел) смонтирована файловая система то ВСЕ интересные для тебя обращения чтения, записи и IOCTL пойдут сначала через нее(то есть тут ты их поймаешь на фильтре файловой системы), потом они будут переданы на DEVICE_OBJECT одного из драйверов- ftdisk.sys или dmio.sys, а уже с них на драйвер disk.sys. Первые два драйвера отвечают за разделы на диске, третий драйвер за разделы и весь диск(то есть запросы, адресованные всему диску пойдут на него, например модификация таблицы разбиения). Обращаю внимание- пользовательское приложение без привилегий админа не сможет напрямую работать через disk.sys.


Мне нужен именно 1-й пункт ... Помогите пожалуйста !
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #20 : 28-01-2004 14:46 » 

Цитата

Мне нужен именно 1-й пункт ... Помогите пожалуйста !


Пиши свой e-mail, вышлю пример драйвера фильтра. Там есть все, что тебе нужно, переделай его как тебе надо(на самом деле- выкинь не нужное). Драйвер естественно на C.
Записан
SlavaI
Главный специалист

ru
Offline 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 » 

Цитата: SlavaI
Пиши свой e-mail, вышлю пример драйвера фильтра.


Prog.TM@mail.ru за ранее спасибо !
Записан
XC™
Гость
« Ответ #24 : 29-01-2004 07:21 » 

SlavaI, И еще один очень глупый вопрос не по теме (извините за это) :
а кто имеет право нажимать '+' / '-' ? Только админы ?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #25 : 29-01-2004 07:30 » 

Цитата

а кто имеет право нажимать '+' / '-' ? Только админы ?


По моему любой имеет право жать на эти кнопки. На этом форуме вобще нет злостных ограничений, максимальная свобода.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #26 : 29-01-2004 07:33 » 

А вот еще- в следующий раз не пиши почтовый адрес в открытую, делай например так
Prog.TM $собака_гав_гав$ на сайте $ mail.ru
а то спамерские роботы, сканирующие сеть в посиках адресов тебя засекут. Чем сильнее извратишь, тем лучше.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #27 : 29-01-2004 07:40 » 

XC™,  послал, там аттачмент в пол мега, но по моему должен пролезть на mail.ru, если не пройдет- пиши, будем резать на части.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #28 : 29-01-2004 08:10 » 

XC™, только набрав определенное колличество сообщений ты можешь жать + и - Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
Anonymous
Гость
« Ответ #29 : 29-01-2004 11:28 » 

SlavaI, да прогу получил и спасибо за совет на счет мыла ... ща буду исходники смотреть ...
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines