Вопросик про ntClose

Тема в разделе "WASM.BEGINNERS", создана пользователем test555, 1 дек 2008.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Перехватываю в ядре (драйвер) функции NtOpenFile, NtCreateFile
    Задача - отловить процесс записи файла на диск.
    Легко ловлю последние 2 функции, пути файлов и флаги (когда открывают на запись).

    Однако проблемка, операцию с этим файлом требуется делать только после закрытия, таким образом ловить ntClose

    Вопрос: какими ядерными функциями определить, что при вызове ntClose :
    а) Что это был хендл файла
    б) Путь к файлу
    в) Флаги с которыми он был открыт. Т.к. интересуют только когда закрываются файлы, открытые для записи.

    Когда писал в юзермоде, была функция GetFileNameByHandle

    Покопался в мсдн, не нашел подобного... Форум тоже проискал на словосочетание ntClose ..

    Есть конечно вариант, запоминать хендлы при открытии файлов (на запись) а потом сравнивать в процедуре закрытия.. Но это плозой вариант...

    Спасибо
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    По крайней мере сперва ObReferenceObjectByHandle. Получишь указатель на объект.
    Определить тип документированно - ZwQueryObject (Class=ObjectTypeInfo), недокументированно и быстрее - щн есть в ObjectHeader->ObjectType (проверка OBJECT_TO_OBJECT_HEADER(Object)->ObjectType == *IoFileObjectType)
    Получить флаги с которми он был открыт - изучай поля FILE_OBJECT структуры

    PS. ZwQueryObject нет в ntddk.h, потребуется ntifs.h
    PPS. Ворненг: сам не видел, но слышал, что в ZwQueryObject есть deadlock при некоорых обстоятельствах, связанных, кажется, с пайпами.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Щас он спросит что это значит :lol: ))))
     
  4. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Код (Text):
    1. PFILE_OBJECT pFileObject;
    2.  
    3.                     status = ObReferenceObjectByHandle(Handle,
    4.                                        0,
    5.                                        *IoFileObjectType,
    6.                                        KernelMode,
    7.                                        &pFileObject,
    8.                                        NULL
    9.                                        );
    10.                                        
    11.                                        
    12. if (status ==0 ) DPRINT("CLOSE HANDLE %x, status = %x", Handle, status);
    Если возвращяет не ноль, значит это не файл.. Так и есть,
    0xC0000024
    STATUS_OBJECT_TYPE_MISMATCH
    Это он мне и давал..
    Вопрос только у меня, правильно ли я ему Кернелмод поставил в параметре и что ему дал
    IN ACCESS_MASK DesiredAccess равному 0

    Пока не могу понять, почему в перехваченных функциях у меня печатаются хендлы в %x как миниум 6 символов, а в ntClose - всегоп о три..
    Я думал что какие-то ранее открытые хендлы будут закрыты..
    Странно...
     
  5. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Все же еще прошу помощи..

    Код (Text):
    1. PFILE_OBJECT pFileObject;
    2.                 status = ObReferenceObjectByHandle(Handle,
    3.                                        0,
    4.                                        *IoFileObjectType,
    5.                                        KernelMode,
    6.                                        &pFileObject,
    7.                                        NULL
    8.                                        );
    9.                                    
    10. if (status ==0 ) {
    11. if ( pFileObject->WriteAccess)  DPRINT("FILE CLOSE = %S", pFileObject->FileName.Buffer);
    12. ..
    Выводит путь без диска..
    Нашел совет использовать функцию IoGetRelatedDeviceObject

    А вот дальше, не пойму. Посмотрел структуру PDEVICE_OBJECT в DDK.. Даже не знаю что дальше делать..
     
  6. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Вопрос решен.
    RtlVolumeDeviceToDosName
     
  7. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    test555
    IoVolumeDeviceToDosName()
     
  8. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Есть такое дело. Обходится просто. Вызываем функцию в отдельном треде. Если нет ответа - прибиваем тред по таймауту.