здравствуйте, надеюсь на вашу помощь в драйвере перехватывается ZwOpenFile, запрещая или разрешая доступ к свойствам определенных файлов определенные файлы - это массив байтов, эталон для сравнения нужно из драйвера прочитать начало файла, к примеру 1024 байт и сравнить с эталоном, равен ему или нет пытаюсь в своей функции прочитать начало файла в буфер функцией ZwReadFile, но она возвращает NT_STATUS = c0000008 (NT_STATUS ERRORS: C0000008 STATUS_INVALID_HANDLE) не пойму, в чем может быть ошибка что я делаю не так? хендл неправильный передаю? но нужен же именно хэндл того файла, который в данный момент пытаются открыть всем заранее спасибо вот куски кода Код (Text): BOOLEAN checkFile(PHANDLE pFile) { NTSTATUS ns; LARGE_INTEGER byteOffs; IO_STATUS_BLOCK ios; UCHAR bufer [MAXBUF]; RtlZeroMemory(&ios, sizeof(ios)); RtlZeroMemory(bufer, MAXBUF); RtlZeroMemory(&byteOffs, sizeof(byteOffs)); ns = ZwReadFile(*pFile, NULL, NULL, NULL, &ios, (PVOID)bufer, (ULONG)MAXBUF, &byteOffs, NULL); // статус возвращает c0000008 if (NT_SUCCESS(ns)) { if (checkBufer(bufer, myBuf, myBufCount)) { // проверка буфера с эталонным, до сюда он даже не доходит return TRUE; } } return FALSE; } NTSTATUS NewZwOpenFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG ShareAccess, IN ULONG OpenOptions) { if (checkFile(FileHandle)) { // см. функцию выше #ifdef DEBUG DbgPrint("hook open\n"); #endif return STATUS_ACCESS_DENIED; } return OldZwOpenFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions); }
Но в checkFile вызывается сразу ZwReadFile ДО ZwOpenFile может в этом дело?) а хендл действительно инвалид)
Код (Text): BOOLEAN checkFile(PUNICODE_STRING pPath) { NTSTATUS ns; IO_STATUS_BLOCK ios; CHAR bufer [MAXBUF]; HANDLE pFile; OBJECT_ATTRIBUTES attr; __try { InitializeObjectAttributes(&attr, pPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); RtlZeroMemory(&ios, sizeof(ios)); RtlZeroMemory(bufer, MAXBUF); acs = 1; ns = ZwCreateFile(&pFile, GENERIC_READ, &attr, &ios, NULL, FILE_ATTRIBUTE_NORMAL, FILE_READ_DATA, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, NULL); acs = 0; if (NT_SUCCESS(ns)) { acs = 1; ns = ZwReadFile(pFile, NULL, NULL, NULL, &ios, bufer, MAXBUF, NULL, NULL); acs = 0; ZwClose(pFile); #ifdef DEBUG DbgPrint("readen %x, %x, %x, %x, %x", bufer[0], bufer[1], bufer[2], bufer[3], bufer[4]); #endif if (NT_SUCCESS(ns)) { if (checkBufer(bufer, myBuf, myBufCount)) return TRUE; } } } __except (EXCEPTION_EXECUTE_HANDLER) { ZwClose(pFile); return FALSE; } return FALSE; } после чтения файла в буфер, в буфере какой то мусор черех hex-редактор показывает к примеру d0 6d 45 4e а в буфере находится ffffffd0 ffffff6d 45 4e при чем не всегда стоят эти ffffff вначале, чтобы это могло быть?
тут скорее всего проблема не в чтении а выводе данных, как у Вас может получатся в bufer[0] - 4 байта а у Вас должен быть один байт. %x - это же спецификатор не char выводит, вроде.
а на вопрос откуда берутся ffff можно глянуть получающийся код, он будет ~ таким Код (Text): movsx eax, byte ptr [ebp+buffer+2] push eax movsx ecx, byte ptr [ebp+buffer+1] push ecx movsx edx, byte ptr [ebp+buffer] push edx push offset formatstring из-за команды movsx все старшие биты становятся такими же как и знак buffer