一、创建项目
新建一个以Kernel Mode Driver, Empty(KMDF)为模板的驱动项目,项目名称HelloDriver,在项目中新建一个hello.cpp文件作为驱动入口文件,写一点简单的代码做测试:
hello.cpp代码:
#include
<ntddk.h>
// 提供一个Unload 函数只是为了让这个程序能够动态卸载,方便调试
extern
"C"
void
DriverUnload(
PDRIVER_OBJECT
driver)
{
// 但是实际上我们什么都不做,只打印一句话
DbgPrint(
"hello: my driver is unloading...\r\n");
}
// DriverEntry,入口函数。相当于main。
extern
"C"
NTSTATUS
DriverEntry(
PDRIVER_OBJECT
driver,
PUNICODE_STRING
reg_path)
{
// 这是内核模块入口,可以在这里写入我们想写的东西
DbgPrint(
"hello: my world!");
// 设置一个卸载函数,便于这个函数退出
driver->
DriverUnload =
DriverUnload;
return
STATUS_SUCCESS;
}
|
修改告警:调整属性 - C/C++ - 常规,警告等级 4,将警告视为错误 否;
二、编译及测试
bcdedit /debug on
bcdedit /bootdebug on // boot 驱动需要此设置
bcdedit /set testsigning on // 使用测试签名可用,和禁用签名功能类似
|
三、远程调试
3.1 VS2019 远程调试
注:容易卡死,不稳定
1、VS2019中,选择 调试 - 附加到进程,连接类型选择 Windows Kernel Mode Debugger,连接目标为之前新建的Device,附加。
注意:附加前要开启虚拟机
2、Debug窗口会显示以下字样,表示已打开管道并等待重连。(注意是 Opened \.\pipe\com_1)
3、接着重新启动虚拟机,等待虚拟机进入桌面。Debug窗口显示如下:
注意:1.这里可能会花较长时间,并不是因为卡死了。
注意:2.重启虚拟机的时候记得禁用驱动程序强制签名。(或者使用testsigning)
4、进入桌面后,虚拟机可以正常操作。在VS2019中按下 全部中断
5、等待VS停下来,并出现以下画面,再点击 继续。(先暂停再继续,否则可能断不下来)。
注意:如果VS很长时间都没有响应,可以用任务管理器结束VS,然后重新打开再附加到进程。
7、后面,同单机一样,用驱动加载工具安装驱动即可。
3.2 windbg远程调试
工具:windbg或win10商店的windbg preview(推荐)
1、Attach to kernel、配置com信息
2、重启虚拟机
3、配置符号文件路径
4、open source
5、下断点
注:
四、QA
Q1:
编译时出现error MSB8040: 此项目需要缓解了 Spectre 漏洞的库
原因:这是因为Visual Studio默认开启了缓解Spectre攻击的机制,所以就有两种解决方案,一种是生成解决方案时禁用Spectre缓解机制,另一种就是安装Spectre缓解机制。
a) 禁用Spectre机制: 右键解决方案,然后选择“属性”,然后选择“配置属性”——“C/C++”——“代码生成”,在最下方有一项Spectre缓解,下拉选择“禁用“就行了
b) 安装Spectre缓解机制:如下:
Q2:error 1297: Device driver does not install on any devices, use primitive driver if this is intended.
参考: