RSS订阅信息安全技术跟踪与研究:技术、平台、会议、论文、产业
你现在的位置:首页 / 技术积累 / 正文

警惕Windows驱动开发的雷区

0 技术积累 | 2015年5月28日
转载申明:本站原创,欢迎转载。但转载时请保留原文地址。
原文地址:http://www.vonwei.com/post/carewindriver_2436.html

         搞安全的人少不了驱动开发,最近完成了个小WIN7驱动,在虚拟机(主机开发机+虚拟机客户机通过管道建立双机调试环境)下调试测试完毕,结果放到实体机测试(称测试机)时,就BSOD了,即蓝屏死机(Blue Screen Of Death)BSOD是最头痛的了。

         由于Windows每次蓝屏,都会在C:\Windows\Minidump里面生成一个DMP文件,通过Windbg可以进行分析。首先想到的办法只好在测试机也装了windbg,使用管理员权限打开后,“File-Open Crash Dump...”打开最新的DMP出错文件,输入“!analyze –v”,由于符号symbols不全,结果只能分析到出错原因,具体出错的驱动代码和堆栈没有显示出来,原因如下:

ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY (fc)

An attempt was made to execute non-executable memory.  The guilty driver is on the stack trace (and is typically the current instruction pointer). When possible, the guilty driver's name (Unicode string) is printed on the bugcheck screen and saved in KiBugCheckDriver.

Arguments:

Arg1: 96758bf0, Virtual address for the attempted execute.

Arg2: 4e5f9963, PTE contents.

Arg3: 96758490, (reserved)

Arg4: 00000002, (reserved)

         只好通过串口连接线将主机和测试机两个真实物理机连接起来,看看测试机具体出错的原因。在Debug模式下重启测试机,并使用主机的windbg实时监控,运行我们的小驱动程序,果然卡死了,windbg这里也自动开启分析。这些终于跳出了错误,不过唯一可喜的是出错的暂时还不是我们这边的驱动,而是knbdrv.sys,如下:

MODULE_NAME: KNBDrv

FAULTING_MODULE: 84051000 nt

DEBUG_FLR_IMAGE_TIMESTAMP:  54b3b0b8

DEFAULT_BUCKET_ID:  WIN7_DRIVER_FAULT

BUGCHECK_STR:  0xFC

CURRENT_IRQL:  0

ANALYSIS_VERSION: 6.3.9600.17237 (debuggers(dbg).140716-0327) x86fre

LAST_CONTROL_TRANSFER:  from 8412e96d to 840bc394

STACK_TEXT: 

WARNING: Stack unwind information not available. Following frames may be wrong.

9675802c 8412e96d 00000003 885c7330 80000000 nt!DbgBreakPointWithStatus+0x4

967583f0 840d68e3 000000fc 96758bf0 4e5f9963 nt!KeBugCheckEx+0xc7b

96758478 840975f8 00000008 96758bf0 00000000 nt!MmDisableModifiedWriteOfSection+0x15f0

967584ac 8e64905e 96758bf0 000f001f 00000000 nt!Kei386EoiHelper+0x27c0

967584ec 8409442a 00000011 96758bf0 00000008 KNBDrv+0xc05e

96758500 84092035 badb0d00 96758578 88007330 nt!ZwYieldExecution+0xb56

96758518 84275227 00000614 00000000 00100020 nt!ZwCreateSection+0x11

96758564 84092035 00000008 00000206 842a716e nt!ObReferenceObjectByHandleWithTag+0xf8

96758570 842a716e 96758bf0 000f001f 967585d8 nt!ZwCreateSection+0x11

967585b0 8410886f 86c22f8e 00000000 00000000 nt!IoGetFileObjectGenericMapping+0x5b4

967586ec 00000000 00000000 00000000 00000000 nt!PsReturnProcessNonPagedPoolQuota+0x901

 

STACK_COMMAND:  kb

FOLLOWUP_IP:

KNBDrv+c05e

8e64905e 5f              pop     edi

SYMBOL_STACK_INDEX:  4

SYMBOL_NAME:  KNBDrv+c05e

FOLLOWUP_NAME:  MachineOwner

IMAGE_NAME:  KNBDrv.sys

 

上网一查,KNBDrv.sys驱动属于猎豹安全浏览器的,而且其也引起过不少蓝屏问题:

 

http://jingyan.baidu.com/article/47a29f240eb52fc01523995c.html

         这个链接处,360就曾经报道过该驱动与微软更新补丁冲突导致的蓝屏,其中一段原文:

         “经测试证实,金山系列软件中的驱动程序,在挂钩Windows内核时处理不当引发的蓝屏问题,涉及软件包括金山毒霸、金山卫士、猎豹浏览器、驱动精灵(被金山收购)和金山WPSOffice,相关驱动程序组件是:kisknl.sys(金山毒霸)、KsDef.sys(金山卫士)、knbdrv.sys(猎豹浏览器)、dgsafe.sys(驱动精灵)和WpsSafe.sys(WPSOffice)。”

 

         另外,“说说猎豹安全浏览器”这篇博客也详细介绍了KNBDrv.sys里面的各种Hook机制,Hook了很多系统函数,其中就有与我们驱动相冲突的。

         该驱动在注册表中注册的服务如下:

 

卸载猎豹浏览器并删除注册表中的knbdrv服务,重启电脑,重新测试我们的小驱动,果然跳过了这个蓝屏。

 

后话:突然想起以前一个问题,“为什么很多人推荐在一台电脑上最好只装一套杀毒软件呢?”,其实原因也在于此,杀毒软件之间会相互掐架,很多知名的安全技术手段,很多杀毒厂商都会用到,很容易导致冲突蓝屏。因此,开发安全功能的驱动时,最好分析各个杀毒软件和安全工具使用的技术手段(逆向),一方面可以防止冲突,一方面也可以学学技术。为了避免驱动开发的这个雷区,最好避开其它安全软件,如上面提到的kisknl.sys(金山毒霸)、KsDef.sys(金山卫士)、knbdrv.sys(猎豹浏览器)、dgsafe.sys(驱动精灵)和WpsSafe.sys(WPSOffice)等等。

好吧,被这个蓝屏折腾了快一天,记下来共享,提醒驱动开发发烧友避开金山、360等系列软件,防止冲突,导致莫名的蓝屏!


补充一下:后续碰到的百度相关驱动bd0001.sys, bd0002.sys也经常把系统搞蓝屏(在注册表的service里面),就算百度相关的安全软件都卸载了,而这些驱动却还保留着。


  • ------------------分隔线----------------

  • 如果感兴趣,欢迎关注本站微信号,跟踪最新博文信息,手机微信扫一扫下面的二维码,即可关注!
  • 微月信公众号
  • 推荐您阅读更多有关于“ Windows内核  安全软件   ”的文章

    请填写你的在线分享代码
    上一篇:命名管道:实现Win7服务与桌面程序的消息交互下一篇:CPU的一些概念区分:core, die, package, physical, logic

    猜你喜欢

    评论列表:

    发表评论

    必填

    选填

    选填

    必填,不填不让过哦,嘻嘻。

    记住我,下次回复时不用重新输入个人信息

    本站介绍
    最近发表
    本年最热文章
    本月最热文章
    网站分类
    文章归档