【问题标题】:Modifying the parameters before passing them to NtWriteFile after hooking the SSDT挂钩 SSDT 后在将参数传递给 NtWriteFile 之前修改参数
【发布时间】:2019-05-15 02:22:51
【问题描述】:

我目前正在针对 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);
    ...
}

谢谢。

【问题讨论】:

    标签: windows kernel driver kernel-module rootkit


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多