首页 > 解决方案 > 挂钩 SSDT 后在将参数传递给 NtWriteFile 之前修改参数

问题描述

我目前正在做关于 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);
    ...
}

谢谢你。

标签: windowskerneldriverkernel-modulerootkit

解决方案


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

其次,我宁愿不向 UserMode 提供的缓冲区写入修改后的值,而是分配一个新的缓冲区,然后释放它,我认为这是最安全的方式。


推荐阅读