钩住SSDT之后,将参数传递给NtWriteFile之前进行修改

时间:2018-12-13 19:51:40

标签: windows kernel driver kernel-module rootkit

我目前正在从事有关Windows Rootkit的讲座(和学习)。我能够钩住NtWriteFile的SSDT条目,并在WinDbg上显示一条简单的消息,但是我现在好奇在将参数传递给原始功能之前最好的(和最安全的)更改参数的方法。在此示例中,我尝试更改包含“我的字符串”的缓冲区。我如何安全地交换Buffer的内容?

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 个答案:

答案 0 :(得分:0)

首先,像这样直接访问(读取/写入)UserMode指针存在问题,您首先要探查READ的指针,如果您对它进行写入,还需要使用来探查WRITE。内核API ProbeForReadProbeForWrite

第二,我宁愿不写修改后的值到UserMode提供的缓冲区,而是分配一个新的缓冲区,然后再释放它,我认为这是最安全的方法。