2016-02-29 113 views
-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; 
} 
+0

这里是转储: http://pastebin.com/Y29dsRUQ – FiFo

+0

它看起来像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

回答

0

正如我前面提到的,原来蹦床跳修改RAX寄存器,所以我用另一个蹦床替代它:

50        push rax 
48 b8 00 00 00 00 00 00 00 00 mov rax, 0x0 
48 87 04 24     xchg QWORD PTR [rsp],rax 
c3        ret 

在除了固定依靠在蹦床上跳码的硬编码的大小,因为新版本是更大的功能。现在它工作没有任何问题。