是谁破坏了内核调试
这是前些日发生的一个故事,星期五一早到单位,开机收邮件,发现一封急件,要求一定要在xxx日之前打好某个补丁。对于这样的邮件,不得不重视,于是就打吧,过了一阵,要求重启系统,那就重启吧。没想到,重启之后系统一直停留在一个画面,显示如下两行字:
“Preparing to configure Windows"
"Do not turn off your computer”
当然除了这两行字,还有一个代表忙碌的旋转图标,转啊转啊,转啊转啊,5分钟过去了,还转啊转啊,十分钟过去了,还转啊转啊,转啊转啊...
实在看不下去了,强制蓝屏后重启,结果还是这个画面,转啊转啊...
尝试进安全模式,但也遇到同样的问题,转啊转啊...
尝试"Last known good...",也是转啊转啊...
尝试WRE,顺利进入到修复环境,但是因为主系统的Windows 7使用了全硬盘加密,所以无法休息,晕倒。
怎么办,上调试器,在WRE中启用内核调试,选择串口方式,将本子放在dock上,找到另一台有串口的机器,开始调试。
起初很顺利,目标机启动后,WinDBG便收到了握手信息,可以顺利断下来。因为问题出在登录阶段,所以g,让目标系统继续跑,过了一会,转啊转啊的场景又出现了,心里想,这下可以看看到底是为什么停在这里了,激动的按下Ctrl + Break,然后等待目标系统“应声落马”,乖乖的中断到调试器中,但实际却没有反应,目标系统根本没有中断下来,还是在那里转啊转啊,转啊转啊,真是气煞我也!
眼看着时间一分一秒的过去,上午本来要做的事情还没有做,但是电脑进不去,啥也干不成啊。是可忍,孰不可忍。脱下外套,倒一杯茶,准备好打一场硬仗。
第一步要搞清楚的是为什么出现“转啊转啊”的时候内核调试不工作了。启动初期工作的好好的,后来为何不工作了呢?
根据经验,一定是被哪个坏蛋破坏掉了。怎么抓住破坏内核调试的黑手呢?一种方法就是监视禁止内核调试的KD函数(KdDisableDebuggerWithLock和KdDisableDebugger),当坏蛋调用这个函数时将其当场抓住。
于是bp KdDisableDebuggerWithLock;bp KdDisableDebugger将两个函数都设置上断点,然后再g恢复目标运行。
过了一会,登录桌面出现,就要进入“转啊转啊”阶段了,这时断点命中了,看来坏蛋正是在这个时候对内核调试下狠手了。k命令追查调用者:
2: kd> k
Child-SP RetAddr Call Site
fffff880`035b6828 fffff880`0838840a nt!KdDisableDebuggerWithLock
fffff880`035b6830 fffff800`03c66047 PECKP_x64+0x540a
fffff880`035b6860 fffff800`03c66445 nt!IopLoadDriver+0xa07
fffff880`035b6b30 fffff800`03882ca9 nt!IopLoadUnloadDriver+0x55
fffff880`035b6b70 fffff800`03b1a34a nt!ExpWorkerThread+0x111
fffff880`035b6c00 fffff800`0386a946 nt!PspSystemThreadStartup+0x5a
fffff880`035b6c40 00000000`00000000 nt!KxStartSystemThread+0x162
狐狸露出尾巴了,名字叫PECKP_x64。还挺隐晦的名字。lm观察详情:
3: kd> lm vm pec*
start end module name
fffff880`086f3000 fffff880`08708000 PECKP_x64 (deferred)
Image path: \??\C:\Windows\system32\drivers\PECKP_x64.SYS
Image name: PECKP_x64.SYS
Timestamp: Thu Jul 12 23:06:36 2012 (4FFEE7FC)
CheckSum: 0000B31B
ImageSize: 00015000
Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4
没有描述,只好搜索了,Google加baidu,查到了,原来是某银行网银控件的一部分,所谓的键盘保护驱动,防止用户输入密码时被嗅探。出发点是好的,但为什么要破坏内核调试啊?怕被跟踪么?哎,那也不能这样干啊,亲爱的同行。
u看了下汇编,没有两秒钟,就想出了一个化解的方法:
eb nt!KdBlockEnable 1
然后跟踪几下,KdDisableDebuggerWithLock就直接返回了。再g继续,转啊转啊的又出现了,再次Ctrl + Break,目标系统应声停下,转啊转啊的图标也定格在那里了。
又经过一番分析,发现问题与TrustedInstaller.exe有关,一通追查(另文记述),问题排除,可以进入系统了。