阅读:1760回复:7
拦截API后通知应用层决策问题
我想实现进程拦截
我的方法是HOOK NtCreateSection函数 然后由驱动通知应用程序 应用程序从驱动中拿到文件名判断时候放行 同时驱动程序使用KeWaitForSingleObject函数阻塞等待应用层通知后再决定是否允许调用NtCreateSection 当NtCreateSection在多线程环境下时会有问题 比如线程1调用NtCreateSection 驱动通知应用层后阻塞等待应用层处理完 这时候线程2又调用NtCreateSection 这时候线程3又调用NtCreateSection 多次通过事件通知应用程序 导致某些通知没有被正确处理而死锁 我想通过SpinLock来防止这样的情况出现但是KeWaitForSingleObject在DISPATCH_LEVEL又不能长时间等待 请问如何解决这种情况 来实现驱动拦截API后让应用层决定是否放行 |
|
沙发#
发布于:2008-07-30 18:09
你最好不要这样搞,如果必须要这样一定要处理好重入的问题
|
|
板凳#
发布于:2008-07-31 09:01
N年前搞过,由于不能适用系统的千变万化,及第3方程序的古怪行为,而放弃了。
|
|
|
地板#
发布于:2008-07-31 16:02
应该这样搞
1.在HookNtCreateSection 中创建EVENT事件,然后把要通知的东西放入队列并通知应用程有东西要取,最后调用KeWaitForSingleObject等待应用层处理。 2.应用层得到通知后,从队列里面获取数据,然后提示用户,根据用户提示,处理拒绝还是放行,然后设置EVENT为有效,这样内核就可以继续往下执行了。 |
|
驱动小牛
|
地下室#
发布于:2008-08-01 16:36
我是设置了超时,过了多长时间没处理的就放行了,有漏掉总比死锁好哇.
|
5楼#
发布于:2008-08-02 12:04
这样做,会冒出各种莫名其妙的问题,还要冒着被各种杀毒软件误认为是Virus,而被杀掉的风险。貌似在Vista下,可能也行不通。。
|
|
|
6楼#
发布于:2008-08-04 21:38
感谢各位大大的答案
问一下 那完成这项任务有什么通用的模式吗 比如对注册表某些位置做保护 总是驱动截获写入请求 然后 在驱动或者在应用中决策是否允许 那这个决策该放在哪呢 一般杀软是怎么做的呢 |
|
7楼#
发布于:2008-08-05 19:58
CallBackToRing3~~暴力解决~~
|
|
|