从内核挂钩调用 NtQuerydirectoryFile 会使内核崩溃



我正在使用最新版本的EasyHook来挂钩一些内核函数。我确实在基于 Windows 8.1 64 位的虚拟机上成功设置了一个调试重要设置,并且我在用户模式下测试了 NtQuerydirectoryFile 和 NtQuerySystemInformation 的挂钩,在内核模式下测试了 NtQuerySystemInformation 的挂钩,没有任何问题。

我当前的问题是使用与用户模式挂钩相同的代码挂钩 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;
}

正如我之前提到的,原来的蹦床跳跃修改了 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

除了修复依赖于蹦床跳转代码的硬编码大小的功能,因为新版本更大。现在它可以毫无问题地工作。

相关内容

  • 没有找到相关文章

最新更新