[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测)

时间:2022-09-20 17:26:43
写在前面:      WIN10马上就要来了,随之而来的是VS2015;作为一个内核开发人员,微软大哥在”WDK7600“以后就不再提供独立的内核驱动开发包了,而是必须首先安装微软集成开发环境VS,然后再从微软官网下载集成的WDK开发包、或者离线安装包(地址:https://msdn.microsoft.com/zh-cn/windows/hardware/hh852365.aspx)
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image.png file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(1).pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(2).png[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 

安装WDK后,本人使用的是WDK8.1(VS2012配置的是WDK8.0,也可以配置WDK8.1,都是一样的,没有什么区别)无脑下一步安装完成后,建立新工程,即可看到新的驱动工程项目。
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(3).png

其中提供了很多的模板,(WDM WDF,KWDM等等),大家可能感觉这些框架形式很复杂,其实这些框架的区别,主要在于设备驱动开发,例如WDM相对NT增加了即插即用电源管理,WDF封装了WDM接口变成类形式,隐藏驱动设备等对象,其他的类似应用层驱动框架等(其实就是dll)。本人作为内核安全开发人员,大部分时候根本不涉及到那些框架提供的功能,而且新框架的封装隐藏了底层对象信息等,有时候不够*,让我们实现一些功能的时候不太方便,所以我们还是主要使用NT式驱动。

编写驱动:
    SO,第一个问题来了,WDK8.1提供的模板中根本没有提供NT驱动模板,我们如何创建NT驱动呢?
解决:其实虽然没有提供NT模板,但是我们可以建立WDM空模板工程,然后再自己添加文件,编译,得到的也就是NT驱动了
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(4).png

建立工程后,首先会有两个工程,一个就是驱动工程,另外一个是package工程(这个是测试驱动安装的一个工程,对于我们来说其实没有什么用处,反正本人是没有使用过得,可以直接删除)。驱动工程中会帮你建立一个inf文件,NT是使用不到的(当然新一代的过滤驱动,例如 minifilter 是使用的,VS2013支持直接创建minifilter工程),可以直接删除。我们直接添加一个Driver.c(有很多人说使用C++开发驱动,但是本人还是觉得使用c开发比较适合,因为微软内核使用的也是C,而且C是能够直接操作内存,汇编之上的个人感觉最好的语言)添加一些简单的代码。
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(5).png
下面,编译,报错。。。。。没有关系,查看出错原因,无外乎一些警告被当做错误,或者一些函数参数没有被使用,导致编译不过,这些都是因为安全警告等级太高了,我们可以分两种方式解决:
(一) 将所有的警告和安全措施,全部都做到,例如没有使用的参数使用宏UNREFERENCED_PARAMETER等等,当然做到这些,有时候基本没有办法写程序
(二) 降低警告等级哦,
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(6).png
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(7).png
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 

好了,我们再次尝试编译,编译过了。
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(8).png

调试驱动:
    VS2013提供集成IDE调试驱动,网上面有很多配置调试环境的帖子,在这里我先啰嗦解释两句:
(一) VS2013 调试启动,首先需要建立一个调试机工程
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(9).pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(10).png
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
(二) 选择添加一个目标计算机(Add New Computer),点击下一步,能够选择多种目标计算机类型,例如:
第一项Prevision Computer and Automatically Configura Debuggers:选择一个远程的真机,VS会在远程计算机上安装调试工具,设置调试环境,会重启几次。
第二项Provision Computer and choose debugger setting和第三项:可以自己选择调试方式(网络,串口,1394,USB)。即使不是使用网络进行调试,也要使用网线连接调试机和被调试机,因为VS在配置环境的时候需要使用网络进行配置和传输文件。


在这里我选择使用第三项,并且配置串口调试,因为,以前我们使用Windbg的时候也是配置串口调试的。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(11).png
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
OK,到这里,总结一下,我们能够编译驱动,然后直到调试驱动需要创建一个目标计算机,目标计算机可以是真机,也可能是虚拟机,当然现在不能证明。因为微软大哥告诉我们说,VS2012以后,不支持xp平台驱动编译,这个我们在选择驱动编译环境的时候,我们也看到了。file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(12).png完全就没有xp, [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) OK不要紧,那我们先使用win7 32来调试实验下,启动虚拟机,不做任何设置,然后vs工程中我们直接像调试应用一样F5
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(13).png

没有任何反应,虚拟机也没有断下来(也是,VS哪有那么智能,能够自动识别虚拟机),查了半天网上的资料,虚拟机需要设置端口哦,好的,按照网上的配置,虚拟机中添加一个虚拟串口(\\.\pipe\com_1),因为虚拟机中自带的虚拟打印机,占用虚拟串口一,所以,你有两个选择,一个删除该虚拟打印机,一个,添加别的虚拟串口(例如:\\.\pipe\com_2),这里,我选择的是删除虚拟打印机。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(14).pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(15).png
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
好的,虚拟机已经开启了串口监听,再次启动虚拟机,我们再次F5调试
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(16).png

好吧,还是和原来,一样,怎么这个样子,又是一轮网上查资料,说什么的都有,类似下面的..........................................等等。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(17).pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(18).png
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
但是,以上种种,我均没有配置成功和测试成功,why?


此时我注意到一个细节。
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(19).png
就是Debugger Immediate Window 窗口里面看着真是眼熟,我去,这个不就是WinDbg吗,那么难道VS2013里面是利用Windbg调试的?????,好吧,我们在这里大胆的猜测下,那么就好办了,以前我们如何配置Windbg调试虚拟机呢,这个网上资料一大把,好吧,我就多说一些。


==========================WIn7 配置Windbg虚拟机内核调试===========================
第一步,虚拟机中配置串口(和上面一样,虚拟机中开放出一个虚拟管道串口,哈哈,和上面一样哦,原来越有信心了)。
第二步,虚拟机中的系统开启调试选项,因为Win7不像XP,需要手动开启调试选项:
2.1 在bootmgr中下断点:
在 vista 及后续的 windows 已经取消了 ntldr 模块管理引导,转而以 bootmgr 模块管理引导系统。在我的 windows 7中要设定在哪个部分进行调试。windws 7 可调试部分有 4 个:bootmgr 模块、winload 模块、WinResume 模块以及 windows 内核模块 Nt 模块

可以在上述的 4 个模块下断点进行调式
(1) 以管理员身份运行“命令提示符”
(2) 在“命令提示符”窗口中,输入以下命令:


bcdedit /set {bootmgr} bootdebug on
bcdedit /set {bootmgr} debugtype serial
bcdedit /set {bootmgr} debugport 1
bcdedit /set {bootmgr} baudrate 115200



注意一个细节,bcdedit /set {bootmgr} debugport 1这一行最后的1 对应Serial Port 1,
所以如果是Serial Port 2 则设置为bcdedit /set {bootmgr} debugport 2 否则连不上。



在提示命令成功后,这样就在 windows7 中的 bootmgr 模块建立起可调试的机制。
在运行 windows7 时到达 bootmgr 时就停止加载,vmware 中是黑屏,它正等待 serial port 的响应,
运行 windbg 后,windbg 就和 windws 7 中的 bootmgr 建立起联线了

[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 

2.2 在 winload 模块下断点:
做好了上面的配置,可以使用命令  "bcdedit /enum" 命令,查看当前可用模块GUID
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
看到了,我们刚才设置的哦

2.3 在内核模块 Nt 模块下断点:
WIN+R 打开运行输入msconfig打开启动配置对话框设置调试,请按照图片设置
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
至此虚拟机中的操作系统也设置好了,重启后生效。
===========================================================================

WIN7 Windbg虚拟机配置好了,以前我们使用Windbg的时候,我们就可以启动Windbg来连接虚拟机串口来调试了,在这里多说一句,网上有个人说,VS2013调试虚拟机中还需要安装,X:\Windows Kits\8.1\Remote\x64目录下的WDK Test Target Setup x64-x64_en-us(视虚拟机系统位数判断,32位系统请到x32下找相应文件)。
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
但是,我们Windbg的时候,可没有安装这个哦,那我们先不安装这个试试。
过程很慢,很慢,我一度以为卡死了,等了半天,不过终于过去了,此时点击暂停,又是很久,VS甚至提示了,不过只有第一次才这个样子哦
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) [内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
我们单步调试一下吧
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
看到了,单步调试正常,寄存器显示正常,命令窗口,输入命令正常,ok,这明显的,我们调试成功了。

那么我就大胆的确认了,VS2013调用的还是Windbg调试内核,只是在外面包了一层,其实本质都是一样哦。


下面一个新的问题,都说VS2013不能够调试xp,编写的驱动不能够在xp运行,但是Windbg可以调试xp,而WDK的版本更新只是库的更新,我们真的不能够在xp下运行吗????


首先,我们还是按照Windbg配置虚拟机,来配置虚拟机
==========================WInXp 配置Windbg虚拟机内核调试==========================
第一步,还是开启虚拟调试串口,和win7一样。
第二步,配置虚拟系统中的 "boot.ini"的启动项:
如何编辑boot.ini: “开始--运行”,运行窗口上键入 sysdm.cpl,然后单击“确定”。  在“高级”选项卡上,单击“启动和故障恢复”下的“设置”。在“系统启动”下,单击“编辑”,这样即可对boot.ini文件进行编辑了。
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
在boot.ini中加入:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /fastdetect /debugport=com1 /baudrate=115200
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 
XP中不需要msconfig允许调试选项,至此配置完成,重启选择,Microsoft Windows XP Professional Debug启动项即可。


===========================================================================


ok,我们试试F5吧,ok连接上了,当然,第一次还是很慢很慢,但是我们还是连接成功了。
[内核编程] VS2013 WDK8.1 开发,调试驱动(xp win7 亲测) 

这证明,VS2013是可以调试xp的哦,编写的驱动,也不一定不能够在xp下运行哦。


总结一把:
不管集成工具越出越新,但是内核环境一直都没有大的改变,只是增加一些安全机制,修改一些原始结构,提高效率等(Win10不知道,没有资格发言),新的工具,配置越来越傻瓜化,但是他们底层利用的都是原始的调试工具,老的调试工具,我们都能使用的顺畅,新的工具,我们更能使用的顺畅,万变不离其宗。同样,编程也是一样,作为驱动开发人员,内核底层的机制变化不大,都是向下兼容的,我们初步了解的时候,可能很困难,但是一旦了解,以后的变化,学习将变得相对简单,万事开头难,坚持必成功