现在的位置: 首页 > 综合 > 正文

读书笔记_windows内核调试_part 2_内核对话过程

2013年02月03日 ⁄ 综合 ⁄ 共 1419字 ⁄ 字号 评论关闭

 

内核对话

Windows启动内核调试后,主要做了以下几个工作

1.  建立连接

2.  调试器读取目标系统信息,初始化调试引擎(目标机)。

3.  内核调试引擎通过状态变化信息包通知调试器加载初始模块的调试符号(目标机)。

4.  调试器端发送中断包,将目标系统中断到调试器,交互调试后又恢复执行的过程。

5.  因断点命中,目标系统中断到调试器的过程。

6.  内核中的模块输出调试字符串(DbgPrint)到调试器

《软件调试》(490-491)总结的表如下:

 

内核调试引擎

内核调试引擎相当于再目标系统中进行调试的一个代理,调试引擎代表调试器来访问和控制目标系统。

内核调试的几个关键函数:

KdEnterDbugger

它用于冻结内核,调用后首先会禁止中断,对于多处理器的系统,它会将当前CPU的IRQL升高到HIGH_LEVEL并冻结所有的其他的CPU。锁定调试调试通信端口,调用KdSave让通信扩展模块保存通信状态,并将全局变量KdEnteredDebugger设置为真。当KdEnterDebugger执行后,整个系统进入一种简单的单任务状态,当前的CPU只执行当前的线程,其他CPU处于冻结状态。

KdExitDebugger 恢复内核运行,主要工作有调用KdRestore让通信扩展模块恢复通信状态,对锁定的通信端口解锁。调用KeThawExecution来恢复系统进入正常的运行状态,包括恢复中断,降低当前CPU的IRQL,对多CPU系统,恢复其他CPU。

KdpReportExceptionStateChange CPU报告异常类状态变化

KdpReportLoadSymbolsStateChange CPU报告符号加载类异常

KdpSendWaitContinue 函数用来发送信息包,与调试器对话。

KeUpdateSystemTime函数在每次更新系统时间时会检查全局变量KdDebuggerEnable来判断内核调试引擎是否被启动,如果为真则调用KdPollBreakIn函数来查看调试器是否发送了终端命令,如果是,则调用DbgBreakPointWithStatus触发断点异常,中断到调试器。

kdpTrap来处理内核态的异常。当内核态中发生异常时,KiDispatchException函数会调用全局变量KiDebugRoutine所指向的函数。当调试引擎启用时,这个变量的值是函数KdpTrap的地址。所以一旦异常发生时,系统就会调用KdpTrap。KdpTrap调用KdpReport向调试器报告异常。

KiSaveProcessorControlState保存CPU的控制状态

KiRestoreProcessorControlState恢复CPU状态

DbgPrint,DbgPrintEx,vDbbgPirntEx打印调试信息

 

下面简单介绍一下本地内核调试:

除了可以进行两个系统间的内核调试外(包括虚拟机),还可以在本地进行内核调试,但建议在本地进行内核调试时尽量做一些观察变量或检查符号之类的简单任务。

除了windbg外还有一个小软件LiveKD可以用于本地内核调试,它可以在保持系统工作的情况下产生一个转储文件,然后利用Windbg进行分析。

WinDbg的本地内核调试主要是通过未公开的内核服务zwSystemDebugControl来提供的,zwSystemDebugControl为WinDBG提供了一种在本地访问内核调试API的功能。

 

【上篇】
【下篇】

抱歉!评论已关闭.