-1
我使用的是最新版本的EasyHook的勾一些内核函数。 我做安装调试成功的重要一个Windows 8.1的64位基于虚拟机上,我测试了,没有任何问题,在内核模式下在用户模式和NtQuerySystemInformation挂钩都NtQuerydirectoryFile和NtQuerySystemInformation的。从内核调用挂钩崩溃NtQuerydirectoryFile内核
我现在的问题是使用我用于用户模式挂钩相同的代码挂钩NtQuerydirectoryFile,但是当我调用原始的功能给我一个访问冲突错误失败。我使用下面的代码为内核模式钩:
NTSTATUS NtQueryDirectoryFile_Hook(
__in HANDLE FileHandle,
__in_opt HANDLE Event,
__in_opt PIO_APC_ROUTINE ApcRoutine,
__in_opt PVOID ApcContext,
__out PIO_STATUS_BLOCK IoStatusBlock,
__out_bcount(Length) PVOID FileInformation,
__in ULONG Length,
__in FILE_INFORMATION_CLASS FileInformationClass,
__in BOOLEAN ReturnSingleEntry,
__in PUNICODE_STRING FileName OPTIONAL,
__in BOOLEAN RestartScan
)
{
NTSTATUS status;
status = NtQueryDirectoryFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, FileInformation, Length, FileInformationClass, ReturnSingleEntry, FileName, RestartScan);
return status;
}
这里是转储: http://pastebin.com/Y29dsRUQ – FiFo
它看起来像BuildQueryDirectoryIrp函数期望RAX寄存器中的某种参数,并且由于实现了蹦床跳转的方式,RAX寄存器数据丢失了! 所以我代替它: '48 B8 00 00 00 00 00 00 00 00 MOV RAX,为0x0 FF E0 JMP rax' 本: '50 \t \t \t \t \t \t \t推RAX 48 B8 00 00 00 00 00 00 00 00 MOV RAX,为0x0 48 87 04 24 XCHG QWORD PTR [RSP],RAX C3 \t \t ret' – FiFo