Invalid handle ZwWriteFile

Тема в разделе "WASM.NT.KERNEL", создана пользователем guessWh0_o, 24 янв 2019.

  1. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    Доброго времени суток. Столкнулся с проблемой логгирования перехваченных функций.
    Создаю файл:
    Код (C):
    1. RtlInitUnicodeString(&logFileName, L"\\DosDevices\\C:\\log.txt");
    2. InitializeObjectAttributes(&objAttr, &logFileName, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, NULL, NULL);
    3. status = ZwCreateFile(&logFileHandle, GENERIC_WRITE | SYNCHRONIZE, &objAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL,
    4. FILE_SHARE_READ, FILE_SUPERSEDE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
    5. ............................
    Далее в перехваченой функции пытаюсь записать в файл:
    Код (C):
    1. LARGE_INTEGER offset;
    2. offset.HighPart = -1;
    3. offset.LowPart = FILE_WRITE_TO_END_OF_FILE;
    4. status = fnZwWriteFile(logFileHandle, NULL, NULL, NULL, &ioStatusBlock,
    5. (PVOID)currentProcessName, (ULONG)strlen(currentProcessName), &offset, NULL);
    6. //fnZwWriteFile оригинальная функция (т.к. ZwWriteFile тоже перехватываю)
    В итоге в статусе: 0xc0000008 (INVALID_HANDLE)

    С адресами хэндла все в порядке, одинаковые при создании и записи в файл. Не понимаю в чем проблема может быть.
    При этом если писать в файл в том месте где я создавал его, то все окей. Сам хэндл глобальный соответственно.
     
    Последнее редактирование модератором: 25 янв 2019
  2. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Ты из драйвера пытаешься записать иль как?
     
  3. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
  4. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
  5. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    UbIvItS, с перехватом проблем нет, проблема записать в файл (мой логфайл), что я перехватил. Саму проблему описал выше)
     
  6. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    перехвати ZwCreateFile or ZwOpenFile
     
  7. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    UbIvItS, да я и так их перехватываю нормально, мне нужно в лог записать, проблема в том что при создании файла (моим драйвером) с хэндлом все в порядке, затем в другом месте я пытаюсь записать в файл по этому хэндлу, а мне говорит INVALID_HANDLE
     
  8. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    guessWh0_o, если будешь перехватывать createfile == у тебя сразу будет валидный хэндл именно для твоего дравера.
     
  9. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    UbIvItS, ты меня не понимаешь. Мне чужой хэндл не нужен. Я создаю свой, для того, чтобы писать туда лог....
     
  10. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    а код показать можешь?
     
  11. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    это в DriverEntry:
    Код (C):
    1. ....
    2. UNICODE_STRING logFileName;
    3. OBJECT_ATTRIBUTES objAttr;
    4. IO_STATUS_BLOCK ioStatusBlock;
    5. RtlInitUnicodeString(&logFileName, L"\\DosDevices\\C:\\log.txt");
    6. InitializeObjectAttributes(&objAttr, &logFileName, OBJ_OPENIF | OBJ_CASE_INSENSITIVE, NULL, NULL);
    7. status = ZwCreateFile(&logFileHandle, GENERIC_WRITE | SYNCHRONIZE, &objAttr, &ioStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL,
    8. FILE_SHARE_READ, FILE_SUPERSEDE,
    9. FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
    10. /*LARGE_INTEGER offset;
    11. offset.HighPart = -1;
    12. offset.LowPart = FILE_WRITE_TO_END_OF_FILE;
    13. ZwWriteFile(logFileHandle, NULL, NULL, NULL, &ioStatusBlock, "test", 4, &offset, NULL);*/
    14.          // вот тут нормально пишет в файл
    15. HookSSDT();
    16. ....
    Далее в самом хуке:
    Код (C):
    1. NTSTATUS HookZwWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
    2. PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key)
    3. {     NTSTATUS status;
    4. if (NT_SUCCESS(status = fnZwWriteFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key))) {
    5. if (procName != NULL) {
    6. PCHAR currentProcessName = ExAllocatePool(NonPagedPool, sizeof(CHAR) * 30);
    7. GetProcessNameByPid(PsGetCurrentProcessId(), currentProcessName);
    8. if (!strcmp(currentProcessName, procName)) {
    9. PWCHAR filePath = (PWCHAR)ExAllocatePool(NonPagedPool, sizeof(WCHAR) + MAX_PATH * 2);
    10. if (NT_SUCCESS(GetPathByHandle(FileHandle, filePath))) {
    11. IO_STATUS_BLOCK ioStatusBlock;
    12. LARGE_INTEGER offset;
    13. offset.HighPart = -1;
    14. offset.LowPart = FILE_WRITE_TO_END_OF_FILE;
    15. status = fnZwWriteFile(logFileHandle, NULL, NULL, NULL, &ioStatusBlock, (PVOID)currentProcessName,
    16. (ULONG)strlen(currentProcessName), &offset, NULL);
    17. if (!NT_SUCCESS(status))
    18. KdPrint(("Error on write file. Status=%x", status));    //ВОТ ТУТ ПИШЕТ INVALID_HANDLE (0xc0000008)
    19. else
    20. KdPrint(("Write success"));
    21. KdPrint(("%s called WriteFile %ws\n", currentProcessName, filePath)); }
    22. ExFreePool(filePath);
    23. ExFreePool(currentProcessName); }
    24. else
    25. ExFreePool(currentProcessName); }
    26. }
     
    Последнее редактирование модератором: 25 янв 2019
  12. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    попробуй внутри создать новый хэндл и записать по нему.
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    я думаю, что в принципе не очень хорошая идея держать хендл на файл открытым все время, нужно написать отдельную функцию для записи в лог, где файл открывается на дозапись, данные пишутся и файл закрывается...
     
  14. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    Rel, никто не мешает создать хэндл в хуке и там же его закрыть.
     
  15. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    Решил проблему реализовав очередь и внутри хука добавлять запись о факте вызова функции. Затем при выгрузке или в отдельном потоке сбрасывать содержимое очереди в файл. Может кому пригодится.