首页
社区
课程
招聘
[求助]关于x64系统的内核inline HOOK
发表于: 2016-3-10 21:45 5288

[求助]关于x64系统的内核inline HOOK

2016-3-10 21:45
5288
我在内核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直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 4950
活跃值: (1984)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
NTAPI
2016-3-10 22:04
0
雪    币: 608
活跃值: (703)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
inline hook也得过PG啊
2016-3-11 02:24
0
雪    币: 12
活跃值: (438)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
+10086
2016-3-11 08:10
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我读的书少,表骗我
2016-3-11 20:50
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
好像还是不行啊,都是一样的情况,点了文件夹以后就文件夹失去响应了,但是开始菜单还是可以点出来
2016-3-11 21:02
0
雪    币: 12
活跃值: (438)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
http://bbs.pediy.com/showthread.php?t=207253   

我就一股熟悉感,明明觉得这个帖子之前看过。
2016-3-12 10:41
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8

还真没注意到,大神都帮我两次了,以后看来还是要虚心学习,最近真是一点头绪都没有,HOOK后汇编看上去没什么问题,但是就是文件夹运行不了,其他的感觉都还可以响应。然后通过Windbg将NtResumeThread函数的跳转指令改回去以后,新打开的文件夹可以用,以前的失去响应的旧文件夹使用不了

感谢大神
2016-3-12 13:15
0
游客
登录 | 注册 方可回帖
返回