Изменение параметров перед их передачей в 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 буфер измененное значение, но выделяю новый буфер и затем освобождаю его впоследствии, на мой взгляд, это самый безопасный способ.