Windows内核编程(五)-驱动的调试

4 篇文章 0 订阅

驱动的调试

为了安全起见,驱动调试应该在虚拟机中进行,本书中所有提及的驱动调试,都是指通过Vmware(或其他虚拟机)运行一个虚拟机操作系统,在该操作系统中运行被调试的驱动,开发者在物理机器上使用内核调试工具(如 Windbg),通过网络、USB、串口、1394等方式连接到虚拟机操作系统,进行驱动调试。为了表述清晰,下面把物理机器称为调试机器,把运行被调试驱动的虚拟机称为被调试机器。

基于VS + WDK环境调试

调试环境

调式机器:Windows 10 WDK10
调式机器IP:192.168.0.110
虚拟机:vmware 16
被调式机器:Windows 10
被调式机器IP:192.168.247.129

两台机器的IP必须是互通的,如果ping不同请检查防火墙的入站规则,打开以下两项在这里插入图片描述

配置被调式机器

在被调试机器中:以管理员权限运行cmd(命令提示符),在命令中输入:bcdedit /debug on,然后回车。这条命令的作用是把被调试机器设置成调试模式。
在这里插入图片描述

在命令行中输入:bcdedit /dbgsettings net hostip:192.168.0.110 port:50010 并回车,这条命令的意思是使用网络进行调试的连接方式,hostip指调试机器的IP,在笔者电脑上是192.168.0.110 ,port表示所使用网络的端口,建议范围是49152 至65535,笔者指定的端口为50010。在上面的命令执行完之后,cmd命令行上会显示一个Key,读者需要保存这个Key,用于后面调试机器的配置。
在这里插入图片描述
以上就是被调试机器的配置,下面为读者介绍调试机器的配置,首先打开VS,在VS菜单栏中找到“Driver”,在“Driver”的下拉菜单中找到“Test”→“Configure Devices”,如图所示。
在这里插入图片描述
在这里插入图片描述
点击“Add New Device”弹出的配置对话框,在“Display name”下面输入设备的名字,例如:MyDevice;在Network host name下面输入被调试机器的hostname,也可以输入IP,在本例中,笔者输入被调试机器的IP;在最后一项Provisioning Options中,选择第二项“Manually configure debuggers and do not provision”,意思是说手动配置被调试机器的调试选项以及手动分发驱动文件。整体配置完成后如图所示。
在这里插入图片描述

完成配置后请点击“下一步”按钮,进入“configure debugger settings”配置页,在“Windows Debugger – Kernel Mode”下面,找到“Connection Type”,在下拉框中选择“Network”;在“Port Number”中填入被调试机器中配置的端口值50010;在“Key”中填入被调试机器中生成的Key,本例中Key为14lmsrfrbt8or.1atk4n7oehhyc.ta6470s5hu20.1ch1jab41ul2d;在HostIp中填入调试机器的IP,本例为192.168.247.129;如果被调试机器只有一个网卡,最后一个“bus Parameters”可以不填,否则需要根据PCI规范,填入相应设备的总线号(Bus number)、设备号(Device Number)以及功能号(Function number),笔者的被调试机器只有一块网卡,所以这个值留空,如下图所示。完成配置后点击“完成”按钮。这样就完成了VS的配置。

在这里插入图片描述
在这里插入图片描述

一切准备妥当后,下面准备以前面MyDriver驱动来作为调试对象,开始调试前,首先修改一下MyDriver驱动的入口函数,在DriverEntry入口函数中加入一个断点KdBreakPoint(),这样当MyDriver运行的时候,就会在DriverEntry触发这个断点而停止下来,这是一个常用的技巧。
请注意,KdBreakPoint只对Debug版的驱动有效,如果需要对Release版本的驱动放置断点代码,请使用DbgBreakPoint。修改后的DriverEntry函数如下:
在这里插入图片描述
首先对MyDriver工程进行编译,生成MyDriver.sys文件,然后在VS菜单中,找到“调试”→“附加到进程”,在弹出的对话框中,选择“连接类型”为“Windows Kernel Mode Debugger”,“连接目标”选择为刚才我们配置好的MyFirstDevice,在“可用进程”中选择“Kernel”,如下图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
单击“附加”按钮后,会在VS界面上弹出一个“Debugger Immediate Window”界面,界面上显示:
在这里插入图片描述
这表示当前调试器使用网络连接方式,正在等待被连接。接下来重启被调试机器,让被调试机器的调试设置生效。
被调试机器在重启过程中,会主动连接设置的50010端口,连接建立好之后,可以在VS的“Debugger Immediate Window”中看到如下图所示的信息。
在这里插入图片描述
最后请把MyDriver.sys文件放入被调试机器中,然后根据前面介绍的sc create、sc start等命令运行该驱动,由于驱动的DriverEntry函数中被放置了断点KdBreakPoint,所以在执行到KdBreakPoint时调试器会中断下来,如下图所示。
读者可以在上图界面中按下F10单步调试驱动代码,非常方便。
以上是VS调试驱动的基本步骤,请读者务必亲自操作一遍。在上面的配置当中,笔者选择的是“Manually configure debuggers and do not provision”方式,另外一种方式为“Provision device and choose debugger settings”,这种方式需要在被调试机器中安装一套调试工具,配置起来相对麻烦,由于篇幅有限,这里不再赘述,请感兴趣的读者自行研究。

