Имя файла при перехвате NtCreateFile

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

  1. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Здравствуйте.
    Есть драйвер который перехватывает NtCreateFile. В теле перехватчика мне надо узнать полное имя файла который желают создать. Делаю это при помощи функции ZwQueryInformationFile. Но вот здесь http://www.wasm.ru/article.php?article=lockfileswork, прочитал следующие:
    Так вот хочется узнать как избежать этого зависания?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Зависание только в user mode.
     
  3. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    IceStudent
    разве ZwQueryInformationFile в ntdll.dll не вызывает фактически ее же из ntoskrnl?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Nouzui
    Вызывается, однако обычно в NtAPI идёт проверка на предыдущий режим, если KernelMode то действия иногда могут отличаться.
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    тогда ее надо вызывать через workitem'ы или из отделного потока ядра - при обработке DeviceIoControl или ReadFile/WriteFile PreviousMode==UserMod
     
  6. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    заюзай для получения имени файла по хендлу ObReferenceObjectByHandle => ObQueryNameString и не парься
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    1. если уж на то пошло, то имя создаваемого файла передается в NtCreateFile через третий параметр - ObjectAttributes
    2. ObQueryNameString вроде бы вернет что-то вроде "\\Device\\HardDiskVolumeX". или я что-то путаю?
     
  8. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Код (Text):
    1. 2. ObQueryNameString вроде бы вернет что-то вроде "\\Device\\HardDiskVolumeX". или я что-то путаю?
    ага, вернёт что-то вроде \\Device\\HardDiskVolumeX\\path\\to\\file\\somefile.exe
     
  9. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    Я конечно новичок тут, но насколько я помню имя файла передается в OBJECT_ATTRIBUTES.ObjectName

    А будет без девайсов, а сразу c:\\path\\newfile.txt
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    из ring0 - и не парься там всё рульно.
    а из ring3 - создаёшь поток перед вызовом ZwQueryInformationFile и потоке делаешь обращение к файлу по полученному хэндлу. Если поток не отзывается (проверять WaitForSingleObject) - валишь его ZwTerminateThread и этот хэндл лучше пропустить, иначе - все в норме.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    если я хочу открыть файл в текущем каталоге, там будет только имя. а ему нужен полный путь.
    имхо лучший вариант - ObReferenceObjectByHandle
     
  12. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    С именем файла при перехвате все понятно. А как узнать имя процесса, который открыл этот файл ( вызвал ф-цию)?
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    PsGetCurrentProcess тебе мб поможет
     
  14. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    нет, боюсь мне это не поможет. Как определяет filemon имя процесса? Читал где-то на васме, что надо получить доступ к какой-то структуре и там будет это поле. А вот где читал, не помню, поиск в гугле не помог. Ладно, поищу сорцы filemon
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ProfessorNimnull
    в EPROCESS есть поле ImageFileName насколько я помню =\
    так же там есть указатель на PEB, где в списке модулей можно найти и экзешник с полным путём
     
  16. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    если я не ошибаюсь получить указатель я смогу через регистр fs. хотя в ядре, вроде, fs указывает на что-то другое... А можно по подробнее как получить указатель, вообще, я в правильном направлении мыслю или ход моих мыслей приведет меня в тупик.

    Добавленно: ой, нет, fs же вроде на TEB указывает


    Добавленно еще раз: Нашел, что можно получить через ZwQueryInformationProcess
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    в структуре EPROCESS есть указатель PPEB.
     
  18. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    Great, а EPROCESS я смогу получить через fs, так?
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ProfessorNimnull
    PsGetCurrentProcess( )
     
  20. ProfessorNimnull

    ProfessorNimnull New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    26
    Great, Спасибо тебе большое, что так быстро, вежливо и точно отвечаешь на мои глупые вопросы =)