我能从 Minidump 中看出什么:
1. 楼主在玩魔兽 (或者你在写外挂搞魔兽)
2. Windbg 又出错了!
Windbg 告诉我们出错的 call stack 是:
STACK_TEXT: b694cbf4 b694cd18 1743cf2e b694cd64 0019e824 nt!RtlInitUnicodeString+0x1b WARNING: Frame IP not in any known module. Following frames may be wrong. b694cd30 8053e648 000026d8 00000000 00000000 0xb694cd18 b694cd30 7c92e4f4 000026d8 00000000 00000000 nt!KiFastCallEntry+0xf8 0019e86c 00000000 00000000 00000000 00000000 0x7c92e4f4
nt!KiFastCallEntry+0xd7: 8053e627 33c9 xor ecx,ecx 8053e629 8a0c18 mov cl,byte ptr [eax+ebx] 8053e62c 8b3f mov edi,dword ptr [edi] 8053e62e 8b1c87 mov ebx,dword ptr [edi+eax*4] 8053e631 2be1 sub esp,ecx 8053e633 c1e902 shr ecx,2 8053e636 8bfc mov edi,esp 8053e638 3b35549a5580 cmp esi,dword ptr [nt!MmUserProbeAddress (80559a54)] 8053e633 c1e902 shr ecx,2 8053e636 8bfc mov edi,esp 8053e638 3b35549a5580 cmp esi,dword ptr [nt!MmUserProbeAddress (80559a54)] 8053e63e 0f83a8010000 jae nt!KiSystemCallExit2+0x9f (8053e7ec) 8053e644 f3a5 rep movs dword ptr es:[edi],dword ptr [esi] 8053e646 ffd3 call ebx 8053e648 8be5 mov esp,ebp 8053e64a 8b0d24f1dfff mov ecx,dword ptr ds:[0FFDFF124h]
nt!KiFastCallEntry 告诉我们,一切正常,某些“好但是阴险”的钩子点没有工作,程序在 8053e646 准备进入 SSDT。但是 SSDT 里的某个项被 Hook 了。
WARNING: Frame IP not in any known module. Following frames may be wrong. b694cd30 8053e648 000026d8 00000000 00000000 0xb694cd18 << Hook! b694cd30 7c92e4f4 000026d8 00000000 00000000 nt!KiFastCallEntry+0xf8
那么,0xb694cd18 是什么?没有答案:
kd> dd 0xb694cd18 b694cd18 00000000 1743cf2e 00320031 e2aee6e0 b694cd28 00040003 8588f008 b694cd64 8053e648 b694cd38 000026d8 00000000 00000000 1743ce10 b694cd48 00000000 1743bf98 00001000 00000003 b694cd58 8588f008 00000000 01000000 0019e86c b694cd68 7c92e4f4 badb0d00 0019e7f8 ffffffff b694cd78 b6ebfda0 00000000 00000000 00000000 b694cd88 00000000 00000000 00000000 00000000
结合栈桢分析,我发现这里是 Windbg 自己解析出错了! 因为 nt!RtlInitUnicodeString 只开辟了一个局部变量,而这个分析显然有问题:
kd> dd esp b694cbf0 b694cd64 f7bbd806 b694cd18 1743cf2e b694cc00 b694cd64 0019e824 f7bbd6ed 2e576f57 b694cc10 00657865 00000000 00000003 00000001 b694cc20 00004021 00000000 00000000 00000000 b694cc30 00000000 00000000 b694ccc4 f718a0c5 b694cc40 0019e5dc 00100001 0019e580 0019e5b0 b694cc50 00000003 00004021 855b1b00 ebfb2640 b694cc60 8060d590 ebf9f247 0019e5dc 00100001
kd> kb ChildEBP RetAddr Args to Child b694cbf4 b694cd18 1743cf2e b694cd64 0019e824 nt!RtlInitUnicodeString+0x1b WARNING: Frame IP not in any known module. Following frames may be wrong. b694cd30 8053e648 000026d8 00000000 00000000 0xb694cd18 b694cd30 7c92e4f4 000026d8 00000000 00000000 nt!KiFastCallEntry+0xf8 0019e86c 00000000 00000000 00000000 00000000 0x7c92e4f4
Windbg 认为: b694cd64 f7bbd806 是局部变量 b694cd18 是返回地址 1743cf2e 是参数一 b694cd64 是参数二
但是显然应该是:
kd> dd esp b694cbf0 b694cd64 f7bbd806 b694cd18 1743cf2e b694cc00 b694cd64 0019e824 f7bbd6ed 2e576f57 b694cc10 00657865 00000000 00000003 00000001 b694cc20 00004021 00000000 00000000 00000000 b694cc30 00000000 00000000 b694ccc4 f718a0c5 b694cc40 0019e5dc 00100001 0019e580 0019e5b0 b694cc50 00000003 00004021 855b1b00 ebfb2640 b694cc60 8060d590 ebf9f247 0019e5dc 00100001
b694cd64 是局部变量 —— push edi f7bbd806 是返回地址 —— 回到钩子函数里 b694cd18 是参数一 —— RtlInitUnicodeString 的 DestinationString 1743cf2e 是参数二 —— RtlInitUnicodeString 的 SourceString
这个猜想太大胆了 OK!验证一下:
kd> u f7bbd806 *** WARNING: Unable to verify timestamp for hfile.sys *** ERROR: Module load completed but symbols could not be loaded for hfile.sys hfile+0x806: f7bbd806 ?? ??? ^ Memory access error in 'u f7bbd806'
原来是 hfile.sys 挂钩了 SSDT。google 一下,这可不是什么好东西!
kd> lm start end module name ........ f7bba000 f7bbad00 dxgthk (deferred) f7bbd000 f7bbdf80 hfile T (no symbols) f7c03000 f7c03b80 Null (deferred) ........
---------------------------------------------------------------------------
RtlInitUnicodeString 参数一:b694cd18
kd> dt nt!_unicode_string b694cd18 "Logs???" +0x000 Length : 0 +0x002 MaximumLength : 0 +0x004 Buffer : 0x1743cf2e "Logs???"
---------------------------------------------------------------------------
RtlInitUnicodeString 参数二:1743cf2e
kd> db 1743cf2e 1743cf2e 4c 00 6f 00 67 00 73 00-f8 e8 8a 6b 46 42 7e 72 L.o.g.s....kFB~r 1743cf3e 60 00 0c 7c e8 5a 09 03-22 28 0c 7c e5 39 58 78 `..|.Z.."(.|.9Xx 1743cf4e 78 78 8b 73 e5 41 8d 2d-3d 3d 2d 74 05 3a fd fd xx.s.A.-==-t.:.. 1743cf5e fd 01 8e 84 ec 6b 62 7a-7a f8 cb 6b 66 42 1c 18 .....kbzz..kfB.. 1743cf6e d8 50 ab 6b 06 3a a0 78-9f 17 52 9d 87 42 e1 f2 .P.k.:.x..R..B.. 1743cf7e f0 e0 eb 7c 26 3a 72 72-72 72 8b 6b 46 42 55 f5 ...|&:rrrr.kFBU. 1743cf8e ad 0b eb 73 a8 4a f5 ff-2a 2a 0d 00 01 02 6f 10 ...s.J..**....o. 1743cf9e 70 05 e0 01 1c 00 80 85-28 00 f0 94 29 63 d5 9d p.......(...)c..
非常好!和我预期的一模一样~ B-)
我说到这里,楼主自己也能分析出蓝屏的原因了吧。
看样子 hfile.sys 驱动想初始化一个 UNICODE_STRING ——“LOGS”,但是它这里没有指定字符串的结束符: 1743cf2e 4c 00 6f 00 67 00 73 00-f8 e8 8a 6b 46 42 7e 72 1743cf2e 4c 00 6f 00 67 00 73 00-00 00 8a 6b 46 42 7e 72 << 这才是正确的!
结果,可怜的 repne scas word ptr es:[edi] 指令,一直从地址 1743cf2e 计算字符串长度到 1743d000:
eax=00000000 ebx=1743ced0 ecx=ffffff96 edx=b694cd18 esi=805d96b6 edi=1743d000 eip=8052bd97 esp=b694cbf0 ebp=b694cd30 iopl=0 nv up ei pl nz ac pe cy cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010217
看看这一段吧:
kd> db 1743cf2e 1743d000 1743cf2e 4c 00 6f 00 67 00 73 00-f8 e8 8a 6b 46 42 7e 72 L.o.g.s....kFB~r 1743cf3e 60 00 0c 7c e8 5a 09 03-22 28 0c 7c e5 39 58 78 `..|.Z.."(.|.9Xx 1743cf4e 78 78 8b 73 e5 41 8d 2d-3d 3d 2d 74 05 3a fd fd xx.s.A.-==-t.:.. 1743cf5e fd 01 8e 84 ec 6b 62 7a-7a f8 cb 6b 66 42 1c 18 .....kbzz..kfB.. 1743cf6e d8 50 ab 6b 06 3a a0 78-9f 17 52 9d 87 42 e1 f2 .P.k.:.x..R..B.. 1743cf7e f0 e0 eb 7c 26 3a 72 72-72 72 8b 6b 46 42 55 f5 ...|&:rrrr.kFBU. 1743cf8e ad 0b eb 73 a8 4a f5 ff-2a 2a 0d 00 01 02 6f 10 ...s.J..**....o. 1743cf9e 70 05 e0 01 1c 00 80 85-28 00 f0 94 29 63 d5 9d p.......(...)c.. 1743cfae 9d 15 19 d7 92 ad f2 fa-72 5a 13 be 71 ad 3f 7b ........rZ..q.?{ 1743cfbe eb 82 f2 b5 2f a5 00 fd-af ae ae 94 46 42 d6 d4 ..../.......FB.. 1743cfce d4 d4 cf a4 c8 5a 45 85-27 07 ad 8c c9 52 25 2d .....ZE.'....R%- 1743cfde 2d 29 2f 9d 0b 74 7f 7f-6e ca e8 5a 66 4a a4 b6 -)/..t..n..ZfJ.. 1743cfee b6 b4 b2 a5 08 5b 15 d5-d5 95 b2 ad ef 9c f8 f8 .....[.......... 1743cffe f1 e8 ?? ..?
为了找 00 00 结束符,指令一直访问到地址错误、蓝屏,精神可嘉。
最后对楼主的建议:
1. 玩 WOW 前赶紧卸载那什么 hfile.sys 小心它 LOGS 你的密码啥的。
2. 开启360。我发现你的机器上有360,但是自我保护没开启。 /* *** WARNING: Unable to verify timestamp for safeboxkrnl.sys *** ERROR: Module load completed but symbols could not be loaded for safeboxkrnl.sys */
3. 您若是无聊就把 hfile.sys 发给我看看 (wangyu_at_qihoo_dot_net),我若是无聊就把它给逆了。
4. 写的累死我了,楼主给点掌声吧... : P
|