下载时将链接中的.html去掉,可以下载。
To Apple:
关于如何分析DUMP文件,《软件调试》13.4节结合一个真实的DUMP文件,给出了详细的分析。你可以参考着做一下。
对于这个文件,文件打开后,应该在把符号路径设置正确后(例如.symfix c:\symbols),执行一下.reload,然后再执行kv或者!analyze -v
以下是发生非法访问时的上下文:
FAULTING_IP: +ffffffff867731f8867731f8 0000 add byte ptr [eax],al
TRAP_FRAME: ba3ea92c -- (.trap 0xffffffffba3ea92c)ErrCode = 00000002eax=00000012 ebx=85ad8c98 ecx=86744020 edx=85ad8c88 esi=866892e8 edi=86542f90eip=867731f8 esp=ba3ea9a0 ebp=ba3ea9dc iopl=0 nv up ei ng nz na po nccs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010282867731f8 0000 add byte ptr [eax],al ds:0023:00000012=??
从这个上下文可以知道当时程序指针已经指向了内容为0000的区域,虽然0000仍对应着有效的IA-32 指令,但是这个指令其实很值得怀疑了。
另外,WinDBG没有解析到这个IP地址所对应的模块,那么很可能这个地址不属于有效的代码区,也就是说程序指针意外的飞到了这里。
看一下栈回溯:
1: kd> kvn # ChildEBP RetAddr Args to Child WARNING: Frame IP not in any known module. Following frames may be wrong.00 ba3ea99c 804f018f 86744020 85ad8c88 85ad8c88 0x867731f801 ba3ea9ac 80584953 86542f78 000000a8 867e7ca0 nt!IopfCallDriver+0x31 (FPO: [0,0,0])02 ba3ea9dc 805bda0a 867b57f8 86744020 00000080 nt!IopCloseFile+0x26b (FPO: [Non-Fpo])03 ba3eaa10 805bd333 867b57f8 00000001 867e7ca0 nt!ObpDecrementHandleCount+0xd8 (FPO: [Non-Fpo])04 ba3eaa38 805bd3d1 e1001e08 86542f90 00000cbc nt!ObpCloseHandleTableEntry+0x14d (FPO: [Non-Fpo])05 ba3eaa80 805bd509 00000cbc 00000000 00000000 nt!ObpCloseHandle+0x87 (FPO: [Non-Fpo])06 ba3eaa94 8054261c 80000cbc ba3eabc4 80500f31 nt!NtClose+0x1d (FPO: [Non-Fpo])07 ba3eaa94 80500f31 80000cbc ba3eabc4 80500f31 nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ ba3eaaa0)08 ba3eab10 ba2940fd 80000cbc 00000000 00000000 nt!ZwClose+0x11 (FPO: [1,0,0])09 ba3eabc4 ba294eea ba294d94 ba294d88 ba294d3c 360IceBreaker+0x10fd0a ba3eac04 ba29523c 85d702a0 00000001 00000000 360IceBreaker+0x1eea0b ba3eac40 804f018f 859ceba0 00000000 806e7410 360IceBreaker+0x223c0c ba3eac50 80580982 85af5800 85d702a0 85af5790 nt!IopfCallDriver+0x31 (FPO: [0,0,0])0d ba3eac64 805817f7 859ceba0 85af5790 85d702a0 nt!IopSynchronousServiceTail+0x70 (FPO: [Non-Fpo])0e ba3ead00 8057a274 000002cc 00000000 00000000 nt!IopXxxControlFile+0x5c5 (FPO: [Non-Fpo])0f ba3ead34 8054261c 000002cc 00000000 00000000 nt!NtDeviceIoControlFile+0x2a (FPO: [Non-Fpo])10 ba3ead34 7c92e4f4 000002cc 00000000 00000000 nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ ba3ead64)11 0012f5c4 00000000 00000000 00000000 00000000 0x7c92e4f4
从栈帧#01可以知道,是因为IopfCallDriver调用某个驱动的注册例程才出了上面的错。那么可能的原因是IopfCallDriver函数的第一个参数所指定的设备对象有问题,也可能是这个设备对象的某些字段被破坏了。
使用dt _DEVICE_OBJECT 观察这个参数:
1: kd> dt _DEVICE_OBJECT 86542f78 nt!_DEVICE_OBJECT +0x000 Type : 1 +0x002 Size : 0 +0x004 ReferenceCount : 0 +0x008 DriverObject : 0x867e7ca0 _DRIVER_OBJECT +0x00c NextDevice : 0x42000800 _DEVICE_OBJECT +0x010 AttachedDevice : 0x00000001 _DEVICE_OBJECT +0x014 CurrentIrp : (null) +0x018 Timer : 0x00700005 _IO_TIMER +0x01c Flags : 0x866e9900 +0x020 Characteristics : 0x86641248 +0x024 Vpb : 0xe47b0d90 _VPB +0x028 DeviceExtension : 0xe1442940 +0x02c DeviceType : 0x85b0090c +0x030 StackSize : -24 '' +0x034 Queue : __unnamed +0x05c AlignmentRequirement : 0 +0x060 DeviceQueue : _KDEVICE_QUEUE +0x074 Dpc : _KDPC +0x094 ActiveThreadCount : ?? +0x098 SecurityDescriptor : ???? +0x09c DeviceLock : _KEVENT +0x0ac SectorSize : ?? +0x0ae Spare1 : ?? +0x0b0 DeviceObjectExtension : ???? +0x0b4 Reserved : ???? Memory read error 8654302c
上面的显示有很多问题,显示??的字段可能是因为目前使用的是Mini Dump,对应的内存数据没有包含进来。
驱动程序360IceBreaker 出现在出事的栈中,使用lmvm 可以显示它的版本信息:
1: kd> lmvm 360IceBreaker start end module nameba293000 ba295f00 360IceBreaker T (no symbols) Loaded symbol image file: 360IceBreaker.sys Image path: 360IceBreaker.sys Image name: 360IceBreaker.sys Timestamp: Sat May 12 20:45:02 2007 (4645EF0E) CheckSum: 0000B169 ImageSize: 00002F00 Translations: 0000.04b0 0000.04e0 0409.04b0 0409.04e0
MJ0011说这个驱动的版本很旧,建议你换一个新的版本,除非你是特意在学习这个版本或者研究这个问题:-)。如果真的如此,那么建议考虑分析完整的转储文件,或者做活动的双机内核调试。