http://blog.csdn.net/hgy413/article/details/6451619
以下是自己分析dump的一些经验,个人之见
系统蓝屏后,会先出来一个提示:
也可以通过dump来看到:
打开MSDN对蓝屏的说明:http://msdn.microsoft.com/en-us/library/windows/hardware/hh994433(v=vs.85).aspx
找到0x19的说明:
[cpp] view plaincopy
- 0×00000019 BAD_POOL_HEADER
再找到参数1为0x20的地方:
[cpp] view plaincopy
- 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,这种错误一般是对一个无效的地址进行了访问,如
[cpp] view plaincopy
- _asm
- {
- Xor eax,eax
- Mov [eax],eax
- }
windbg分析(有符号pdb)
这个要注意一下,因为是内核dump,所以如果把它提取出来到本机(不在虚拟机了),先把符号路径设置好(指向它的内核文件Pdb,如虚拟机是XP,就用xp的,再加上它的本地pdb路径)
[cpp] view plaincopy
- 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.代码:
[cpp] view plaincopy
- 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:
[cpp] view plaincopy
- kd> dd f8935c6c-8 l1
- f8935c64 00000000
- kd> dd f8935c6c-14 l1
- f8935c58 00000014
相加等于14,然后对14做指针取值,挂掉!
//-------------------------------------------------------------------------------------------------------------------------
windbg分析(无符号Pdb,结合IDA)
[cpp] view plaincopy
- 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=00010206
1.通过7e类型,第一个参数c0000005在MSDN找到这是个内存访问错误
2.查看汇编:
[cpp] view plaincopy
- 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.定位特征码:
[cpp] view plaincopy
- 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
机器码是:
[cpp] view plaincopy
- kd> db f889b0d3 f889b0db
- f889b0d3 8b 08 89 4d fc 8b 55 fc-52
4.IDA打开sys,切换到文本模式,搜索特征码:8b 08 89 4d fc 8b 55 fc 52
直接Search–>sequence of bytes或快捷Alt+b
双击即可跳到指定的代码位置,对比就很清楚代码来自哪