ZwReadFile возвращает ошибку

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

  1. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    здравствуйте, надеюсь на вашу помощь

    в драйвере перехватывается ZwOpenFile, запрещая или разрешая доступ к свойствам определенных файлов
    определенные файлы - это массив байтов, эталон для сравнения

    нужно из драйвера прочитать начало файла, к примеру 1024 байт и сравнить с эталоном, равен ему или нет

    пытаюсь в своей функции прочитать начало файла в буфер функцией ZwReadFile, но она возвращает NT_STATUS = c0000008
    (NT_STATUS ERRORS:
    C0000008 STATUS_INVALID_HANDLE)

    не пойму, в чем может быть ошибка
    что я делаю не так? хендл неправильный передаю? но нужен же именно хэндл того файла, который в данный момент пытаются открыть

    всем заранее спасибо

    вот куски кода

    Код (Text):
    1. BOOLEAN checkFile(PHANDLE pFile) {
    2.   NTSTATUS
    3.     ns;
    4.   LARGE_INTEGER
    5.     byteOffs;
    6.   IO_STATUS_BLOCK
    7.     ios;
    8.   UCHAR
    9.     bufer [MAXBUF];
    10.  
    11.   RtlZeroMemory(&ios, sizeof(ios));
    12.   RtlZeroMemory(bufer, MAXBUF);
    13.   RtlZeroMemory(&byteOffs, sizeof(byteOffs));
    14.  
    15.   ns = ZwReadFile(*pFile, NULL, NULL, NULL, &ios, (PVOID)bufer, (ULONG)MAXBUF, &byteOffs, NULL); // статус возвращает c0000008
    16.  
    17.   if (NT_SUCCESS(ns)) {
    18.     if (checkBufer(bufer, myBuf, myBufCount)) { // проверка буфера с эталонным, до сюда он даже не доходит
    19.       return TRUE;
    20.     }
    21.   }
    22.  
    23.   return FALSE;
    24. }
    25.  
    26. NTSTATUS NewZwOpenFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG ShareAccess, IN ULONG OpenOptions) {
    27.  
    28.   if (checkFile(FileHandle)) { // см. функцию выше
    29. #ifdef DEBUG
    30.     DbgPrint("hook open\n");
    31. #endif
    32.     return STATUS_ACCESS_DENIED;
    33.   }
    34.   return OldZwOpenFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
    35. }
     
  2. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    PHANDLE != HANDLE.
     
  3. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    рызименование же указателя идет!
     
  4. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Но в checkFile вызывается сразу ZwReadFile ДО ZwOpenFile

    может в этом дело?)
    а хендл действительно инвалид)
     
  5. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    Код (Text):
    1. BOOLEAN checkFile(PUNICODE_STRING pPath) {
    2.   NTSTATUS
    3.     ns;
    4.   IO_STATUS_BLOCK
    5.     ios;
    6.   CHAR
    7.     bufer [MAXBUF];
    8.   HANDLE
    9.     pFile;
    10.   OBJECT_ATTRIBUTES
    11.     attr;
    12.  
    13.   __try {
    14.     InitializeObjectAttributes(&attr, pPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
    15.     RtlZeroMemory(&ios, sizeof(ios));
    16.     RtlZeroMemory(bufer, MAXBUF);
    17.     acs = 1;
    18.     ns = ZwCreateFile(&pFile, GENERIC_READ, &attr, &ios, NULL, FILE_ATTRIBUTE_NORMAL, FILE_READ_DATA, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, NULL);
    19.     acs = 0;
    20.     if (NT_SUCCESS(ns)) {
    21.       acs = 1;
    22.       ns = ZwReadFile(pFile, NULL, NULL, NULL, &ios, bufer, MAXBUF, NULL, NULL);
    23.       acs = 0;
    24.       ZwClose(pFile);
    25. #ifdef DEBUG
    26.       DbgPrint("readen %x, %x, %x, %x, %x", bufer[0], bufer[1], bufer[2], bufer[3], bufer[4]);
    27. #endif
    28.      
    29.       if (NT_SUCCESS(ns)) {
    30.         if (checkBufer(bufer, myBuf, myBufCount))
    31.           return TRUE;
    32.       }
    33.     }
    34.   }
    35.   __except (EXCEPTION_EXECUTE_HANDLER) {
    36.     ZwClose(pFile);
    37.     return FALSE;
    38.   }
    39.  
    40.   return FALSE;
    41. }
    после чтения файла в буфер, в буфере какой то мусор
    черех hex-редактор показывает к примеру d0 6d 45 4e
    а в буфере находится ffffffd0 ffffff6d 45 4e

    при чем не всегда стоят эти ffffff вначале, чтобы это могло быть?
     
  6. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    тут скорее всего проблема не в чтении а выводе данных, как у Вас может получатся в bufer[0] - 4 байта а у Вас должен быть один байт. %x - это же спецификатор не char выводит, вроде.
     
  7. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    а на вопрос откуда берутся ffff можно глянуть получающийся код, он будет ~ таким
    Код (Text):
    1.  
    2. movsx   eax, byte ptr [ebp+buffer+2]
    3. push    eax
    4. movsx   ecx, byte ptr [ebp+buffer+1]
    5. push    ecx
    6. movsx   edx, byte ptr [ebp+buffer]
    7. push    edx
    8. push    offset  formatstring
    из-за команды movsx все старшие биты становятся такими же как и знак buffer