摘要
Mxchild
生成中...
0x00 新建项目
![图片[1]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-22-1024x687.png)
![图片[2]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-23.png)
0x01 编写驱动
/*
* 项目名称:KrpsHelloWorld (KMDF Driver)
* 描述:一个基于 KMDF 框架的最小化驱动示例
* 环境:Windows 10/11, WDK
*/
// fltkernel.h 是文件系统过滤驱动的头文件。
// 虽然本代码主要演示 KMDF,但既然引用了它,说明该项目可能后续涉及文件监控功能。
#include <fltkernel.h>
// WDF (Windows Driver Framework) 是 KMDF 的核心头文件
#include <wdf.h>
// 声明驱动入口点函数
// 系统加载驱动时,会首先寻找并调用这个函数
DRIVER_INITIALIZE DriverEntry;
// 声明设备添加回调函数
// 当框架检测到有硬件需要该驱动管理时,会调用此函数来创建设备
EVT_WDF_DRIVER_DEVICE_ADD KrpsHelloWorldEvtDeviceAdd;
/*
* 驱动入口点
* 这是驱动程序的“main”函数。
* 注意:此时系统还没有完全初始化框架,我们需要手动初始化。
*/
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject, // 驱动对象指针,由系统传入
_In_ PUNICODE_STRING RegistryPath // 注册表路径,指向该驱动的注册表项
)
{
NTSTATUS status = STATUS_SUCCESS;
// 定义一个 WDF_DRIVER_CONFIG 结构体
// 这个结构体用于告诉框架:“我的设备添加回调函数是谁”
WDF_DRIVER_CONFIG config;
// 打印调试日志
// 注意:这里使用了双层括号 ((...)),这是 KdPrintEx 宏的特殊要求
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KrpsHelloWorld: DriverEntry\n"));
// 触发断点
// 如果连接了内核调试器,程序运行到这里会暂停,方便调试
KdBreakPoint();
// 初始化配置结构体
// 第一个参数:结构体指针
// 第二个参数:EvtDeviceAdd 回调函数指针。
// 意思是:一旦框架初始化完成,并且发现有硬件匹配,就去调用 KrpsHelloWorldEvtDeviceAdd
WDF_DRIVER_CONFIG_INIT(&config, KrpsHelloWorldEvtDeviceAdd);
// 创建 WDF 驱动对象
// 这一步非常关键:它会将 WDM 的 DriverObject 包装成 KMDF 的 WDFDRIVER 对象
// 从此以后,KMDF 框架接管了 DriverObject,我们不再直接操作底层的 IRP 分发
status = WdfDriverCreate(
DriverObject, // 原始的 WDM 驱动对象
RegistryPath, // 注册表路径
WDF_NO_OBJECT_ATTRIBUTES, // 对象属性(这里不需要)
&config, // 刚才初始化的配置
WDF_NO_HANDLE // 如果不需要保存驱动句柄,填 NULL 或 WDF_NO_HANDLE
);
// 返回状态
// 如果 WdfDriverCreate 失败,驱动加载就会失败
return status;
}
/*
* 设备添加回调函数
* 当驱动加载成功,并且系统发现有硬件(或虚拟设备)匹配该驱动时,
* 框架会自动调用这个函数。
* 在这里,我们负责创建具体的“设备对象”。
*/
NTSTATUS
KrpsHelloWorldEvtDeviceAdd(
_In_ WDFDRIVER Driver, // 父驱动对象句柄
_Inout_ PWDFDEVICE_INIT DeviceInit // 设备初始化结构,用于配置设备属性
)
{
// 告诉编译器 Driver 参数虽然未使用,但这并非错误(消除编译警告 C4100)
UNREFERENCED_PARAMETER(Driver);
NTSTATUS status;
// 定义设备句柄
// 这个句柄代表了我们即将创建的设备实例
WDFDEVICE hDevice;
// 打印日志,确认进入了设备添加阶段
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KrpsHelloWorld: KrpsHelloWorldEvtDeviceAdd\n"));
// 再次触发断点
// 这可以用来验证设备是否真的被系统枚举到了
KdBreakPoint();
// 创建 WDF 设备对象
// 这是 KMDF 中最核心的函数之一
status = WdfDeviceCreate(
&DeviceInit, // 传入设备初始化结构(框架会自动清理它)
WDF_NO_OBJECT_ATTRIBUTES, // 对象属性(默认)
&hDevice // 输出:返回创建好的设备句柄
);
// 注意:
// 在 KMDF 中,我们不需要像 WDM 那样手动创建符号链接或处理 IRP_MJ_CREATE
// 框架会自动帮我们处理大部分底层细节。
// 如果需要创建设备接口(让应用层能找到),通常在这里调用 WdfDeviceCreateDeviceInterface
return status;
}
0x02 编译驱动
![图片[3]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-24-1024x413.png)
![图片[4]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-25.png)
![图片[5]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-26-1024x596.png)
![图片[6]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-29-1024x538.png)
0x03 调试驱动
![图片[7]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-30-1024x651.png)
windbg看到int3 3 中断后, 目标虚拟机会无法操作,输入 g ,回车,然后再去目标机安装、启动驱动程序
![图片[8]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-31.png)
![图片[9]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-32.png)
点击启动后,目标虚拟机会卡住,回到调试虚拟机,输入 g,回车看windbg输出,再输入g回车后,就可以看到目标虚拟机驱动启动成功了
![图片[10]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-34.png)
![图片[11]- 第一个 HelloWordDriver 驱动程序- 侠者非攻社区](https://www.xiahub.com/wp-content/uploads/2026/03/image-33.png)
版权声明
1
本网站名称:侠者非攻社区
2
本站永久网址:https://www.xiahub.com
3
本站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4
本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5
本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
6
本站附件资源、教程等内容如因时效原因失效或不可用,请评论区留言或联系站长及时更新。
本站一切资源仅供学习交流使用请勿商业运营,严禁从事违法侵权等任何非法活动,否则后果自负!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








暂无评论内容