如何使用WinDbg来分析VC ++应用程序的崩溃转储?

如何使用WinDbg分析转储文件?

以下是一些通用的步骤,可以帮助您:

首先,您必须更改编译器的设置,以便创buildPDB文件,即使是发布版本也是如此。 Visual C ++编译器的更高版本在默认情况下执行此操作,但是在许多版本的Visual C ++中,您必须自己执行此操作。 创build程序数据库文件,然后保存这些文件的存档以及应用程序的每个版本。 每个构build的应用程序都有自己的一组PDB是至关重要的。 例如,您不能重复使用与构build10相同的构件来检查构build15生成的转储。 在你的项目的整个生命周期中,你将会得到大量的PDB,所以要做好准备。

接下来,您需要能够确定生成转储文件的应用程序的确切版本。 如果你正在创build自己的MiniDump(例如通过调用MiniDumpWriteDump() ),最简单的方法是简单地将MiniDump的文件名称作为应用程序的完整版本号。 您需要有一个合理的版本编号scheme才能运行。 在我的商店中,每当自动构build器创build构build时,我们都会将所有分支的内部版本号增加一个。

现在您已经收到来自客户的转储文件,您知道创build转储的应用程序的准确版本,并且已经find了此版本的PDB文件。

现在,您需要查看源代码pipe理的历史logging,并find该软件的确切版本的源代码。 做到这一点的最好方法是每次构build时将“标签”应用于分支。 将标签的值设置为确切的版本号,在历史logging中很容易find。

你几乎可以开始WinDbg / Visual C ++的开发了:

  1. 获取该版本的应用程序的完整源代码树。 把它放在你硬盘上的一个单独的地方,比如c:\app_build_1.0.100 ,应用程序版本1.0 build#100。
  2. 获取应用程序的确切版本的二进制文件,并将其放在硬盘驱动器的某个位置。 简单地说,安装该版本的应用程序来获取二进制文件可能是最简单的。
  3. 在步骤2中将PDB文件放在与二进制文件相同的位置。

现在有两个选项可以查看转储文件。 您可以使用Visual Studio或WinDbg。 使用Visual Studio更容易,但WinDbgfunction更强大。 大多数情况下,Visual Studio中的function就足够了。

要使用Visual Studio,您只需打开转储文件就好像它是一个项目一样。 一旦打开,“运行”转储文件(默认为F5 ),如果所有的path设置正确,它会带你到崩溃的代码,给你一个调用堆栈等。

