如何知道80000003断点后是否隐藏了其他异常(WER对话框)
我的应用程序,一个可执行文件,正在远程计算机上崩溃。我没有访问那台机器的权限,所以我请求了一个转储,通过任务管理器生成。使用WEBBG,在执行命令!analyze -v
时,我可以看到许多其他的文本
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 0000000000000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0
我怎么知道它是不是对坠机事件负责?如果不是,我如何确定真正的原因?
使用 DML 自定义调试器输出
调试器标记语言 (DML) 提供了一种机制增强来自调试器和扩展的输出。 与 HTML 类似,调试器的标记支持允许将输出包括显示指令和额外非显示的标记窗体中的信息。 调试器用户界面,WinDbg 等中分析出提供在 DML 来增强所显示的信息,并提供新行为,如网格显示和排序的额外信息。 本主题介绍如何自定义使用 DML 您调试输出。
DML 是可用在 Windows 10 及更高版本。
DML 概述
上的 DML 的主要权益以提供链接到调试器输出中的相关信息的能力。 一个主要的 DML 标记的是<链接>标记用于指示是否可以通过链接访问与一种输出相关的信息输出生成者的说明操作。 为使用 web 浏览器中的 HTML 链接这样用户能够导航超链接的信息。
提供超链接内容的优点是,它可用于增强的调试程序和调试器扩展功能可发现性。 调试器和及其扩展插件包含大量的功能,但它可能很难确定要在不同的方案中使用的相应命令。 用户必须只需知道哪些命令可以用来在特定方案中使用。 用户和内核调试之间的差异会进一步增加复杂性。 这通常意味着许多用户不了解可帮助他们的调试命令。 DML 链接提供了任意调试命令来包装在备用的演示文稿,例如说明性文本,可单击的菜单系统或链接的帮助功能。 使用 DML,可以对命令输出来增强用户引导到适用于手头的任务的其他相关命令。
调试器 DML 支持
- 命令窗口在 WinDbg 中的支持所有 DML 行为,将显示颜色、 字体样式和链接。
- 使用颜色模式已启用,则返回 true 的控制台中运行时,控制台调试器 – ntsd、 cdb 和 kd – 仅支持 DML,和唯一的颜色属性。
- 通过重定向 I/O 的调试器,ntsd – d 或 remote.exe 会话不会显示任何颜色。
DML 内容规范
DML 不应为完整表示语言,如 HTML。 DML 是精心设计的非常简单,只有少量的标记。
由于并非所有调试器工具都支持多格式文本,DML 旨在允许 DML 和纯文本之间的简单转换。 这样,DML 所有现有的调试器工具中的函数。 可以轻松地支持颜色等效果,因为删除它们不会删除携带的实际信息的文本。
DML 不是 XML。 DML 不会尝试执行语义,也不是结构化信息。 如上所述,必须有一个简单之间的映射 DML 和纯文本,因此,DML 标记是所有可放弃。
DML 不是可扩展的;所有标记是预定义的并验证,以跨所有现有的调试器工具工作。
标记结构
类似于 XML,DML 标记可以作为起点<tagname [args] >并且下列</tagname>。
特殊字符
DML 内容大致遵循特殊字符的 XML/HTML 的规则。 字符 &、 <,>和"很特殊,不能使用以纯文本。 等效的转义字符的版本为 &、 <,>和"。 例如此文本:
"Alice 和 Bob 想 3 < 4"
将转换为以下 dml。
AeDebug中的“Ae”代表什么?
使用调试器标记语言
异常的保护机制
以栈作为基础的SEH本身具有很大的危险性,我们可以利用各种手段对栈上SEH节点进行覆盖重写,再次执行异常处理操作时就会将执行权给到了我们用来覆盖的函数上,这实际上在以前是很常见的windows栈溢出手段,当然,除了这种方法外还有许许多多的利用手段,可见这样的异常处理机制还是不够完善的。为了解决这些问题,微软逐步加入了Safe SEH、SEHOP、VCH等来弥补。
Safe SEH
SafeSEH又叫做软件DEP,是一种在软件层面实现的对SEH的保护机制,它需要操作系统和编译器的双重支持,在vs2013及以后的版本中会自动启用 /SafeSEH 链接选项来使用SafeSEH。也正是因为该项技术使得以往简单的覆盖异常处理句柄的漏洞利用几乎失效了
在加载PE文件时,SafeSEH将定位合法的SEH表的地址(如果该映像不支持SafeSEH的话则地址为0),然后是用共享内存中的一个随机数进行加密处理,程序中所有的异常处理函数的地址提取出来汇总放入SEH表,并将该表放入程序映像中,还会将将加密后的SEH函数表地址,IMAGE的开始地址,IMAGE的长度,合法SEH函数的个数,作为一条记录放入ntdll(ntdll模块是进行异常分发的模块)的加载模块数据内存中,每次调用异常处理函数时都会进行校验,只有二者一致才能够正常进行,该处理由RtlDispatchException() 开始,首先会经历两次检查,分别是:
- 检查异常处理链是否在当前的栈中,不是则终止
- 检查异常处理函数的指针是否指向栈,是则终止
通过两次检查后会调用RtlIsValidHandler() 来进行异常的有效性检查,08年的black hat给出了该函数的细节
BOOL RtlIsValidHandler( handler )
{if (handler is in the loaded image) //是否在loaded的空间内 {if (image has set the IMAGE_DLLCHARACTERISTICS_NO_SEH flag) //是否设置了忽略异常 returnFALSE;if (image has a SafeSEH table) //是否含有SEH表 if (handler found in the table) //异常处理函数地址是否表中 returnTRUE;else returnFALSE;if (image is a .NET assembly with the ILonl y flag set)returnFALSE;
}if (handler is on non-executable page) //handler是否在不可执行页上 {if (ExecuteDispatchEnable bit set in the process flags) //DEP是否开启 returnTRUE;elseraise ACCESS_VIOLATION;
}if (handler is not in an image) //handler是否在未加载空间 {if (ImageDispatchEnable bit set in the process flags) //设置的标志位是否允许 returnTRUE;else returnFALSE;
}return TRUE; /s/允许执行异常处理函数
}