Несколько вопросов по перехвату ntCreateFile/ntOpenFile

Тема в разделе "WASM.WIN32", создана пользователем Progr, 24 ноя 2006.

  1. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Здраствуйте, господа,
    Необходима Ваша помощь в перехвате ntCreateFile и ntOpenFile из-под драйвера:
    - Как определить что пытается открыть система: файл или каталог?
    - Как получить полный путь к открываемому файлу/каталогу (т.к. иногда запрос на открытие передается без пути в расчете на: файл в текущем каталоге; файл лежит в каталогах прописанных в окружении и т.п...)?
    - Как система еще может открывать каталоги, кроме ntOpenFile?

    Заранее очень благодарен!
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    1) Если есть флаг FILE_DIRECTORY_FILE, то каталог. Если FILE_NON_DIRECTORY_FILE - файл. В других случаях возможны варианты.
    2) ObReferenceObjectByHandle --> ObQueryNameString
    3) Только NtCreateFile и NtOpenFile, которые сводятся к вызову IoCreateFile
     
  3. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    В ntCreateFile, я так понимаю параметр IN ULONG FileAttributes, верно?
    А как же с ntOpenFile? Через какой там параметр передается этот атрибут?

    Код (Text):
    1. NTSTATUS NtOpenFile (
    2.   OUT PHANDLE             FileHandle,
    3.   IN ACCESS_MASK          DesiredAccess,
    4.   IN POBJECT_ATTRIBUTES   ObjectAttributes,
    5.   OUT PIO_STATUS_BLOCK    IoStatusBlock,
    6.   IN ULONG                ShareAccess,
    7.   IN ULONG                OpenOptions )
    В смысле? Какие еще случаи/варианты?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    if (CreateOptions & FILE_DIRECTORY_FILE) DbgPrint("Create/Open Directory.");
    Много способов есть. Самые изощренные, как то чтение напрямую структуры NTFS, не перехватишь.
    Ищи на форуме, такое было.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    нет, CreateOptions.
    OpenOptions
     
  6. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    1) при создании обычно указывается тип объекта, при открытии существующего - достаточно имени
    тип можно узнать запросив ФС (после удачного Create)
    2) это нетривиальная процедура
    ObQueryNameString - один из вариантов
    еще ZwQueryInformationFile, самому IRP послать
    3) IoCreateFile часто вызывают напрямую (например Srv.sys)
     
  7. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Я имел ввиду стандартные, чтоб весь перехват не накрылся из-за какой-нибудь АПИшной ф-ции.
     
  8. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Т.е. можно вообще не узнать каталог или файл запрошен?
     
  9. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Узнать можно всегда, но там не все определяется флагами. В какой-то книжке по нутрям виндовс было расписано, как узнать, только не помню в какой :dntknw:
     
  10. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Ок, спасибо большое