如何分析 WindowsDump:BSOD 分析与 WinDbg 使用(二)

适用场景:Windows 系列系统异常宕机(蓝屏)且存在Dump文件(*.dmp)

相关背景解释:众所周知,Windows历史上BUG比较多,无故宕机、程序卡死的例子较多,为了避免无迹象可循的情况,Microsoft 推出 Dump机制在宕机时先进行蓝屏收集宕机前状态,并且可以捕获到导致异常的关键错误,当Windows出现异常Crash时Windows会调用Dump系统来形成一个转储文件(* .dmp),通过特殊工具可以进行分析。

蓝屏文件俗称BSOD(Blue Screen Of Death),一般出现后处理方式就只有重启,蓝屏的产生原因是:

BSOD有三大规则会触发:

  • 保护规则:当低级特权的代码直接访问高级特权代码与数据时(如某些安全防护软件通过用户态进行驱动修改)就会触发BSOD;
  • 异常处理:程序异常时程序本身没有写好完整的异常处理回路,系统接收到异常则启动先行中断机制,所以程序设计存在问题时也有可能触发蓝屏(比如之前0Day漏洞黑客所用的工具导致蓝屏,明显就是没有写好异常处理回路)
  • SDK、DDK中调用了只有在特定IRQL调用的内核参数,即只有特定CPU中断请求的时候才可以使用DDK调用的内核参数在未到中断请求时被发起调用(一般出现于.Net Winform应用中)

在腾讯云主机上,一般第一、二规则导致的BSOD Case比较多。

附蓝屏产生过程:

转储原理:

一、 BSOD分析:

虽然BSOD必然会输出Dump文件,但是BSOD也会带来相关有用的信息,一般BSOD呈现方式为:

  • 浅蓝框:序言、错误的信息描述
  • 中间部分:建议的措施
  • 红色框:相关中断的代码及其参数

关于 浅蓝框 跟 中间部分 基本可以忽略,作为排错需要关注的下面红色框的参数,下面具体举个例子:

*STOP:0x0000007F(0xc0000005,0x808945CF,0xF78A6A88,0XF78A6784)

0x0000007F:7F,即导致BSOD的关键代码,通常可以在https://support.microsoft.com/zh-cn/search 可以搜索到 0xc0000005:5,涉及的进程对象(Process Object) 0x808945CF:对应对象的指针(指向位置) 0xF78A6A88:进程涉及的映像名 0XF78A6784:备注解析信息等

二、Dump文件分析

1、 WinDbg工具环境准备,配置好symbol 路径,使其用相关Debug命令时可以自动加载对应module(Minidump可能信息提供较少):

2、 设置Path路径为SRVD:\sysmbolshttp://msdl.microsoft.com/download/symbols 使其在加载相关module(最常见就是NT)时自动从mircosoft 进行下载

Eg:Open Crash Dump时自动加载涉及到的Module:

对应文件夹出现相关Modeule:

3、 打开*.dmp文件:

4、 初始界面如下:

5、 点击!analyze –v 可以进行自动分析,可以看到这个Dump是因为底层调用netkvm.sys导致crash:

6、 但是大部分Crash并不是如例子所示就可以明确看出涉及的驱动进程,所以可以使用!process [0,0]查看crash时hang住的进程:

7、 通过!thread 可以到进程中涉及的线程信息(可以看到这里是Idel时系统Crash掉):

8、 如果是系统组件导致的问题的,可以通过lm kv 导出加载的内核模块:

9、 !vm 可以看出crash时内存状态(可以看到用户的 175ptServer.exe 进程占用较高):

10、 当然也可以通过memory视图来定位thread hang在什么位置:

11、 WinDbg提供大量其他视图可以辅助定位原因,可以根据实际case进行灵活使用(比如Disassembly视图也是很好用的一个功能):

后言

Windows系统方面的 MiniDump提供信息较少,FullDump在Memory这块信息会比较多,具体使用方法需要根据具体Case来灵活调整使用。

附常见命令:

(1)进程: !process [0 0];dt nt!_eprocess;dt nt!_kprocess; (2)线程: !thread;dt nt!_ethread;dt nt!_kthread; (3)I/O请求包: dt nt!_irp;!irpfind; (4)常见同步对象:lkd> dt nt!_kevent;lkd> dt nt!_kmutant;lkd> dt nt!_ksemaphore; (5)作业:lkd> !job;会话(lkd> !session);内存管理(lkd> !vm)的命令等。

附件是WinDbg使用指南(English版)

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

2 条评论
登录 后参与评论

相关文章

来自专栏Jaycekon

Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容。主要是对电脑笔记本以及他们的属性进行抓取,然后在使...

3665
来自专栏Coding01

说一说 Laravel 邮件发送流程

我们使用阿里云提供的免费邮,和采用「smtp」驱动,作为测试,参考 .env 配置:

795
来自专栏Java帮帮-微信公众号-技术文章全总结

HTML5学习-day02【悟空教程】

请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论。正当你想要停下滚轮细看的时候,手残按到了F5。然后,页面刷新了,评论...

723
来自专栏流浪猫的golang

golang mongoDB GridFS查询 存储 删除文件

GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等),如果没有超过16m大小可以将数据保存在BSON数据中。 Gr...

521
来自专栏TSW

这个框架的官网居然放了这种照片......

1172
来自专栏安恒网络空间安全讲武堂

CSP总结及CTF实例分析

本文作者:HeartSky 最近各大比赛中 CSP 绕过的题目突然多了起来,自己也尝试着总结下 What is CSP? > The new Content-S...

4546
来自专栏腾讯移动品质中心TMQ的专栏

【腾讯 TMQ】零基础学习 Fiddler 抓包改包

Fiddler 是一款 HTTP 协议调试代理工具,它能够抓取记录本机所有 HTTP(S) 请求,通过设置断点等方法我们可以任意修改进出 Fiddler 的数据...

9920
来自专栏熊二哥

.NET工作准备--04ASP.NET

(已过时) ASP.NET 1.开发基础 *asp.net以什么形式运行?.net宿主的概念,ISAPI的概念,ASP.NET基本运行机制; .net宿主...

1895
来自专栏猫哥学前班

猫哥网络编程系列:HTTP PEM 万能调试法

注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新。 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么...

3196
来自专栏Puppeteer学习

一步一步学Vue(七)

1263

扫码关注云+社区