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内核调试技术的更多相关文章
- linux内核调试技术之printk
		
原创博客:欢迎转载,转载请注明出处https://i.cnblogs.com/EditPosts.aspx?postid=6218383 1.简介(基于s3c2440 linux) 在内核调试技术之中 ...
 - Linux内核调试技术——jprobe使用与实现
		
前一篇博文介绍了kprobes的原理与kprobe的使用与实现方式,本文介绍kprobes中的另外一种探測技术jprobe.它基于kprobe实现,不能在函数的任何位置插入探測点,仅仅能在函数的入口处 ...
 - Windows下反(反)调试技术汇总
		
反调试技术,恶意代码用它识别是否被调试,或者让调试器失效.恶意代码编写者意识到分析人员经常使用调试器来观察恶意代码的操作,因此他们使用反调试技术尽可能地延长恶意代码的分析时间.为了阻止调试器的分析,当 ...
 - Linux Kernel - Debug Guide (Linux内核调试指南 )
		
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
 - linux内核调试技术之修改内核定时器来定位系统僵死问题
		
1.简介 在内核调试中,会经常出现内核僵死的问题,也就是发生死循环,内核不能产生调度.导致内核失去响应.这种情况下我们可以采用修改系统内核中的系统时钟的中断来定位发生僵死的进程和函数名称.因为内核系统 ...
 - linux内核调试技术之自构proc
		
1.简介 在上一篇中,在内核中使用printk可以讲调试信息保存在log_buf缓冲区中,可以使用命令 #cat /proc/kmsg 将缓冲区的数区的数数据打印出来,今天我们就来研究一下,自己写k ...
 - Windows Kernel Way 扉言
		
七年寒窗,但求一道. 笔者在学习windows/linux以及各类编程语言.框架之初因摸不到门路而磕磕绊绊,因寻不到明师而步履蹒跚,或不知缘从何起,或不知路在何处,只能尝试.回溯.重来.反反复复,竟也 ...
 - Windows Kernel Security Training Courses
		
http://www.codemachine.com/courses.html#kerdbg Windows Kernel Internals for Security Researchers Thi ...
 - [微软官网]One Windows Kernel
		
One Windows Kernel https://techcommunity.microsoft.com/t5/Windows-Kernel-Internals/One-Windows-Kerne ...
 
随机推荐
- Codeforces Round #140 (Div. 1) D. The table 构造
			
D. The table 题目连接: http://www.codeforces.com/contest/226/problem/D Description Harry Potter has a di ...
 - 【JavaScript】深入理解JavaScript之强大的原型和原型链
			
由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链. AD: hasOwnProperty函数: hasOw ...
 - impdp的一些实际问题解决方法
			
之前在http://blog.csdn.net/bisal/article/details/19067515写过一篇关于expdp和impdp的实践的帖子.今天碰到个问题,有些内容没有介绍全,这里再补 ...
 - 云服务器 ECS Linux 系统中常见的日志文件介绍
			
云服务器 ECS Linux 系统中,日志文件是非常重要的文件,它们记录了很多系统中重要的事.Linux 系统中常见日志文件概述如下: /var/log/cron可以在 cron 文件中检查 cron ...
 - KFC数据测试hbase结果
			
两个field,一个是KFC数据 一个列放的内容是“same” 每条数据都flush SLF4J: Failed to load class "org.slf4j.impl.Static ...
 - 迷你MVVM框架 avalonjs 0.81发布
			
本版本最大的改进是将视图的操作全鄣变成异步.详情如下: 管道符与短路与相混淆的BUG 重构on绑定,省得每次都重复绑定同一个事件回调.虽然addEventListener或attachEvent会忽略 ...
 - UNIX/Linux网络编程基础:应用层协议简介
			
目录 1.HTTP协议 2.FTP协议 3.TELNET协议 4.NFS协议 1.HTTP协议 应用层协议HTTP协议是Web的核心.HTTP协议在Web的客户程序和服务器程序中得以实现,运行在不同系 ...
 - SquashFs工具制作
			
下面是SquashFs.tar.gz的下载地址,解压后,直接执行其中的Makefile即可. SquashFs.tar.gz 说明: 制作squashfs格式的压缩镜像: ./mksquashfs . ...
 - No Entertainment!
			
今天决定去打印一个“No Entertainment”的横幅,贴在电脑的旁边.这其实是很久以前的事了,却搁浅到了现在.也正因为如此,今天想起来也觉得格外刻不容缓,内心好似义愤填膺,便写下这愤慨的独白. ...
 - js正则表达式验证账号手机号电话邮箱
			
1.账号 规则:字母.数字.下划线组成,字母开头,4-16位. 表达式:/^[a-zA-z]\w{3,15}$/: 2.手机号 规则:11位数字,以1开头 表达式:/^1\d{10}$/ 3.电话号码 ...