Изменение параметров перед их передачей в NtWriteFile после подключения SSDT.

В настоящее время я работаю над лекцией (и изучаю) о руткитах для Windows. Мне удалось перехватить запись SSDT для NtWriteFile и отобразить простое сообщение на WinDbg, но теперь мне любопытно, каким будет лучший (и самый безопасный) способ изменения параметров перед передачей их исходной функции. В этом примере я пытаюсь изменить буфер, если он содержит "My String". Как я могу безопасно поменять содержимое буфера?

NTSTATUS ZwWriteFileHook(
IN HANDLE           FileHandle,
IN HANDLE           Event,
IN PIO_APC_ROUTINE  ApcRoutine,
IN PVOID            ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID            Buffer,
IN ULONG            Length,
IN PLARGE_INTEGER   ByteOffset,
IN PULONG           Key
) 
{
    ... 
    if (!strncmp((PCHAR) Buffer, "My String", Length)) {
        // Modify parameters here
    }
    ntStatus = ((PZwWriteFile) zwWriteFileOld)(FileHandle, Event,
    ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset,
    Key);
    ...
}

Спасибо.

1 ответ

Прежде всего, существует проблема с прямым доступом к (чтение / запись) указателям UserMode, сначала вы хотите проверить указатель на READ, если вы записываете в него, вам также нужно проверить WRITE с помощью API ядра ProbeForRead и ProbeForWrite.

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

Другие вопросы по тегам