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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Драйвер контроля доступа  (Прочитано 8595 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
nike
Гость
« : 18-12-2003 08:49 » 

Я тут пишу драйверок, он просто подменяет системные сервисы ядра.
Так вот, мне нужно подменить всего 2 функции:

Код:
     ZwCreateFile()
     ZwOpenFile()

    
С функцией ZwCreateFile() прошло все легко. А вот с ZwOpenFile у меня небольшая проблема. По ней у меня собственно и вопрос:
      я делаю так, - в своем обработчике принимаю все параметры, которые предназначены для функции ZwOpenFile(), проверяю имя файла, оно содержится в одном из параметров функции - структуре ObjectAttributes->ObjectName,
если оно \??\c:\myfile.dat, то что-то делаю, иначе передаю через стек параметры и вызываю оригинальный обработчик.
      Так вот, для ZwCreateFile() такая проверка работала, а для ZwOpenFile() почему-то нет.
      Мне кажется, что причиной этому может быть то, что в поле ObjectName передается только имя файла без пути, а путь по идее указан в той же структуре в поле RootDirectory. Но как понимать, что тип у этого поля HANDLE? Тут же должен путь находится?!

      Хотелось бы услышать возможные идеи по решению этой проблемы. Наверняка это уже кто-нибудь делал.
      Заранее спасибо.
« Последнее редактирование: 23-11-2007 15:52 от Алексей1153++ » Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 18-12-2003 13:00 » 

Цитата
Мне кажется, что причиной этому может быть то, что в поле ObjectName передается только имя файла без пути

Ну так кажется или точно?
Вобще-то ZwOpenFile эквивалентна ZwCreateFile, точнее
Код:
ZwOpenFile(handle, DesiredAccess,oa,IoStatusBlock, SharedAccess, OpenOptions)==
       ZwCreateFile(handle, DesiredAccess, oa, IoStatusBlock,0,0,SharedAccess, FILE_OPEN, OpenOptions,0,0).

Если там действительно nahdle то получи название директории через handle.
Последовательность действий такая- получить по handle указатель на FileObject, далее или помучить FileObject пытаясь из него выцарапать директорию, или послать запрос IRP_MJ_QUERY_INFORMATION на драйвер файловой системы.
 Из Handle получить FILE_OBJECT можно при помощи ObReferenceObjectByHandle.
 В FILE_OBJECT имя содержится в поле FileName, но там нет имени диска, надо его получить- указатель на диск на котором файл находится можно взять из поля DeviceObject или Vpb->RealDevice, а Vpb->DeviceObject указывает на DEVICE_OBJECT драйвера файловой системы. Имя диска(но не букву) можно получить при помощи  ObQueryNameString, и заранее получить соответсвие символьной ссылки(буквы) имени DEVICE_OBJECT для диска- ZwQuerySymbolicLinkObject . Далее сложить все имена- и вот полное имя.

 Возможно в FILE_OBJECT имя составное и начало имени в поле RelatedFileObject->FileName.

  Вместо всего вышеприведенного можно попытаться использовать NtQueryInformationFile для класса FileNameInformation на твой handle директории. Но имя диска скорей всего придется получать как сказано выше.

Если чего неясно- спрашивай, будем дальше разбираться.
Будь всегда осторожен, пытаясь что-то открывать при фильтрации Create запросов- можно зациклится, так как послав Create запрос ты можешь опять попасть в свой фильтр. Применяй Nt ф-ции(они не обращаются к таблице функций, но помни- они не изменяют RequestMode- подробнее вот тут http://www.osronline.com/article.cfm?id=257  ) и думай что делаешь.
« Последнее редактирование: 23-11-2007 15:53 от Алексей1153++ » Записан
[nike]
Гость
« Ответ #2 : 20-12-2003 11:21 » 

И последний раз о сравнении юникодовых строк.
У меня с этим небольшая проблема:
С помощью функции RtlCompareUnicodeString() я сравниваю две строки:
напр. L"\\??\\c:\\myfile.dat", предварительно ее инициализировав, и
параметр для ZwOpenFile: ObjectAttributes->ObjectName. Так вот, имена файлов точно сходятся, но функция возвр. не 0, а >0.
Вопрос в том, как эта функция сравнения работает, в смысле она проверяет в юникодовой строке только str->Buffer, или же и str->Length, а также
str->MaximumLength. Пробовал выводить эти поля и сравнивать со своей строкой, совпадает только
Код:

str->Buffer
 и
Код:
ObjectAttributes->ObjectName-Buffer
.
     Может мне их как-нибудь по-другому сравнивать?
Записан
[nike]
Гость
« Ответ #3 : 20-12-2003 11:23 » 

С тегом КОД не вышло.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 22-12-2003 06:05 » 

Цитата

С тегом КОД не вышло.


наклон не в ту сторону не "\code" а "/code".
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 22-12-2003 06:11 » 

Цитата

Так вот, имена файлов точно сходятся, но функция возвр. не 0, а >0.
Вопрос в том, как эта функция сравнения работает,


А ты сравнивай в независимости от регистра- третий параметр TRUE.
Сравнивать должна так- проверять чтобы были равны поля Length а потом сравнивает посимвольно.
Записан
.
Гость
« Ответ #6 : 29-07-2004 05:26 » 

вообще для контроля доступа к объектам на фаловых системах правильнее применять fs filters. Вы не сможете полностью контролировать доступ к объектам находясь на уровне перехвата системных вызовов. плюс ко всему используя имя объекта в качестве ключа для принятия решения Вы рискуете пропустить запрос который в качестве имени будет содержать например file id. да и вообще идентификация объектов на файловых системах дело достаточно сложное, обычно невозможно решить задачу корректно используя имя объекта..
Записан
mad
Гость
« Ответ #7 : 29-07-2004 07:58 » 

да, кстати говоря....
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines