-
-
[求助]关于x64系统的内核inline HOOK
-
发表于:
2016-3-10 21:45
5288
-
[求助]关于x64系统的内核inline HOOK
我在内核inline HOOK 了 NtResumeThread,很多线程通过了我的新的代理函数最后进入到了原始NtResumeThread,可是运行一段时间以后我的虚拟机就死机了,不知道是什么原因。触发原因也很简单,只要单击任何一个文件夹就会死机,代理函数也很简单,就是打印一段话,代码如下:
变量申明:
typedef NTSTATUS (__fastcall *MyNtResumeThread)(HANDLE ThreadHandle, PULONG SuspendCount);
//NtResumeThread 将头部数据取出来的地址
PVOID ori_func_NtResumeThread = NULL;
//NtResumeThread的代理函数
NTSTATUS Proxy_NtResumeThread(HANDLE ThreadHandle, PULONG SuspendCount)
{
DbgPrint("进入了新的NtResumeThread\n");
return ((MyNtResumeThread)ori_func_NtResumeThread)(ThreadHandle, SuspendCount);
}
HOOK函数:
VOID HookNtResumeThread()
{
KIRQL irql;
UCHAR jmp_code[]="\xFF\x25\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
UCHAR jmp_code_orifunc[]="\xFF\x25\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
UCHAR nop_code[]="\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"; //16个
ULONG64 tmpv = 0;
if (g_KernelBaseAddress)
{
//step1:保存原函数头部并填充跳转,原函数头部有16个字节
ori_func_NtResumeThread = kmalloc(16+14);
//NtResumeThread与内核的偏移为0x363244
irql = WPOFF();
memcpy(ori_func_NtResumeThread, (PVOID)(g_KernelBaseAddress + 0x363244), 16);
WPON(irql);
tmpv = g_KernelBaseAddress + 0x363244 + 0x10;
memcpy(jmp_code_orifunc+6,&tmpv,8);
memcpy((PUCHAR)ori_func_NtResumeThread+14,jmp_code_orifunc,14);
//step2:将原函数头部填充跳转
tmpv = (ULONG64)Proxy_NtResumeThread;
memcpy(jmp_code+6,&tmpv,8);
irql = WPOFF();
memcpy((PVOID)(g_KernelBaseAddress + 0x363244),nop_code,16);
memcpy((PVOID)(g_KernelBaseAddress + 0x363244),jmp_code,14);
WPON(irql);
DbgPrint("HOOK NtResumeThread成功\n");
}
else
{
DbgPrint("HOOK NtResumeThread失败\n");
}
}
PS:最近一直在研究内核的HOOK,发现很多大神都在弄SSDT HOOK,但是在x64系统下要过PG,所以很多大神都在推荐内核inline HOOK,于是我也跟着弄了一下。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课