要使用WinDbg,你必须跳过几个箍:

  1. 启动WinDbg
  2. 打开转储文件。 (默认情况下为Ctrl + D
  3. 告诉WinDbg去获取正确的MicroSoft符号文件。 键入.symfix 。 这可能需要一些时间,因为它会从互联网上下载大量的东西。
  4. 告诉WinDbg符号(PDB文件)在哪里。 键入.sympath+ c:\pdblocation ,代替将PDB文件放在path名中的任何位置。 确保你在那里得到加号,在.sympath+符号之间没有空格,否则你会搞砸第3步。
  5. 告诉WinDbg源代码在哪里。 键入.srcpath c:\app_build_1.0.100replace此版本的软件从源代码pipe理中获取代码的path。
  6. 告诉WinDbg分析转储文件。 键入!analyze -v

过了一会儿,如果一切正确configuration,WinDbg会带你到你的崩溃的位置。 在这一点上,你有100万个选项来深入挖掘你的应用程序的内存空间,关键部分的状态,窗口等。但这超出了本文的范围。

祝你好运!

(请参阅下面的“转储”部分)

使用WinDbg的基本教程和演示

  • 安装和configurationWinDbg(Windowsdebugging工具)
  • Mike Taulty – WinDBG的一个词
  • WinDbg教程
  • Windowsdebugging器:第1部分:WinDbg教程

不同的方法来“启动”/附加WinDBG

  • 用Windbg开始debugging(包括如何debugging.msi)
  • 如何debuggingWindows服务
  • 设置Windowsdebugging

工作区

了解工作空间如何工作…

  • debugging你的debugging器:为windbgdebugging创build一个自定义工作区
  • 在WinDbg中查找工作区如何工作

Cmdtree

“cmdtree”允许您定义debugging器命令的“菜单”,以便轻松访问常用的命令,而无需记住简洁的命令名称。

你不必把所有的命令定义放到同一个cmdtree文本文件中….如果你愿意的话,你可以把它们分开,并加载多个命令(然后他们得到自己的窗口)。

  • 惊人的帮手.cmdtree
  • 如何在WinDBG启动时创buildcmdtree窗口
  • 使用.cmdtree更容易debugging.net转储在windbg中
  • Microshaoft Cmdtree
  • 使用.cmdtree自定义用户界面中的特殊命令执行命令

启动脚本

您可以在命令行上使用-c选项在启动WinDBG时自动运行WinDBG脚本。

给出机会打开DML(debugging器标记语言)模式,加载特定的扩展,设置.NETexception断点,设置内核标志(例如,当内核debugging时,您可能需要更改DbgPrint掩码,以便看到跟踪信息…编辑器!Kd_DEFAULT_Mask 0xffffffff),加载cmdtrees等

示例脚本:

 $$ Include a directory to search for extensions $$ (point to a source controlled or UNC common directory so that all developers get access) .extpath+"c:\svn\DevTools\WinDBG\Extensions" $$ When debugging a driver written with the Windows Driver Framework/KMDF $$ load this extension that comes from the WinDDK. !load C:\WinDDK\7600.16385.1\bin\x86\wdfkd.dll !wdftmffile C:\WinDDK\7600.16385.1\tools\tracing\i386\wdf01009.tmf $$ load some extensions .load msec.dll .load byakugan.dll .load odbgext.dll .load sosex .load psscor4 $$ Make commands that support DML (Debugger Markup Language) use it .prefer_dml 1 .dml_start $$ Show NTSTATUS codes in hex by default .enable_long_status 1 $$ Set default extension .setdll psscor4 $$ Show all loaded extensions .chain /D $$ Load some command trees .cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree1.txt .cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree2.txt $$ Show some help for the extensions !wdfkd.help !psscor4.help .help /D 

命令作弊表

  • 崩溃转储分析海报v3.0
  • SOS Cheat Sheet(.NET 2.0 / 3.0 / 3.5)
  • WinDbg备忘单(Dev of Art)
  • WinDbg内核模式扩展命令抽认卡

扩展

“扩展”允许您扩展WinDBG内部支持的命令/function的范围。

  • bigLasagne(bldbgexts&blwdbgue)
    – 汇编语法突出显示和驱动程序映射工具)
  • BigLib数字阅读器
  • 的Byakugan
    – 检测antidebugging方法,vista堆可视化/仿真,在内存中跟踪缓冲区
  • 呼叫stream量分析器+ KnExt
  • CmdHist
    – logging您在debugging会话中执行的每个命令,以便轻松地重新执行
  • 核心分析器
    – 检查堆结构的腐败,检测线程共享的对象等
  • dom WinDBG扩展
    – (!stlpvector,!idt,!unhex,!grep等)
  • dumppe
    – 从内存转储PE文件
  • 图像查看器扩展(VladimirVukićević)
  • 英特尔®UEFI开发套件debugging工具
    – debuggingUEFI固件
  • leaktrap
    – GDI / USER处理跟踪器以帮助检漏
  • Mona (需要PyKD)
    – 一组命令来帮助进行高级分析/查找攻击
  • MSEC
    – 提供自动碰撞分析和安全风险评估
  • narly
    – 列出加载模块的信息,如使用SafeSEH,ASLR,DEP,/ GS(缓冲区安全检查)
  • netext (罗德尼维亚纳)
    – (!wservice – 列出WCF服务对象,!wconfig – 显示.config行,!whttp – 列表HttpContexts,!wselect /!wfrom – 支持SQL查询数组)
  • ODbgExt
    – 打开debugging器扩展
  • OllyMigrate
    – 将debugging对象传递给另一个debugging器而不重新启动
  • Psscor2
    – 帮助debugging.NET 2.0托pipe代码的SOS超集
  • Psscor4
    – 帮助debugging.NET 4托pipe代码的SOS超集
  • PyDBGExt
    – 允许使用python脚本
  • PyKD
    – 允许Python用于脚本WinDBG
  • sdbgext(Nynaeve)
    – (!valloc,!vallocrwx,!heapalloc,!heapfree,!remotecall,!remotecall64,!loaddll,!unloaddll,!close,!killthread,!adjpriv,!ret)
  • SieExtPub
    扩展名…现在内置于ext.dll中的WinDBG中
  • SOSEX
    – 更多的命令帮助debugging托pipeNET 2.0或4.0代码
  • SPT / SDBGExt2(Steve Niemitz)
    – (!DumpHttpContext,!DumpASPNetRequests,!DumpSqlConnectionPools,!DumpThreadPool等)
  • Uniqstack
    – 源到debugging器扩展(需要OSR在线帐户来访问它)
  • viscope
    – 代码覆盖图
  • 等待链式遍历/ wct.dll(Codeplexdebugging扩展
    – 显示应用程序线程的等待链(帮助find死锁 )
  • windbgshark
    – 集成了Wireshark协议分析器来启用虚拟机stream量操作和分析
  • WinDBG扩展(Sasha Goldstein)
    – Tracer,WCT,heap_stat,bkb,traverse_map,traverse_vector)
  • WinDBG突出显示 (ColorWindbg.dll)[使用Google Translate to link]
    – 语法突出显示

