Доброго времени суток. Столкнулся с проблемой логгирования перехваченных функций. Создаю файл: Код (C): RtlInitUnicodeString(&logFileName, L"\\DosDevices\\C:\\log.txt"); InitializeObjectAttributes(&objAttr, &logFileName, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, NULL, NULL); status = ZwCreateFile(&logFileHandle, GENERIC_WRITE | SYNCHRONIZE, &objAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_SUPERSEDE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); ............................ Далее в перехваченой функции пытаюсь записать в файл: Код (C): LARGE_INTEGER offset; offset.HighPart = -1; offset.LowPart = FILE_WRITE_TO_END_OF_FILE; status = fnZwWriteFile(logFileHandle, NULL, NULL, NULL, &ioStatusBlock, (PVOID)currentProcessName, (ULONG)strlen(currentProcessName), &offset, NULL); //fnZwWriteFile оригинальная функция (т.к. ZwWriteFile тоже перехватываю) В итоге в статусе: 0xc0000008 (INVALID_HANDLE) С адресами хэндла все в порядке, одинаковые при создании и записи в файл. Не понимаю в чем проблема может быть. При этом если писать в файл в том месте где я создавал его, то все окей. Сам хэндл глобальный соответственно.
UbIvItS, с перехватом проблем нет, проблема записать в файл (мой логфайл), что я перехватил. Саму проблему описал выше)
UbIvItS, да я и так их перехватываю нормально, мне нужно в лог записать, проблема в том что при создании файла (моим драйвером) с хэндлом все в порядке, затем в другом месте я пытаюсь записать в файл по этому хэндлу, а мне говорит INVALID_HANDLE
guessWh0_o, если будешь перехватывать createfile == у тебя сразу будет валидный хэндл именно для твоего дравера.
UbIvItS, ты меня не понимаешь. Мне чужой хэндл не нужен. Я создаю свой, для того, чтобы писать туда лог....
это в DriverEntry: Код (C): .... UNICODE_STRING logFileName; OBJECT_ATTRIBUTES objAttr; IO_STATUS_BLOCK ioStatusBlock; RtlInitUnicodeString(&logFileName, L"\\DosDevices\\C:\\log.txt"); InitializeObjectAttributes(&objAttr, &logFileName, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, NULL, NULL); status = ZwCreateFile(&logFileHandle, GENERIC_WRITE | SYNCHRONIZE, &objAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_SUPERSEDE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); /*LARGE_INTEGER offset; offset.HighPart = -1; offset.LowPart = FILE_WRITE_TO_END_OF_FILE; ZwWriteFile(logFileHandle, NULL, NULL, NULL, &ioStatusBlock, "test", 4, &offset, NULL);*/ // вот тут нормально пишет в файл HookSSDT(); .... Далее в самом хуке: Код (C): NTSTATUS HookZwWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key) { NTSTATUS status; if (NT_SUCCESS(status = fnZwWriteFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key))) { if (procName != NULL) { PCHAR currentProcessName = ExAllocatePool(NonPagedPool, sizeof(CHAR) * 30); GetProcessNameByPid(PsGetCurrentProcessId(), currentProcessName); if (!strcmp(currentProcessName, procName)) { PWCHAR filePath = (PWCHAR)ExAllocatePool(NonPagedPool, sizeof(WCHAR) + MAX_PATH * 2); if (NT_SUCCESS(GetPathByHandle(FileHandle, filePath))) { IO_STATUS_BLOCK ioStatusBlock; LARGE_INTEGER offset; offset.HighPart = -1; offset.LowPart = FILE_WRITE_TO_END_OF_FILE; status = fnZwWriteFile(logFileHandle, NULL, NULL, NULL, &ioStatusBlock, (PVOID)currentProcessName, (ULONG)strlen(currentProcessName), &offset, NULL); if (!NT_SUCCESS(status)) KdPrint(("Error on write file. Status=%x", status)); //ВОТ ТУТ ПИШЕТ INVALID_HANDLE (0xc0000008) else KdPrint(("Write success")); KdPrint(("%s called WriteFile %ws\n", currentProcessName, filePath)); } ExFreePool(filePath); ExFreePool(currentProcessName); } else ExFreePool(currentProcessName); } }
я думаю, что в принципе не очень хорошая идея держать хендл на файл открытым все время, нужно написать отдельную функцию для записи в лог, где файл открывается на дозапись, данные пишутся и файл закрывается...
Решил проблему реализовав очередь и внутри хука добавлять запись о факте вызова функции. Затем при выгрузке или в отдельном потоке сбрасывать содержимое очереди в файл. Может кому пригодится.