以下是自己分析dump的一些经验,个人之见
系统蓝屏后,会先出来一个提示:
也可以通过dump来看到:
打开MSDN对蓝屏的说明:http://msdn.microsoft.com/en-us/library/windows/hardware/hh994433(v=vs.85).aspx
找到0x19的说明:
0×00000019 BAD_POOL_HEADER再找到参数1为0x20的地方:
The pool entry that should have been found The next pool entry Reserved The pool block header size is corrupt.意思堆头大小被破坏,所以应该是堆分配问题!!!!!!!!!!!!!!!
所以看到0×19,第一个参数为20,第一反应是内存操作错误引发的
另一个常见错误是0×50,PAGE_FAULT_IN_NONPAGED_AREA,这种错误一般是对一个无效的地址进行了访问,如
_asm { Xor eax,eax Mov [eax],eax }
windbg分析(有符号pdb)
这个要注意一下,因为是内核dump,所以如果把它提取出来到本机(不在虚拟机了),先把符号路径设置好(指向它的内核文件Pdb,如虚拟机是XP,就用xp的,再加上它的本地pdb路径)
BugCheck 7E, {c0000005, f889b0d3, f8935b88, f8935884}:和上图一样的效果,指明了蓝屏类型和四个子参数 0xC0000005: STATUS_ACCESS_VIOLATION indicates a memory access violation occurred:MSDN表明这是个内存访问错误 Probably caused by : BSODCheck.sys ( BSODCheck!IsExitProcess+a3 ):指明了蓝屏引发的驱动 FAULTING_IP: BSODCheck!IsExitProcess+a3 [e:\bsodcheck\bsodcheck.c @ 41] f889b0d3 8b08 mov ecx,dword ptr [eax]: 指明了引发蓝屏的实际代码 CONTEXT: f8935884 — (.cxr 0xfffffffff8935884) eax=00000014 ebx=00000000 ecx=80008138 edx=00000000 esi=e1b3129c edi=827743b8 eip=f889b0d3 esp=f8935c50 ebp=f8935c6c iopl=0 nv up ei pl nz na pe nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=0001020
分析流程:
1.mov ecx,dword ptr [eax]: 指明了引发蓝屏的实际代码
2.eax=00000014:来自案发时现场的环境,这是个无效的值
3.代码:
kd> ub f889b0d3 l4 f889b0c8 8b11 mov edx,dword ptr [ecx] f889b0ca 8955f8 mov dword ptr [ebp-8],edx f889b0cd 8b45f8 mov eax,dword ptr [ebp-8] f889b0d0 0345ec add eax,dword ptr [ebp-14h] kd> u f889b0c8 l30 f889b0c8 8b11 mov edx,dword ptr [ecx] f889b0ca 8955f8 mov dword ptr [ebp-8],edx f889b0cd 8b45f8 mov eax,dword ptr [ebp-8] f889b0d0 0345ec add eax,dword ptr [ebp-14h] f889b0d3 8b08 mov ecx,dword ptr [eax] f889b0d5 894dfc mov dword ptr [ebp-4],ecx
4.dword ptr [ebp-8]是一个局部变量,保存到eax,Eax+dword ptr [ebp-14h]局部变量
5.结合代码:Segment = *(PULONG)((ULONG)SectionObject + SegmentOffset);时蓝屏了
6.结合案发环境:ebp=f8935c6c:
kd> dd f8935c6c-8 l1 f8935c64 00000000 kd> dd f8935c6c-14 l1 f8935c58 00000014
相加等于14,然后对14做指针取值,挂掉!
//-------------------------------------------------------------------------------------------------------------------------
windbg分析(无符号Pdb,结合IDA)
FOLLOWUP_IP: 案发现场 BSODCheck+10d3 f889b0d3 8b08 mov ecx,dword ptr [eax] CONTEXT: f8935884 — (.cxr 0xfffffffff8935884):案发现场环境 eax=00000014 ebx=00000000 ecx=80008138 edx=00000000 esi=e1b3129c edi=827743b8 eip=f889b0d3 esp=f8935c50 ebp=f8935c6c iopl=0 nv up ei pl nz na pe nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=000102061.通过7e类型,第一个参数c0000005在MSDN找到这是个内存访问错误
kd> u f889b0ca l4 BSODCheck+0x10ca: f889b0ca 8955f8 mov dword ptr [ebp-8],edx f889b0cd 8b45f8 mov eax,dword ptr [ebp-8] f889b0d0 0345ec add eax,dword ptr [ebp-14h] f889b0d3 8b08 mov ecx,dword ptr [eax] // 崩在这里3.定位特征码:
kd> u f889b0d3 BSODCheck+0x10d3: f889b0d3 8b08 mov ecx,dword ptr [eax] f889b0d5 894dfc mov dword ptr [ebp-4],ecx f889b0d8 8b55fc mov edx,dword ptr [ebp-4] f889b0db 52 push edx机器码是:
kd> db f889b0d3 f889b0db f889b0d3 8b 08 89 4d fc 8b 55 fc-524.IDA打开sys,切换到文本模式,搜索特征码:8b 08 89 4d fc 8b 55 fc 52
双击即可跳到指定的代码位置,对比就很清楚代码来自哪