полный путь по хендлу(ObReferenceObjectByHandle/ObQueryNameString)

Тема в разделе "WASM.NT.KERNEL", создана пользователем BrooVizor, 9 июн 2011.

  1. BrooVizor

    BrooVizor New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2011
    Сообщения:
    9
    Собствено пытаюсь получить полный путь к открытому файлу, по его хендлу. Но Получается только полный путь к папке, где лежит этот файл, без имени самого файла, что очень странно и не понятно..
    Код:
    Код (Text):
    1. for(i = 0; i < Info->NumberOfHandles; i++)
    2.     {
    3.         if( Info->Handles[i].ObjectTypeIndex == FileObjectType &&
    4.             PsGetCurrentProcessId() != (HANDLE)Info->Handles[i].UniqueProcessId)
    5.         {
    6.             status = PsLookupProcessByProcessId ((HANDLE)Info->Handles[i].UniqueProcessId , &EProcN );
    7.            
    8.            
    9.             if (!NT_SUCCESS(status))
    10.             {
    11.                 DbgPrint("PsLookupProcessByProcessId() ERROR : 0x%.8x\n", status);
    12.             }
    13.             else
    14.             {
    15.            
    16.                 KeStackAttachProcess(EProcN, &kApcState);
    17.            
    18.                
    19.                 status = ObReferenceObjectByHandle( (HANDLE)Info->Handles[i].HandleValue,
    20.                                                 0,
    21.                                                 0,
    22.                                                 UserMode,
    23.                                                 &UObjFile,
    24.                                                 NULL
    25.                                                 );
    26.                
    27.                 if (!NT_SUCCESS(status))
    28.                 {   DbgPrint("ObReferenceObjectByHandle, status %x", status);           }
    29.                
    30.                 else
    31.                 {
    32.                     DbgPrint("Handle %X || %ws", (HANDLE)Info->Handles[i].UniqueProcessId, UObjFile->FileName.Buffer);
    33.    
    34.                    
    35.                     status = ObQueryNameString( UObjFile,
    36.                                                 (POBJECT_NAME_INFORMATION)NameInfo,
    37.                                                 sizeof(NameInfo),
    38.                                                 &ReturnLength
    39.                                         );
    40.            
    41.                     if (!NT_SUCCESS(status))
    42.                     {
    43.                         DbgPrint("ObQueryNameString, status %x", status);          
    44.                     }
    45.                     else
    46.                     {
    47.                         DbgPrint("NameSTR: %ws", &((POBJECT_NAME_INFORMATION)NameInfo)->Name.Buffer)
    48.                
    49.                     }
    50.                    
    51.                     ObDereferenceObject(&UObjFile);        
    52.                 }
    53.  
    54.                    
    55.                 KeUnstackDetachProcess(&kApcState);
    56.      }
    Открываю файл в нотпаде C:\access_test\file.txt , а на выводе получаю:
    Код (Text):
    1. Handle 35C || \access_test
    2. NameSTR: ??\Device\HarddiskVolume1\access_test
    И обязательно делать аттач к процессу или можно как-то это иначе реализовать?
     
  2. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
  3. BrooVizor

    BrooVizor New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2011
    Сообщения:
    9
    assorted, мне нужно совсем другое.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    А ты не думал, что Блокнот может открыть файл, прочитать и сразу же закрыть его?

    Код (Text):
    1. DbgPrint("NameSTR: %ws", &((POBJECT_NAME_INFORMATION)NameInfo)->Name.Buffer)
    Что это за ересь?
    Зачем тут амперсанд?

    Обязательно, т.к. функция ObReferenceObjectByHandle() всегда берёт таблицу хендлов текущего процесса.
     
  5. Xml

    Xml New Member

    Публикаций:
    0
    Регистрация:
    18 май 2011
    Сообщения:
    54
     
  6. BrooVizor

    BrooVizor New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2011
    Сообщения:
    9
    Согласен, это кусок где-то скопипастил.
    Думал, посему написал драйвер, который будет открывать файл в монопольном режиме(для верности) и закрывать его после выгрузки. И вот тут получились очень интересные результаты. Я чесно сказать, весь день бился над тестами.
    Сделал 2 реализации, получения пути к фалу по его хенду.
    1 - с помощью ZwQueryInformationFile
    2 - ObReferenceObjectByHandle

    Запускаю драйвер, который открывает файл.
    1 - вариант отрабатывает хорошо, получаю вот такой лог:
    Код (Text):
    1. || Handle 4c8 || UniqueProcessId 178 || Name: \access_test\file.txt
    Тут же запускаю 2ой вариант, код которого в 1ом посте:
    Код (Text):
    1. PID 178|| Handle 4C8 || \WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03
    wtf?

    Что касаемо 1го варианта, ZwQueryInformationFile частенько вешается, наверно нужно как-то это дело в потоке реализовывать. Хотелось бы разобраться со 2ым вариантом.

    P.S: Т.к. ZwQueryInformationFile загинается, нужно создавать поток, а убивать его только извне, это лишний изварт и вариант значит этот отметается.
     
  7. BrooVizor

    BrooVizor New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2011
    Сообщения:
    9
    Всем спасибо, проблему решил. Посмотрел драйвер анлокера.