从内核挂钩调用 NtQuerydirectoryFile 会使内核崩溃
Calling NtQuerydirectoryFile from a Kernel Hook Crashes the Kernel
我正在使用最新版本的 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
此外还修复了依赖硬编码大小的蹦床跳跃代码的功能,因为新版本更大。现在可以正常使用了。
我正在使用最新版本的 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
此外还修复了依赖硬编码大小的蹦床跳跃代码的功能,因为新版本更大。现在可以正常使用了。