近期接手了一个关于Windows系统内核驱动的开发任务,首先需要的就是熟悉相关开发环境的配置与调试,这里采用了vs2013+vm2015+wdk8.1的组合,已经亲测完成(踩了无数的坑),在此做一下记录,下次需要配置环境的时候可以用作参考。
vm,wdk,vs等工具先下载安装好。
1.首先需要安装win7虚拟机,这里需要注意系统的镜像需要时虚拟机专用镜像,所以在此保存一个64位的win7镜像,可直接下载:
ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/
选择配置好虚拟机之后需要首先点击设置删除占用com1串口的打印机,然后添串行端口将管道命名为\.pipecom_1(如图所示)。
2.虚拟机开机后以管理员权限运行cmd,输入如下命令开启相应串口并关闭64位驱动强制签名(64位驱动要求必须有数字签名才可运行,但是可以在测试中关闭)
bcdedit /debug on bcdedit /dbgsettings serial debugport:n baudrate:115200 bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS
3.将主机中已安装的wdk目录中找到驱动目标程序将其复制进虚拟机中安装
3.运行vs,创建新的空wdm项目
新建first.c源程序
输入helloworld代码
#include <ntifs.h> //<ntddk.h> VOID DriverUnload(PDRIVER_OBJECT objDriver) { // 避免编译器关于未引用参数的警告 UNREFERENCED_PARAMETER(objDriver); // 什么也不做,只打印一行字符串 DbgPrint("My Dirver is unloading..."); } NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath) { // 避免编译器关于未引用参数的警告 UNREFERENCED_PARAMETER(strRegPath); // 如果编译方式为Debug,则插入一个INT 3指令,方便我们调试 // 打印一行字符串,并注册驱动卸载函数,以便于驱动卸载 DbgPrint("My First Dirver! ");// KdPrint(("KD My First Dirver! ")); objDriver->DriverUnload = DriverUnload; return STATUS_SUCCESS; }
其中两个函数,DriverEntry是程序入口相当于main,DriverUnload是卸载驱动时执行的函数。
以下为使用dbgview进行调试
4.将程序选择win7debug以及x64环境,点击编译生成
将编译生成的sys文件复制进虚拟机中
5.虚拟机中安装dbgview,同时输入以下命令然后重新启动虚拟机,使其可抓取内核态信息,也就是咱们代码中的dbgprint输出的字符串
新建一个txt文件,复制进入如下信息
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerDebug Print Filter] "DEFAULT"=dword:00000008
然后将文件后缀名改为.reg,启动之后重启计算机即可
6.先运行dbgview用于查看输出的信息
可以看到,在运行驱动之前,有一些其他的内核信息
7.运行InstDrv,将sys拖入其中点击安装,点击运行,可看到输出的helloworld
双机调试
首先需要认识到的是,上面debugview是在虚拟机中进行的测试,下面两种都将采用双机测试模式,也就是在主机端进行debug,虚拟机用作执行环境,输出的信息也全在主机端进行调试。
4.在进行双机测试之前,需要完成对虚拟机系统的改造,使其进入测试模式。
在虚拟机中以管理员权限运行cmd,运行以下命令
bcdedit /copy {current} /d Windows7-双机调试模式 bcdedit /timeout 10
bcdedit /set testsigning on //开启测试模式
bcdedit /debug ON //开启debug
bcdedit /bootdebug ON
bcdedit /dbgsettings //查看刚才的设置信息,应该是使用com1串口,波特率为115200
bcdedit /dbgsettings serial debugport:1 baudrate:115200 //如果不是请输入下行命令进行调整
在开机时有选择启动方式,其中“Windows7-双机调试模式”是我们刚增加的启动方式,选择此方式进入虚拟机系统,这样就完成了双机测试中对虚拟机运行环境的配置。
以下为使用windbg进行双机调试
5.首先在主机安装windbg,将windbg文件创建快捷方式,这样我们刚才在虚拟机中设定的串口管道就要用到了。
首先完成如下信息
-b -k com:pipe,port=\.pipecom_1,baud=115200,reconnect –y
其中port为管道名,baud为波特率,需要和虚拟机中设定好的信息一致,然后将该段字符串复制到快捷方式的目标最后
6.运行windbg,会提示wait to connect,此时启动虚拟机选择双机调试模式,会遇到int 3中断,此时在windbg中输入g即可使虚拟机继续执行,直至开机。
以下为vs双机调试
5.vs双机模式与windbg相似,即通过vs将编写好的代码的直接在虚拟机环境中进行debug,首先需要将vs连接虚拟机。
安装好wdk后,vs栏上会多一个DRIVER的选项,选择DRIVER-TEST-Configure进入如下界面
点击add new,选择第二个选项,可以在配置时测试是否能完成连接(此处有坑,如果选择第3项如果没有连接成功也会添加新计算机设备,后续会出现大问题)
计算机名称一定要使用本机的名称,通过我的电脑属性中查看,如图所示我的电脑是Windows,那么就要填Windows,这样是通过寻找本机的对应通道进行连接。
输入正确的计算机名称之后,点击下一步,连接类型选择Serial串口,同时勾选重连接与管道选项,波特率设定与虚拟机相同,将管道名设定为与虚拟机相同,点击下一步
如果状态为,则说明已经完成连接。
然后在选项栏会多了一个此设备的选项
然后我们打开刚才的helloworld程序,点击调试,附加到进程
选择传输方式为Windows Kernel Mode Debugger,选择核心进程点击附加,即可进入vs的dbg模式,与windbg显示相同
在vs的双机调试中,可在点击暂停调试后增加断点,按F11进行单步调试。
ps:这个研究任务关系到毕业论文,所以还是重视一点点,这个基本都和内核及内存等有关系,能够加深对系统底层的理解,平时的学习也不要落下,就酱加油吧,新的学期开始了!