Пути к файлам в нулевом кольце

Тема в разделе "WASM.NT.KERNEL", создана пользователем RetroCode, 13 сен 2007.

  1. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Такой вопрос: какие существуют виды путей к файлам в Win2000, XP, 2003 и как их можно привести к какому-нибудь одному виду (нужно будет для сравнения).
    Пока знаю только:
    - Дос-вариант (C:\dir\file.ext);
    - Системный вариант (\harddiskvolume3\dir\file.ext).
    Какие еще существуют варианты и как привести их, например, к системному (см. выше) из-под драйвера (Legacy)?

    Спасибо
     
  2. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Да, пардон, забыл. Пути имеются ввиду не только на одной машине но и в локальной сети...
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вариант в ядре только один - полный путь относително корневой директории менеджера объектов.
    Выглядеть это может так:

    \??\C:\dir\file.ext
    \DosDevices\C:\dir\file.ext
    \GLOBAL??\C:\dir\file.ext
    \Device\Harddisk0\Partition1\dir\file.ext
    \Device\HarddiskVolume1\dir\file.ext

    первые 4 варианта это через симольные ссылки, последний - напрямую к объекту DEVICE раздела.
    Насчет пути через сеть.. я не помню, был девайс какойто специальный для этого..
     
  4. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Спасибо, вот нашел упоминания что в локальных сетях существуют такие два варианта:
    - Mapped
    - UNC
    По UNC инфа вроде есть, изучаю. А вот с mapped пока не понятно... Может кто знает что это такое?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А вот точно, девайс UNC звался вроде..
     
  6. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    А про mapped никто ничего не знает?
     
  7. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Хм.. Но ведь при открытии файла в системной директории совсем не обязательно указывать полный путь. То есть функции IoCreateFile вполне может быть передан путь "System32\kernel32.dll".
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Уверен насчет ioCreateFile?
     
  9. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Хе.. я думал прокатит.. Ну да ладно... во многих других функциях такой путь прокатывает. да и вообще в OBJECT_ATTRIBUTES вполне может быть указана RootDirectory так что для определения полного пути к файлу придётся найти её по хендлу.
     
  10. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Ну так все же!?
    Если я нахожусь в обработчике, скажем, zwCreateFile/ntCreateFile, как мне привести к одному и тому же виду разного вида пути ("Досовский", UNC, и др).
    Есть такая возможность или для каждого придется писать особый метод?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    они к тебе и так приходят все в одном виде - в виде пути относительно корня менеджера объектов (ну либо не корня если указан RootDirectory, тогда надо просто дописать в начало путь к RootDirectory). что ты хочешь сделать я не понимаю.
     
  12. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Не, не одном.
    В том-то и проблема. Я набросал небольшой ntCreateFile-перехватчик, который просто выводит имена всех дергаемых файлов. После его активации малость побродил по каталогам и по сетевым расшаренным ресурсам. Вариантов путей наблюдалось несколько.
    Например, поле ObjectName содаржал такие варианты:
    - \??\C:\WINDOWS\system32\shell32.dll
    - \Device\LanmanRedirector\PHILKA\LINEAGE II - INTERLUDE (сетевой ресурс на PHILKA)
    - \??\UNC\PHILKA\LINEAGE II - INTERLUDE\ (он же)
    - \DEVICE\HARDDISKVOLUME2\PROGRAM FILES\DEBUGVIEW\DBGVIEW.EXE (запуск апп)
    Как видно варинтов путей встречается тьма.

    Очень просто - фильтр. Блокировать обращения к некоторым файлам, да столкнулся с тем что:
    - путь может быть указан по-разному
    - в сети они вообще по-особенному строятся
    Вот и возник вопрос: как все это унифицировать?
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Это один и тот же вариант. Относительно корня менеджера объектов.
    \?? глобальный каталог, доступный из юзермода, \??\C:\ это символьная ссылка на \Device\HarddiskVolume2, то есть первый путь эквивалентен
    \Device\HarddiskVolume2\Windows\System32\shell32.dll, то есть такой же как и последний.
    Дальше, смотрим номер три. \??\UNC это ссылка на \Device\Mup - Multi UNC Provider.
    как видно путь тоже относительно корня.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    нужно дописать в начало путь к RootDirectory, если это поле ненулевое в OBJECT_ATTRIBUTES + руками обрабатывать символьные ссылки через ZwQuerySymbolicLinkObject.

    в конце концов все вариации:

    \??\C:\Windows\System32\shell32.dll
    \GLOBAL??\C:\Windows\System32\shell32.dll
    \DosDevices\C:\Windows\System32\shell32.dll
    \Device\Harddisk0\Partition2\Windows\System32\shell32.dll
    \SystemRoot\System32\shell32.dll
    \KnownDlls\KnownDllPath\shell32.dll


    приведутся к одной вида: \Device\HarddiskVolume2\Windows\System32\shell32.dll
     
  15. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Вау Great! Ты правда Great! А на коде не покажешь как ZwQuerySymbolicLinkObject прикрутить... буду крайне благодарен (да и все кто столкнется)?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Хм.. ну я не знаю, может быть есть функция в ядре которая автоматом заменяет все символьные ссылки, но я про такую не слышал.
    Поэтому действуем ручками:
    сначала дописываем слева путь RootDirectory, если он указан в OBJECT_ATTRIBUTES.
    Далее перебираем путь до первого слеша \ (не считая корневого первого), смотрим что у нас слева - если это directory, то продолжаем дальше до следующего слеша, если это Symbolic link, то заменяем все, что слева на значение symlink'а (как это сделать - ZwOpenSymbolicLinkObject + ZwQuerySymbolicLinkObject, в MSDN подробно описаны эти ф-ии и вроде даже пример есть).
    И так проходим пока не переберем все элементы пути, разделенные слешами "\". Соответственно, все что встречается до последнего слеша - либо каталоги (их не трогаем), либо символьные ссылки (их разрешаем через эти две функции).
    После последнего слеша остается непосредственно имя объекта.

    Пример разбора \Device\Harddisk0\Partition2\Windows\System32\shell32.dll:

    1) дошли до первого слеша (не считая корневого): \Device\, отбрасываем последний символ и смотрим тип объекта \Device - это каталог. Пропускаем
    2) дошли до следующего слеша, слева у нас - \Device\Harddisk0\, отбрасываем последний символ и смотрим тип объекта - это каталог. Снова пропускаем
    3) дошли до очередного слеша, слева у нас \Device\Harddisk0\Partition2\, отбрасываем завершающий слеш и смотрим тип объекта - это символьная ссылка на \Device\HarddiskVolume2, заменяем все, что слева на значение символьной ссылки. В результате получаем путь \Device\HarddiskVolume2\Windows\System32\shell32.dll
    4) дальше уткнулись в девайс - HarddiskVolume2. Остальная часть строки, если мы пожелаем открыть этот файл, будем передана парсеру драйвера файловой системы (\Windows\System32\shell32.dll), который попробует найти этот файл и решит, что с ним делать. Ну а мы обработали полный путь полностью
     
  17. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Спасибо. А UNC пути, я так понимаю, приводить ни к чему не нужно, а обрабатывать как есть.
    Спасибо, Great!
    Great +1
     
  18. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Упс, небольшой затык.
    А как определить где каталог, а где ссылка?
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну видимо ZwCreateFile (тут придется гадать что указывать в опшнс - FILE_DIRECTORY_FILE или FILE_NON_DIRECTORY_FILE) + ZwQueryObject( ObjectTypeInformation )
     
  20. RetroCode

    RetroCode New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2007
    Сообщения:
    25
    Понял, сенкс