使用VS2013搭建内核开发环境并使用VS2013自带的WinDbg双机调试有源码的驱动程序

DemonGan

发布日期: 2019-02-09 11:38:26 浏览量: 1066
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

背景

想要学习内核 Rootkit 开发,那么第一件事就是要搭建好开发环境,第二件事情就是要了解如何调试驱动代码。这两点区别,和使用 VS2013 开发应用程序完全不同。在内核下,我们使用的是 WinDbg 来双机调试。所谓的双机调试,就是指有两台计算机,一台计算机上面运行要调试的程序,另一台计算机上面运行 WinDbg 来调试程序,两台计算机之间可以通过串口通信。

本文介绍的是使用 VS2013 开发环境开发驱动程序的环境配置,以及使用 VMWare 虚拟机搭建双机调试环境,实现使用 VS2013 开发环境自带的 WinDbg 调试开发的有源码的驱动程序。现在,我就把实现过程整理成文档,分享给大家。

实现过程

使用 VS2013 开发驱动程序

VS2013 要进行驱动开发,必须先安装 WDK8.1,可以在 微软驱动开发官网 上进行下载。注意,下载的 WDK 一定要对应自己的 VS 版本,VS2013 就下载 WDK8.1。

安装完毕 WDK8.1 之后,我们就可以使用 VS2013 创建驱动项目工程,开发驱动程序了。具体的步骤为:

1.运行 VS2013 开发环境,点击菜单栏“文件” —> “新建” —> “项目” —> “模板” —> “Visual C++” —> “Windows Driver” —> “Empty WDM Driver”。要注意的是,WDK8.1 提供的模板中没有提供 NT 驱动模板,但是我们可以新建 WDM空模板 工程,然后向工程项目中添加头文件、代码文件,编译链接之后,生成的驱动程序就是 NT 驱动了。

2.建立工程后,首先会有两个工程,一个就是驱动工程,另外一个是 Package 工程(这个是测试驱动安装的一个工程,对于 NT 驱动来说其实没有什么用处,可以直接删除)。驱动工程中会帮你建立一个 inf 文件,NT是使用不到的(当然新一代的过滤驱动,例如 Minifilter 是使用的,VS2013 支持直接创建 Minifilter 工程),可以直接删除。

3.由于创建的是一个空项目,所以需要我们自己手动添加代码文件。直接添加一个Driver.c(有很多人说使用C++开发驱动,但是个人还是觉得使用 C 开发比较适合,因为微软内核使用的也是 C,而且 C 是能够直接操作内存。),并声明头文件、编写入口点函数 DriverEntry:

4.接下来,编译驱动代码,报错。没有关系,查看出错原因,无外乎一些警告被当做错误,或者一些函数参数没有被使用,导致编译不过,这些都是因为安全警告等级太高了,我们可以分两种方式解决:
一是将所有的警告和安全措施,全部都做到。例如没有使用的参数使用宏UNREFERENCED_PARAMETER等等。要做到这些,有时候基本没有办法写程序。
二是降低警告等级。具体步骤为:

1.打开项目属性页;

2.C/C++ —> 常规 —> 警告等级选择“等级3(/W3)” —> 将警告视为错误选择“否(/WX-)”;

3.链接器 —> 常规 —> 将链接器警告视为错误选择“否(/WX:NO)”;

4.Driver Signing —> General —> Sign Mode 选择“Off”。

设置完毕后,再编译链接驱动代码,成功生成 .sys 驱动程序。接下来,我们就开始讲解 WinDbg 双机调试。

双机调试

VMware虚拟机设置

1.打开相应 WMware 虚拟机上的 “Edit virtaul machine settings”。

2.“Hardware”选项中 —> 点击“Add”,添加一个串口设备 Serial Port 。如果有打印机(Printer)存在,则先移除虚拟机的 打印机 硬件,然后再添加串口设备 Serial Port,因为打印机会占用串口 COM1。

3.“Next”,在“Serial Port” 里选中 “Output to named pipe”。

4.“next”,然后如下设置:

5.“Finish”之后,回到如下“Virtual Machine Settings”页面,在“I/O Mode” 里选中“Yield CPU on poll”。

6.点击“OK”之后,WMware 虚拟机设置就完成了。接下来,我们开机,进入虚拟机系统中,并对虚拟机系统进行设置,将其设置成调试模式。

虚拟机里的操作系统设置

1.如果操作系统不是 Win10,则开机进入桌面后,在运行窗口输入 msconfig —> 引导 —> 高级选项 —> 调试 —> 确定。

2.如果操作系统是 Win10,则

1.在设置 —> 安全和更新 —> 针对开发人员 —> 开发人员模式;

2.管理员身份运行CMD,输入 bcdedit /set testsigning on 开启测试模式;

3.在运行窗口输入 msconfig —> 引导 —> 高级选项 —> 调试 —> 确定;

3.关机重启,这样虚拟机里的操作系统就设置完成了。接下来,就开始配置 VS2013,使用 VS2013 上的 WinDbg 调试程序。

VS2013 驱动调试配置

1.点击菜单栏“DRIVER” —> “Test” —> “Configure Computers…”;

2.然后,点击“Add New Conputer”,添加配置信息。

3.接着,选中“Manually configure debuggers and do not provision”,点击“下一步”;

4.最后,选中“Serial”通信,波特率为“115200”,勾选“Pipe”,勾选“Reconnect”,管道名称为“\.\pipe\com_1”,目标端口为“com1”;这只完后,点击下一步即可完成 VS2013 上面的调试配置。

开始正式调试

当配置好 VMware 虚拟机环境以及 VS2013 上面的调试环境之后,我们就可以来调试驱动程序了。调试方法和调试应用程序一样,先下断点、然后运行程序,程序执行到断点处就会停下。但在双机调试下,就会变成:

1.首先,我们使用快捷键 F9 在驱动程序代码上下断点,再按下 F5 运行程序,会弹出提示框,我们选择继续调试:

2.这时,驱动程序就一直处于 waiting to reoonnect… 状态。要特别特别特别注意:在 VMware 虚拟机中加载驱动程序之前,我们先在 VS2013 暂停下调试,暂停成功后,再按 F5 继续调试,这时才去 VMware 中加载驱动程序。

如果不先暂停的话,加载运行驱动程序,代码断点不能成功断下来。暂停之后,可以成功断下来。这可能是一个 Bug 吧,反正大家如果遇到断不下来的情况,都先试试先暂停,再运行调试这种办法吧。

3.我们到 VMware 中加载运行驱动程序,VS2013 成功在断点处断下。那么,这时,我们就可以使用快捷键 F5、F9、F10、F11,像调试应用层序那样调试驱动程序了。

总结

步骤并不复杂,只是啰嗦而已。大家细心点跟着上述教程,认真操作就可以成功开发驱动程序,并使用 WinDbg 实现双机调试驱动程序源码。

参考

参考自《Windows黑客编程技术详解》一书

上传的附件

keyboard_arrow_left上一篇 : 使用原始套接字Raw Socket实现数据包嗅探 python数据分析(8)——挖掘建模(3)关联规则 : 下一篇keyboard_arrow_right



DemonGan
2019-02-09 11:38:38
使用VS2013搭建内核开发环境并使用VS2013自带的WinDbg双机调试有源码的驱动程序
金闪电侠
2019-03-18 21:17:58
买了你的书籍,windows黑客编程技术详解,但是我的C语言还是比较普通的水平,我都看不懂你这本书。怎么使用在vs2017呀

发送私信

这一切都不是我的,但总有一天,会是我的

73
文章数
67
评论数
最近文章
eject