写下你自己的扩展

  • 交易工具:第四部分 – 开发WinDbg扩展DLL
  • debugging器扩展的基础:短期的努力,长期的收益

使用WinDBGdebugging托pipe代码

  • 打破例外
  • 打破特定的CLR例外
  • debuggingWindbg中的.Net框架源代码
  • 使用Windbgdebugging托pipe代码中的exception
  • 使用WinDbg和SOS.dlldebugging托pipe代码
  • 用WinDbg进行debugging。 应用程序中的死锁
  • 用WINDBGpipe理debugging。 介绍和索引
  • 在Windbg中为在启动时崩溃的应用程序设置.NET断点

脚本(C#,PS,Python,WinDBG)

  • KDAR(内核debugging器防Rootkit)
    – 一个WinDBG脚本的集合
  • 系统BSOD脚本/处理应用程序
  • WinDBG脚本库
    – 一个WinDBG脚本的集合
  • 脚本MDbg和DbgHostLib
    – 允许托pipe代码脚本托pipedebugging器(MDBG)和DbgEng
  • ExtCS
    – 允许通过C#脚本控制WinDBG
  • PowerDBG
    – 允许通过Powershell脚本控制WinDBG
  • Pykd
    – 允许通过Python脚本控制WinDBG
  • windbglib
    – 围绕用于WinDBG的pykd扩展的python包装库,模仿immlib(所以你可以使用原本为Immunity Debugger编写的脚本)

使用dbgeng.dll API / WinDBG工具的debugging器/工具

  • 一个简单的基于Dbgeng的用户模式debugging器
  • Acorns.Debugging NET死锁检测器 (使用cdb.exe)( 下载 )
  • CLR托pipedebugging器 (MDBG)
  • DbgHost – 如何控制一个debugging引擎
  • debugging诊断工具v1.2 (DebugDiag), 版本2.0 + DebugDiag博客
  • Dynamorio – 可以与WinDBG交互的dynamic二进制检测工具
  • IDA + WinDBG插件
  • GUI WinDBG
  • LeakShell (findpipe理泄漏)
  • mdbglib – 托pipedebuggingAPI
  • PyDbgEng
    – Windowsdebugging引擎的python包装
  • SOSNET – 一个专注于使用SOS扩展并支持C#脚本的WinDBG Fork / alternative shell
  • SOSNET O2 fork – 使用Rosyln进行C#REPL(read-eval-print-loop)脚本引擎的SOSNET分支
  • VDB / Vivisect (kenshoto) – 在WinDBG上提供了一个跨平台的debuggingAPI
  • WinAppDbg + Heappie-WinAppDbg
  • 编写一个基本的Windowsdebugging器

不同的方法来生成崩溃转储文件进行事后分析

  • DebugDiag 2.0
  • 转储备忘录
    – 包括如何从Hyper-V,VMWare ESX和XenServer VM生成转储。
  • Citrix SystemDump
  • 键盘按键组合
  • MiniDumpWriteDump
    – (通过您的应用程序中的WIN32 API调用)。 (C#应用程序示例)
  • NMI开关 ,或(在这里)
    (基于硬件的function来生成NMI …通常在高端服务器(例如HP)上find,或者您可以获得附加PCI卡“通用PCI转储开关” )。 微软NMI技术背景 。
  • Procdump
  • 系统|高级系统设置|启动和恢复
    ( registry信息 ),
    ( 如何configuration完整(完整)内存转储 ),
    ( 如何启用完整内存转储 ),
    ( 当PC有大量内存时,如何在Windows 7上启用完整内存转储…当内存超过2GB时通常不可用 )
  • 任务pipe理器“创build转储文件”
  • UserDump , 说明 (很老的工具)
  • UserModeProcessDumper , 说明
  • Visual Studio“Save Dump As …”
  • WER(Windows错误报告….本地转储)
  • WinDBG的

转储分析工具

  • BlueScreenView – 在BSOD之后find由Windows保存的小型转储.dmp文件,并提取有关导致崩溃的信息
  • Debug.Analyzer (可以分析转储文件和插件可以用.NET编写)
  • SAD – 转储后简单 (事后分析)
  • 波动性 – 分析转储文件中logging的“内存”的框架( 备忘单 )

转储相关的工具

  • Citrix dumpcheck – 检查转储文件的一致性(看起来像是被遗弃的链接 + 链接 )
  • dumpchk (debugging工具的一部分) – 检查转储文件的一致性
  • MoonSols Windows内存工具包 (以前称为windd ) – 将各种原始内存转储文件转换为兼容WinDBG的dmp文件
  • vm2dmp – Microsoft Hyper-V VM状态到内存转储
  • vmss2core – 将VMWare快照文件转换为核心转储文件( 下载 ),( 说明 )

内核debugging虚拟机

  • VMKD – 虚拟机KD扩展
  • VirtualKD – (在VMWare / VirtualBox中托pipe的操作系统的内核debugging器支持)

影片

  • .NET Cracking 101#2 – WinDbg基础知识
  • 用于生产环境的.NETdebugging(Channel9)
  • dotnetConf – 使用WinDbg和SOS进行高级debugging
  • David Truxall“使用WinDBG进行debugging”
  • Mike Taultydebugging内存泄漏
  • oredev 2009会话:用WinDbgdebugging.NET应用程序
  • Pluralsight高级Windowsdebugging
    (加上Pluralsight的其他各种)
  • 苔丝Ferrandez WinDBG(Channel9)

博客

一些博客(本地和托pipe代码混合debugging)。

  • 高级.NETdebugging
  • 你所有的基地都属于我们 (Sasha Goldshtein)
  • 分析-V
  • ASP.NETdebugging
  • Cyber​​iafreak (线程和高级的Windows编程和debugging)
  • debugging分析器.NET
  • debugging和超越
  • 在线debugging专家杂志
  • debugging工具箱 (Windbg脚本,debugging和故障排除工具和技术,以帮助您隔离软件问题。)
  • 解密我的世界
  • greggm的WebLog
  • 张俊峰的Windows编程笔记
  • 克里斯托弗的花絮
  • Mark Russinovich的博客
  • Mike Stalls .NETdebugging博客
  • Naveen的博客
  • 永远不要怀疑你的debugging器(卡罗)
  • 从黑暗的angular落注意到
  • Ntdebugging博客 (Microsoft Global Escalation Services团队)
  • Nynaeve。 Windows中的冒险debugging和逆向工程
  • PFE开发者注意事项
  • Visual Studiodebugging器团队
  • Winkerb通过Volker von Einem

高级文章和教程资源

  • WinDbg中的高级debugging技术
  • 为MS.Net和Windowsdebugging应用程序(Powerpoint幻灯片)
  • 使用WinDbgdebuggingSTL容器
  • debugging教程1-7(CodeProject-Toby Opferman)
  • Debugging.tv
  • 开发者WinDBG已标记文章
  • 傅博士的安全博客 – 恶意软件分析教程 – 逆向工程方法
  • 利用写作教程第5部分:debugging器模块和插件如何加速基本开发的发展
  • 狩猎Rootkit
  • 使用Dell Windowsdebugging器实用程序(DWDU)进行远程Microsoft Windows服务器操作系统内核debugging ( DELL(TM)Windows(R)Debugger Utility 1.1自述文件 )

替代debugging器

  • Bokken – ( Inguma )(radare的GUI)
  • BugDbg
  • debugging++ (尚未发布)
  • Debuggy
  • 变色环0debugging器 ( 下载 )
  • edb (Linux)
  • FDBG
  • GoBug
  • 阴影(Ring 3debugging器,反debugging器检测策略)
  • Hopper (Linux,OSX和Windows)(Windowsdebugging目前没有实现)
  • Hyperdbg
  • IDAdebugging器
  • ImmunityDebugger
  • Nanomite
  • 黑曜石(非侵入式debugging器)
  • OllyDbg的
  • PEBrowse
  • RaceVB6 (VB6 P-Codedebugging器)
  • radare
  • radare2ui (用于radare的GUI)
  • Rasta Ring 0debugging器 (RR0D)
  • Syser内核debugging器
  • TRW 2000 (非常古老的debugging器大约W9x)+ dions插件归档
  • VisualDuxdebugging器
  • Wintruder (可扩展debugging器)
  • WKTVDebugger (用于Visual Basic P代码的debugging器)( 下载 )
  • x64_dbg
  • Zetadebugging器

其他链接

  • 合作RCE工具库
    – 大量的debugging器和系统级工具
  • cr4zyserb
    – 大量的插件和其他debugging工具
  • 如何编写Windowsdebugging器参考(Devon Straw)
    – 大量链接给你详细的信息,如果你想编写你自己的debugging器,如PDB文件格式,.DMP文件格式,PE文件结构,如何logging堆栈跟踪等,将需要。
  • Tuts4You
    – 解包器,IDA,OllyDBG,免疫debugging器插件等

这是一个非常广泛的问题。

  1. 第一步是将转储文件加载到WinDbg实例中。
  2. 接下来,你需要确保你有一个符号设置。
  3. 最后,您可以运行命令!analyze -v来获得对其进行的基本分析。 你需要有符号信息可用于你的代码,使转储文件值得。

网站内存转储,软件跟踪,debugging,恶意软件,受害者软件和情报分析门户网站已经为我提供了很多信息。 我也非常喜欢这本书,由Mario Hewardt和Daniel Pravat撰写的“ 高级Windowsdebugging”

Tess Ferrandez有一套很棒的基本教程和实验 ,可以开始使用Windbg。 我强烈推荐他们。