在这里插入图片描述

基于Windbg调试

基于Windbg工具。实际上通过VS调试驱动,内部也是基于Windbg的内核。

如果读者安装较新版的WDK,可以在WDK的安装目录中找到Windbg,笔者把WDK安装在D:\Windows Kits目录下,则64位的Windbg位置为:D:\Windows Kits\10\Debuggers\x64\Windbg.exe;32位的Windbg位置为:D:\Windows Kits\10\Debuggers\x86\Windbg.exe。

如果读者安装较老版本的WDK,WDK内不包含Windbg,可能需要到微软的官方网站下载独立的Windbg安装包。

上面介绍了如何通过网络作为介质连接调试机器与被调试机器,下面换一个方式,选用串口(COM口)作为连接介质。

。在被调试机器内,以管理员权限打开cmd(命令提示符),然后输入:
bcdedit /debug on 并按“回车”键,接着输入:bcdedit /dbgsettings serial baudrate:115200 debugport:2并按“回车”键。第一条命令读者应该很熟悉了,表示把机器设置成调试模式,第二条命令是设置通过串口2来作为连接介质,串口的波特率为115200。命令执行完之后如下图所示。
在这里插入图片描述
使用bcdedit的方法配置调试,只适用于Vista及以上系统,对于Vista以下的系统(如XP),需要通过修改boot.ini文件,在系统盘(一般是C盘)中找到boot.ini文件,以记事本的方式打开,在[operating system]下面直接修改启动参数,下面给出一个示例:

[boot loader]
timeout=30
default=multi(0)disk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDWOS="WINDWOS XP Debug" /fastdetect /debug /debugport=com2 /baudrate=115200

上面介绍的是在现有的启动项上修改启动参数,在某些场景下,还可以通过bcdedit(XP下是boot.ini文件)增加一个启动项,新增的启动项用于调试。由于本例中的虚拟机的直接用途就是调试,所以直接修改现有的启动项即可。

配置完成后,请关闭虚拟机内的操作系统,然后在Vmware的配置界面,新增一个串口设备,设置该串口使用“命名管道”,名字为:\.\pipe\com_2,具体配置如图所示。
在这里插入图片描述

被调试机器所需的设置已经全部完成。接下来开始配置Windbg,首先找到Windbg.exe文件所在的目录,请参考本节前面所提及的位置,在笔者电脑上是D:\Windows Kits\10\Debuggers\x64\Windbg.exe,然后右键点击Windbg.exe文件,选择“发送到”→“桌面快捷方式”。在桌面上找到Windbg的快捷方式,点击右键,选择“属性”,在“快捷方式”分页下,找到“目标”,填入:“D:\Windows Kits\10\Debuggers\x64\Windbg.exe” -b -k com:pipe,port=\.\pipe\com_2,resets=0。Windbg启动后会去连接\.\pipe\com_2管道。
一切准备就绪后,首先开启虚拟机,然后打开桌面的Windbg快捷方式,稍微等待一下,Windbg就可以连接上被调试机器了,如图所示。
在这里插入图片描述

