我目前正在从事有关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);
...
}
谢谢。
答案 0 :(得分:0)
首先,像这样直接访问(读取/写入)UserMode指针存在问题,您首先要探查READ的指针,如果您对它进行写入,还需要使用来探查WRITE。内核API ProbeForRead和ProbeForWrite。
第二,我宁愿不写修改后的值到UserMode提供的缓冲区,而是分配一个新的缓冲区,然后再释放它,我认为这是最安全的方法。