1. Hello World 驱动

Hello World 驱动 学习卡片

任务说明

本案例目标是在 Windows 10/11 x64 环境下,从零编写一个最小化的内核驱动,使其在加载时向内核调试器输出 Hello World 字符串。驱动不执行任何设备 I/O 操作,仅演示驱动入口点、卸载例程与调试输出机制,验证驱动开发环境与调试链路是否正常。

实现原理

Windows 内核驱动必须导出 DriverEntry 入口点,并在其中完成初始化。本驱动在 DriverEntry 中调用 DbgPrint 输出字符串,随后设置卸载例程 DriverUnload,该例程在驱动被停止时输出退出信息。驱动不创建设备对象,因此卸载时无需额外清理。

代码实现

创建源文件 HelloWorld.c:

#include <ntddk.h>

VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
    UNREFERENCED_PARAMETER(DriverObject);
    DbgPrint("[HelloWorld] Driver Unloaded\r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
    UNREFERENCED_PARAMETER(RegistryPath);

    DbgPrint("[HelloWorld] Hello World\r\n");

    DriverObject->DriverUnload = DriverUnload;

    return STATUS_SUCCESS;
}

编译配置

创建源文件 HelloWorld.inf(用于生成驱动安装包):

[Version]
Signature   = "$WINDOWS NT$"
Class       = "NT"
ClassGuid   = {4d36e97d-e325-11ce-bfc1-08002be10318}
Provider    = %ProviderName%
DriverVer   = 01/01/2025,1.0.0
CatalogFile = HelloWorld.cat

[DestinationDirs]
DefaultDestDir = 12

[DefaultInstall.NT]
CopyFiles = DriverFiles

[DefaultInstall.NT.Services]
AddService = HelloWorld,0x00000002,DriverService

[DriverFiles]
HelloWorld.sys = ,,

[DriverService]
DisplayName   = "HelloWorld Driver"
ServiceType   = 1
StartType     = 3
ErrorControl  = 1
ServiceBinary = %12%\HelloWorld.sys

[Strings]
ProviderName = "Example Corp"

构建步骤

  1. 安装 Windows Driver Kit (WDK) 与 Visual Studio(含“使用 C++ 的桌面开发”工作负载)。
  2. 在 Visual Studio 中创建“Empty WDM Driver”项目,将 HelloWorld.c 与 HelloWorld.inf 加入项目。
  3. 选择 x64 配置,生成解决方案。输出目录中应得到 HelloWorld.sys。

加载与验证

在目标测试机(需开启测试签名模式)上,以管理员身份打开命令提示符:

bcdedit /set testsigning on
重启系统

重启后将 HelloWorld.sys 复制到 C:\Windows\System32\drivers\,然后创建服务并启动:

sc create HelloWorld type= kernel binPath= C:\Windows\System32\drivers\HelloWorld.sys
sc start HelloWorld

若需停止并删除:

sc stop HelloWorld
sc delete HelloWorld

验证方法:使用 WinDbg 连接目标机的内核调试会话(网络或串口)。在驱动加载前执行 ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF 确保所有调试输出可见。执行 sc start HelloWorld 后,在 WinDbg 的调试输出窗口应观察到:

[HelloWorld] Hello World

执行 sc stop HelloWorld 后,应观察到:

[HelloWorld] Driver Unloaded

判定标准:若 WinDbg 中按顺序出现上述两条输出,且系统无蓝屏,则驱动加载、调试输出与卸载链路均验证通过。

驱动加载与调试输出验证时序 WinDbg sc.exe HelloWorld.sys 内核调试器 sc start HelloWorld DriverEntry DbgPrint("Hello World") [HelloWorld] Hello World STATUS_SUCCESS sc stop HelloWorld DriverUnload DbgPrint("Driver Unloaded") [HelloWorld] Driver Unloaded

注意事项

  • 测试机必须开启 testsigning,否则系统拒绝加载未签名驱动。
  • 若使用虚拟机调试,需在 VM 中启用虚拟化中断(如 VMware 的“Virtualize Intel VT-x/EPT”),并配置 COM 管道或网络调试。
  • 驱动仅用于开发验证,不应在生产环境加载。