NtOpenFile

Тема в разделе "WASM.WIN32", создана пользователем RabiatoR, 15 окт 2010.

  1. RabiatoR

    RabiatoR Влад

    Публикаций:
    0
    Регистрация:
    12 янв 2010
    Сообщения:
    5
    Адрес:
    Красноярск
    Здравствуйте, у меня возникла не большая проблема.
    Написал драйвер который перехватывает NtCreateProcessEx (перехваченная функция HfCreateProcessEx, оригинальная функция DfCreateProcessEx)
    Получаю имя запускаемой программы (\Device\HarddiskVolume1\WINDOWS\system32\calc.exe), после чего пытаюсь открыть файл через NtOpenFile, но результатом всегда является [0xC000003B] STATUS_OBJECT_PATH_SYNTAX_BAD.
    Помогите пожалуйста, и если не сложно то объясните как аллоцировать память для переменных (для строки с именем файла) :) ото я никак не могу этого понять.
    Вот код:
    Код (Text):
    1. NTSTATUS UfOpenFile( OUT PHANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, IN ULONG ShareAccess, IN ULONG OpenOptions ){
    2.     OBJECT_ATTRIBUTES ObjectAttributes;
    3.     InitializeObjectAttributes( &ObjectAttributes, ObjectName, /*OBJ_EXCLUSIVE*/OBJ_KERNEL_HANDLE, NULL, NULL );
    4.     return ZwOpenFile( FileHandle, DesiredAccess, &ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions );
    5. }
    6.  
    7. NTSTATUS HfCreateProcessEx( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE InheritFromProcessHandle, IN BOOLEAN InheritHandles, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL, IN HANDLE Unknown ){
    8.     NTSTATUS retn = 0, status = 0;
    9.     char ImageFileNameBuffer[ (sizeof(USHORT)+sizeof(USHORT)+(sizeof(WCHAR)*MAX_PATH)) ];
    10.     PUNICODE_STRING ImageFileName = (PUNICODE_STRING)ImageFileNameBuffer;
    11.     ULONG ReturnLength;
    12.     HANDLE FileHandle;
    13.     IO_STATUS_BLOCK FileIOStatusBlock;
    14.    
    15.  
    16.     __try{
    17.         retn = DfCreateProcessEx( ProcessHandle, DesiredAccess, ObjectAttributes, InheritFromProcessHandle, InheritHandles, SectionHandle, DebugPort, ExceptionPort, Unknown );
    18.         if( NT_SUCCESS(retn) ){
    19.             status = UfQueryProcessFileName( *ProcessHandle, ImageFileNameBuffer, &ReturnLength );
    20.             if( NT_SUCCESS( status ) ){
    21.                 DPRINT( "HfCreateProcessEx: [%d][%d]ImageFileName = \"%wZ\"\n", ReturnLength, ImageFileName->Length, ImageFileName );
    22.                 status = UfOpenFile( &FileHandle, &FileIOStatusBlock, ImageFileName, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, FILE_RANDOM_ACCESS );
    23.                 if( NT_SUCCESS( status ) ){
    24.                     DPRINT( "UfOpenFile: Success\n" );
    25.                 }else{
    26.                     DPRINT( "UfOpenFile: faiture! code: [%08X]\n", status );
    27.                 }
    28.                 DPRINT( "HfCreateProcessEx: UfOpenFile return: %08X\n", status );
    29.                 DPRINT( "HfCreateProcessEx: [%d][%d]ImageFileName = \"%wZ\"\n", ReturnLength, ImageFileName->Length, ImageFileName );
    30.             }else{
    31.                 DPRINT( "HfCreateProcessEx: UfQueryProcessFileName failture! code: [%08X]\n", status );
    32.             }
    33.             ZwTerminateProcess( *ProcessHandle, STATUS_ACCESS_DENIED );
    34.         }else{
    35.             DPRINT( "HfCreateProcessEx: DfCreateProcessEx failture! code: [%08X]\n", retn );
    36.         }
    37.     }__except( EXCEPTION_EXECUTE_HANDLER ){
    38.         return STATUS_INVALID_PARAMETER;
    39.     }
    40.     return STATUS_ACCESS_DENIED;
    41. }
    Результат выполнения программы: (Syser)
    DriverEntry: Called
    HfCreateProcessEx: [108][98]ImageFileName = "\Device\HarddiskVolume1\WINDOWS\system32\calc.exe"
    UfOpenFile: faiture! code: [C000003B]
    HfCreateProcessEx: UfOpenFile return: C000003B
    HfCreateProcessEx: [108][98]ImageFileName = "??bo??????
    >