与VS调试驱动类似,请读者把MyDriver.sys放在被调试机器的系统中,如C:\MyDriver.sys,然后通过sc create、sc start命令启动驱动,驱动执行入口函数中的KdBreakPoint会中断到Windbg中,如图所示。
在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 《寒江独钓Windows内核编程源码》是一本非常经典的内核编程书籍。该书主要介绍了Windows内核的结构和工作原理,以及如何进行内核编程。作者通过自己的实践经验,深入浅出地解释了内核编程的基本原理和技巧。 该书的主要内容包括:Windows内核架构、内核模式和用户模式编程驱动程序开发、处理器管理、内存管理、进程和线程管理、设备驱动程序、文件系统等。通过学习这些内容,读者可以全面了解Windows内核的各个方面,并具备进行内核编程的基础知识和技能。 内核编程是一项非常高级和复杂的技术,需要读者具备扎实的操作系统和编程基础。《寒江独钓Windows内核编程源码》提供了丰富的源码示例和实践案例,帮助读者加深对内核编程的理解,并能够在实践中掌握内核编程的各种技巧和方法。 通过学习该书,读者可以深入了解Windows内核的工作原理和开发方法,提升自己的技术水平,并有可能在内核开发领域取得突破。同时,该书也适合作为操作系统课程的参考书籍,帮助读者更好地理解操作系统的底层原理和设计思想。 总之,《寒江独钓Windows内核编程源码》是一本值得学习的经典书籍,通过学习该书,读者可以从理论和实践两个方面全面提升自己的内核编程能力。 ### 回答2: 寒江独钓Windows内核编程源码,这是指在Windows操作系统内核级别的编程过程中,个人独自执钓的情景。在传统的Windows内核编程中,需要深入理解Windows操作系统的内部机制、数据结构和调度算法,并通过编写驱动程序或者修改系统核心源码来实现特定的功能或解决某些问题。这是一项相当具有挑战性和专业性的技术领域。 寒江者,指的是独自一人默默钓鱼的情景。在这个比喻中,内核编程者是在深入学习和专研Windows内核编程的过程中,独自探索和解决问题,就像在江边的一个人默默地捕捞。 Windows内核编程源码指的是Windows操作系统的核心代码。对这些源码的学习和理解,是了解Windows操作系统内部工作原理的关键。通过研究内核编程源码,我们可以了解系统如何管理进程、内存分配、文件系统等功能,以及与硬件的交互过程。 进行寒江独钓Windows内核编程源码可以带来许多好处。首先,它可以深入了解Windows操作系统的底层工作原理,从而更好地进行系统调试和性能优化。其次,它可以为用户定制和开发高性能的驱动程序,提升系统的稳定性和响应能力。此外,通过研究内核编程源码,可以了解Windows操作系统的安全性和漏洞,从而更好地防范和解决安全问题。 然而,寒江独钓Windows内核编程源码并不是一项简单的事情,它需要对操作系统原理、编程语言和底层架构有深入的理解。同时,需要拥有扎实的计算机科学基础和编程技巧,以及耐心和毅力来解决各种挑战和问题。 总之,寒江独钓Windows内核编程源码是一项有挑战性的技术活动,通过对Windows操作系统内核代码的深入研究和理解,可以提高对系统的控制和优化能力,从而为用户提供更好的系统性能和功能。 ### 回答3: 《寒江独钓Windows内核编程源码》是一本关于Windows内核编程的书籍,作者以“寒江独钓”来形容自己在Windows内核编程领域的独孤求败之意。这本书主要介绍了Windows操作系统的内核编程细节和原理。 在这本书中,作者首先介绍了Windows内核的基本概念和架构,包括进程和线程管理、内存管理、驱动程序开发等。接着,作者深入讲解了Windows内核的各个模块和重要组件的实现原理,如调度器、文件系统、网络协议栈等。读者可以通过学习这些源码,深入理解Windows内核的工作原理和设计思想。 《寒江独钓Windows内核编程源码》不仅仅是一本理论性的书籍,更重要的是它提供了丰富的源代码示例和实践案例,读者可以通过实际的代码实现和调试来加深对内核编程的理解。同时,本书还特别注重实用性,提供了大量的编程技巧和调试技巧,帮助读者快速掌握Windows内核编程的方法和技巧。 总之,《寒江独钓Windows内核编程源码》是一本全面而深入的Windows内核编程技术书籍,适合那些对Windows系统内核感兴趣的程序员和操作系统开发者阅读。通过学习这本书,读者可以系统地学习Windows内核编程的原理和实践,提升自己的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值