首页
社区
课程
招聘
[讨论]关于SSDT HOOK 蓝屏问题
发表于: 2009-5-12 23:02 9094

[讨论]关于SSDT HOOK 蓝屏问题

2009-5-12 23:02
9094

最近做SSDT挂钩的实验,发现卸载时会有蓝屏的现象(http://bbs.pediy.com/showthread.php?t=60404 中就曾提到此问题)
我们的挂钩处理函数通常为:
hook_NtXXXX(...)
{
   NTSTATUS ns;//1
   一些操作。。//2
ns=NtXXXX(...)//3
一些操作。。//4
return xx; //5
}
   
     对于一般函数突然执行卸载驱动没有问题(或者说有很小机率蓝屏),因为这些函数执行完成后会立即返回。卸载后系统中线程将从SSDT中按原来的入口执行。
   但是,当HOOK有挂起线程、延迟执行线程等行为的服务函数时,在线程进入HOOK函数后,完成一些操作后,调用原服务函数时,线程会停止在我们的HOOK函数内部(图中3处);此时若unload了驱动,我们HOOK函数的内存会被收回,而3处真正的函数却未返回;当其返回到原返回址时(HOOK函数内),会造成蓝屏。
    例如:NtDelayExecution(...)时,函数可能停止在3处未返回,而驱动已经unload了,当3处返回时,原返回地址所在内存已经被收回,此时执行会蓝屏。
   再如,调用文件相关服务时,可能某此IRP未完成,会造成函数在一段时间内不返回的现象,也可能有蓝屏的现象。
   我认为,解决方案就是(不一定对,请高手指正),在HOOK函数中调用原函数时,可以提前将栈设置为调用HOOK函数前的状态,同时可以保存相应的寄存器。
   流程:KiFastCallEntry->HOOK func->service func
当hook func 操作完成后,一旦调用service func,则将栈和相关寄存器恢复到刚进入hook func的状态,将控制权完全给service func,并不再返回到hook func;即环境恢复好后,jmp到service func.
   附件中是一个挂钩多个SSDT项的程序。望与大家交流。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 435
活跃值: (172)
能力值: ( LV13,RANK:280 )
在线值:
发帖
回帖
粉丝
2
比较简单的办法是声明个全局变量
进入Hook函数的时候++,出去的时候--
卸载驱动的时候先把hook恢复,然后等变量为0了再卸载
++,--只是个意思,要用Interlocked开头的函数作
2009-5-12 23:24
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE='火翼[CCG];622936']比较简单的办法是声明个全局变量
进入Hook函数的时候++,出去的时候--
卸载驱动的时候先把hook恢复,然后等变量为0了再卸载
++,--只是个意思,要用Interlocked开头的函数作[/QUOTE]

这种方法好像不行,我用过此法,结果发现,remove hook 后相当长的时间,这个数字都不会为0; 或者由于某些情况,这个值根本就不会为零。(我挂钩的是所有服务函数,数据量大点)我附件中程序,经测试 ,目前未发现蓝屏。
2009-5-12 23:28
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
4
一旦调用service func,则将栈和相关寄存器恢复到刚进入hook func的状态,将控制权完全给service func,并不再返回到hook func

这样是可以,但是不再返回hook func就不能根据service func的返回结果做后期处理。
2009-5-13 13:42
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
是的,缺点就是这个。这就得在蓝屏和返回结果中选择一个。但可以替service func返回一个值。呵呵。。
这样做有点像inline hook.
2009-5-13 15:43
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
可以将call service func的stub函数放一块buffer中,如果hook函数返回,则在栈中free自己
2009-5-13 15:56
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
恕我太菜,那应该怎么实现?
2009-5-13 16:05
0
游客
登录 | 注册 方可回帖
返回
//