首页 > 代码库 > Windows Kernel Way 1:Windows内核调试技术

Windows Kernel Way 1:Windows内核调试技术

掌握Windows内核调试技术是学习与研究Windows内核的基础,调试Windows内核的方式大致分为两种:

(1)通过Windbg工具在Windows系统运行之初连接到Windows内核,连接成功之后便可以调试,此时即可以调试Windows内核启动过程,又可以在Windows启动之后调试某内核组件或应用程序。或使用Windbg的Kernel debugging of the local mechine功能,在Windows系统完全启动之后,调试Windows内核组件或应用程序。这种方式需要配置Windows系统以DEBUG模式启动。

(2)通过Bochs来运行Windows系统,可以在Windows运行的任意时刻调试任意信息,但最大的缺点就是,这种方式目前不支持使用Windows Symbols,与第一种方式相比,汇编代码读起来并不直观。

本文介绍方式(1)即通过Windbg工具调试Windows内核。

1、Windbg工具简介及获取方式

Windbg工具是微软团队开发和公布的一款专门用于调试Windows内核及应用程序的调试器,既支持内核级(Ring0)调试,也支持应用程序级(Ring3)调试。如今的Windows系统调试器有多种,出了Windbg以外,还有Olldbg、Immunity Debugger等。Olldbg和Immunity Debugger不支持内核级调试。

Windbg工具包含在Windows Driver Kit(WDK,Windows驱动开发包)中,当然也可以单独下载。

(1)如果要通过WDK方式获取的话,Windows XP及之前的环境只要下载WDK即可,整个资源大约300M~500M,但是在Windows Vista/Windows 7等系统之后,微软将WDK与Visual Studio环境集成到一起,因此整个下载资源大约6.0G~7.0G。由于Windows XP系统不再支持,并且笔者的实验环境为Windows 7系统,在后续的文章中也会涉及到Windows驱动开发,所以笔者建议下载WDK与VS集成包,虽然资源比较大。

(2)如果只是暂时学习Windows内核调试的话,可以单独下载Windbg工具,整个资源大约150M。

以上资源皆可以在MSDN上获取,获取链接为:http://msdn.microsoft.com/zh-cn/windows/hardware/hh852365.aspx

2、Windows Symbols简介及获取方式

Windows Symbols是微软公开的Windows系统符号表,使用Windbg调试WIndows内核和应用程序时可以很直观地看到部分变量名称、结构体结构、函数名称等。

Windows Symbols可以直接在MSDN上获取,其获取页面与上述给出的获取Windbg工具的页面链接相同。

但是笔者不建议直接下载并安装Windows Symbols,因为在使用Windbg工具调试时,可以根据需要即时获取相关模块的符号信息(如果网络正常的话)。

3、Windows内核调试方法

通过虚拟机调试Windows系统是种常见的方式,即首先搭建虚拟机环境,即将Windows系统安装在虚拟机中,然后配置虚拟机Windows系统的启动模式为DEBUG模式,并且配置好Windbg工具与虚拟机Windows系统之间的通信通道,在Windbg进入等待调试通信的时候,重启虚拟机Windows系统,双方的调试链接建立以后,即可使用Windbg工具调试/控制Windows内核,详细步骤如下:

(1)配置虚拟机Windows系统以DEBUG模式启动。

进入虚拟机Windows系统,以管理员身份运行cmd.exe,执行以下命令:

bcdedit /debug on    //启用Windows内核调试支持

bcdedit /bootdebug on  //启用应用程序的启动过程调试支持

关于bcdedit命令的详细信息,可以在MSDN中了解:http://msdn.microsoft.com/zh-cn/library/dn653986(v=vs.85).aspx

上述方式仅在Windows Vista/7系统及以后版本的Windows系统中有效,如不做特殊说明,笔者的实验环境默认为VirtualBox/Windows 7系统。

对于Windows XP系统的配置,请自行GOOGLE。

(2)配置Windbg与虚拟机Windows系统的调试通信通道。

关闭虚拟机Windows系统,在虚拟机“串口配置”中,启用某个串口,比如COM1,并将该串口的端口模式设置为“主机管道”,并选择“创建通道”,在“端口/文件位置”中输入待创建的虚拟的管道设备名称,比如“\\.\pipe\comdbg”(注意格式,“comdbg”名称用户自定义):

技术分享

打开Windbg,在“Kernel Debug”(Ctrl+K)对话框的“COM”标签页中将“Port”也配置为“\\.\pipe\comdbg”:

技术分享

点击确定后,Windbg进入尝试与目标建立通信通道状态:

技术分享

此时启动虚拟机的Windows系统,一段时间以后,调式通信通道建立成功:

技术分享

此时,在Windbg中按快捷键“Ctrl+Break”即可中断虚拟机Windows的启动/运行过程(第一次一般会下载符号表,需要耐心等待):

技术分享

此时便可以输入各种调试指令,比如输入“g”命令就可以继续虚拟机Windows的运行过程。

由于Windbg的内核调试指令与Windows内核原理相关,所以在后面的Windows内核原理分析时会详细说明Windbg使用及相关指令。

Windows Kernel Way 1:Windows内核调试技术