首页
社区
课程
招聘
[原创] Windows Kernel Programming(一)开发环境搭建
2021-1-30 23:06 4593

[原创] Windows Kernel Programming(一)开发环境搭建

2021-1-30 23:06
4593

1. 驱动开发环境搭建

Install Visual Studio 2019

Visual Studio 2019

 

Install Spectre

Install Windows Driver Kit

Windows Driver Kit 1

 

Windows Driver Kit 2

 

Windows Driver Kit 3

 

Windows Driver Kit 4

创建项目

Empty WDM Driver

 

创建

 

添加 driver.c

添加代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// driver.c
#include <ntddk.h>
 
// DriverEntry Routine
DRIVER_INITIALIZE DriverEntry;
// Unload Routine
DRIVER_UNLOAD DriverUnload;
 
// DriverEntry:  驱动程序的入口点
// DriverObject: 驱动程序对象
// RegistryPath: 注册表中的路径(驱动程序路径)
NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
)
{
    // 编译器默认的警告等级为 /W4,
    // 并且开启 /WX 将警告视为错误,
    // 对未引用的参数或变量会报错(C4100).
    //   方法1: 删除参数名,或者注释掉参数名
    //   方法2: 将警告等级设置为 /W3 或者关闭 /WX
    //   方法3: 微软推荐使用 UNREFERENCED_PARAMETER
    // UNREFERENCED_PARAMETER 啥也没干,只是一个空引用的宏.
    UNREFERENCED_PARAMETER(RegistryPath);
 
    // 非WDM驱动(NT) Unload Routine 是可选的.
    // 如果不设置 Unload Routine,正常情况下驱动模块将无法被卸载
    DriverObject->DriverUnload = DriverUnload;
 
    // 如果 DriverEntry 返回值不为 STATUS_SUCCESS,
    // 驱动将不会被加载,Unload Routine 也不会被调用
    return STATUS_SUCCESS;
}
 
// Unload Routine
VOID DriverUnload(_In_ PDRIVER_OBJECT DriverObject)
{
    UNREFERENCED_PARAMETER(DriverObject);
}

编译

编译

驱动的兼容性问题

  • 系统位数的兼容性
    • x86的系统只能加载x86的驱动,x64的系统只能加载x64的驱动
    • 内核里没有WOW机制,不像应用程序,x64系统可以运行x86程序
  • 系统版本的兼容性
    • 建议将项目的Target OS Version设置为Windows 7,这样就可以兼容几乎所有Windows版本.
    • Target OS Version

x64 Driver Signature Enforcement (DSE)

Vista开始,x64操作系统需要签名才能加载驱动,这里简单介绍几个解决方法.

方法 说明
使用x86系统部署驱动 只是为了方便测试
进入测试模式bcdedit /set testsigning on 如果开启了Secure Boot进入测试模式将会失败
在系统引导的时候按F8选择禁用驱动程序签名强制 Win10按住Shift键然后点击重启进入高级启动
进入调试模式,挂上调试器. 如果系统启动后挂上调试器,需要系统断下来一次
使用泄露的过期签名,并修改系统时间给自己的驱动签名 会被杀毒软件查杀
使用有任意读写漏洞的驱动,强制禁用DSE https://github.com/hfiref0x/DSEFix
使用有任意读写漏洞的驱动,手动内存加载驱动 https://github.com/hfiref0x/TDL
使用系统漏洞或Bootkit 兼容性差,稳定性差,不推荐

部署驱动程序

  • 使用系统自带的sc.exe就可以完成驱动部署
  • 写一个load.bat批处理来方便我们做驱动的部署
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@REM load.bat
@echo off
 
set serviceName=MyDriver1
set binPath="C:\Users\Win10_1909_64\Desktop\MyDriver1.sys"
 
@REM LoadDriver
@REM HKLM\System\CurrentControlSet\Services\%serviceName%
sc create %serviceName% binPath= %binPath% type= kernel
sc start %serviceName%
pause
@REM UnloadDriver
sc stop %serviceName%
sc delete %serviceName%
pause

Win10部署


 

Win7部署


 

WinXP部署


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-1-30 23:10 被redbg编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 1567
活跃值: (905)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sYstemk1t 2021-1-31 00:53
2
0
请问一下,我的编译提示A WDK错误怎么办呢? 装WDK编译环境都要崩溃了!
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_xghoecki 2021-2-1 01:48
3
1
坛里有你更精 ,感谢分享
雪    币: 0
活跃值: (268)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
soatm 2021-2-8 09:56
4
0
mark
游客
登录 | 注册 方可回帖
返回