首页
社区
课程
招聘
[求助]SSDT Hook卸载驱动时蓝屏的问题
发表于: 2008-2-28 19:24 13099

[求助]SSDT Hook卸载驱动时蓝屏的问题

2008-2-28 19:24
13099
我最近写一SSDT Hook程序,Hook 了NtCreateFile和NtClose,但是这个程序在驱动卸载时有时候会出现BSOD,错误代码是0xCE,DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS,我原以为是在退出驱动时我的MyCreateFile或MyClose还在被调用,于是我定义了两个KEVENT,在MyCreateFile、MyClose中都先分别将这两个KEVENT设置成非信号态,然后到MyCreateFile、MyClose返回之前再将这两个KEVENT设置成信号态,在恢复SSDT时先用KeWaitForSingleObject等待两个KEVENT都为信号态,然后再恢复SSDT,但这样也没能完全防止出现这个问题,只是出问题的频率似乎有所下降。另外,我这个程序还使用了IOCTL来和用户模式程序交换数据,不知道BSOD是不是和IOCTL的使用不当有关,我上网查了有关资料,但由于水平太低也看不出什么来,请问一般情况下这个错误是怎样产生的?要怎样才能解决呢?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
2
记得在rootkit.com一份代码看到的: 没有什么可靠的办法,在卸载前等了一段时间
2008-2-28 21:27
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
一般都是这样用的啊,俺这里从来没蓝过

卸载的时候直接恢复原来的地址就行了。和你的fake_Zw**.等无关了.

若加了KTimer,还要释放非分页内存
2008-2-28 21:43
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
4
有时候是要bsod,把那段代码找出来了, 在DriverUnload尾巴上加:

/*
	  * bit lame delay - but to prevent BSOD on active hooked system services
	 * could improve here with remove locks, but you will never get a 100%
	 * correct situation
	 */

	Delay.QuadPart = -5000000;
	
	KeDelayExecutionThread(KernelMode, TRUE, &Delay);
2008-2-28 22:01
0
雪    币: 266
活跃值: (60)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
5
还真没碰过,学习了。。
2008-2-29 08:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
同#4  在DriverUnload的时候Sleep(xxx);
2008-2-29 13:07
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
暂时这样解决了,有人能给出可靠的办法就好了
2008-2-29 16:54
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请问KEVENT 的释放有什么讲究吗?我是直接用ExFreePoolWithTag释放掉的
2008-2-29 17:01
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
9
stc
sbb ecx, ecx
loop $

--> 优化版?

loop $
loop $
2008-2-29 17:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我也被这个东西郁闷到了
2008-7-22 10:59
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11
我用的时候也很稳定啊,没出过BSOD
根据错误代码,楼主好像是因为某些操作引起IRP被挂起,毕竟你挂接的是NtCreateFile
2008-7-22 11:51
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
大家好,不知道还有没有人关注这个贴子。
我也有同样的问题,挂SSDT中某些NtXXXX函数,有蓝屏。
设挂钩处理函数为
hook_NtXXXX(...)
{
   NTSTATUS ns;//1
   一些操作。。//2
ns=NtXXXX(...)//3
一些操作。。//4
return xx; //5
}
当被挂函数为NtDelayExecution(...)时,函数可能停止在3处未返回,而驱动已经unload了,当3处返回时,原返回地址所在内存已经被收回,此时执行会蓝屏。
当然,这样的函数不止这一个。
如何解决?
2009-5-10 19:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
请问现在有没有更好的解决办法啊,我在卸载函数结尾加了
  Delay.QuadPart = -5000000;  
  KeDelayExecutionThread(KernelMode, TRUE, &Delay);
但还是一直蓝屏啊
2009-6-8 14:21
0
雪    币: 38
活跃值: (536)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
14
我也碰到过,郁闷了好长时间
我是这样认为的
很可能某个线程正在运行你的新函数(被你HOOK的函数),还没有从你的新函数返回,但是这个线程时间片到了,然后切换线程,就在这时你卸载了驱动,等到那个线程再次运行的时候,代码已经不存在,所以BSOD。
不知道对不对。
2009-6-9 07:28
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
个人人为,可以不卸载驱动,只是unhook ssdt.
驱动保留在内存有什么关系?但是unhook后驱动不能发挥作用而已。
2009-6-9 08:37
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scm
16
DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS 这个错误代码我在挂钩zwterminateproces 和 zwOpenprocess 经常遇到。还没解决,郁闷呀!
2009-6-9 17:50
0
雪    币: 9
活跃值: (389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
郁闷中
2017-4-30 00:12
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
18
1.勾文件系统相关的不建议ssdt。用minfilter和sfilter都可以,比ssdt不知道高到哪里去了
2.勾内核的东西在卸载之前要确保引用计数为0,这个引用计数在进入钩子函数体的时候要+1,退出时要-1,记得用interlocked系列操作加减。
2017-5-2 09:30
0
游客
登录 | 注册 方可回帖
返回
//