免杀基础-BYOVD
字数 1796 2025-08-29 08:30:18
BYOVD技术详解与实战指南
1. BYOVD技术概述
BYOVD (Bring Your Own Vulnerable Driver) 是一种利用带有合法签名的漏洞驱动程序来执行内核级操作的技术。其核心思想是:
- 利用已签名的驱动程序中的漏洞
- 通过这些漏洞获得内核级权限
- 执行恶意操作而不触发驱动程序签名验证
2. 驱动通信基础
2.1 驱动通信机制
Windows驱动通信基于设备对象(_DEVICE_OBJECT)和IRP(_IRP):
- 派遣函数(MajorFunction):驱动对象中的回调函数数组,处理不同类型的IRP请求
IRP_MJ_CREATE:处理设备打开请求IRP_MJ_CLOSE:处理设备关闭请求IRP_MJ_DEVICE_CONTROL:处理IO控制代码(IOCTL)请求
2.2 设备对象创建
使用IoCreateDevice函数创建设备对象:
NTSTATUS IoCreateDevice(
PDRIVER_OBJECT DriverObject,
ULONG DeviceExtensionSize,
PUNICODE_STRING DeviceName,
DEVICE_TYPE DeviceType,
ULONG DeviceCharacteristics,
BOOLEAN Exclusive,
PDEVICE_OBJECT *DeviceObject
);
参数说明:
DriverObject:所属驱动对象DeviceName:设备名称(格式为\Device\Name)DeviceType:通常使用FILE_DEVICE_SECURE_OPENExclusive:是否独占设备
2.3 符号链接
用户模式程序需要通过符号链接访问设备:
- 内核模式符号链接:
\??\开头 - 用户模式符号链接:
\\.\开头
创建符号链接使用IoCreateSymbolicLink函数。
3. 用户模式与驱动通信
3.1 基本通信流程
-
用户模式通过
CreateFile获取设备句柄HANDLE hDevice = CreateFile( L"\\\\.\\DeviceName", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); -
使用
DeviceIoControl发送控制代码BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped );
4. KDMapper技术分析
KDMapper是一个利用iqvw64e.sys驱动进行内存映射的工具。
4.1 iqvw64e.sys的IOCTL处理
驱动中的关键IOCTL处理函数:
-
0x33:内存复制操作
- 使用
memmove函数 - 参数结构:
- a1+24:目标地址(PVOID Dst)
- a1+16:源地址(PVOID Src)
- a1+32:复制大小(SIZE_T MaxCount)
- 使用
-
0x25:获取物理地址
- 参数结构:
- a1+24:线性地址(Liner Addr)
- a1+16:物理地址(Physic Addr)
- 参数结构:
-
0x19:映射物理地址到线性地址
- 使用
MmMapIoSpace
- 使用
-
0x1A:取消映射
- 使用
MmUnmapIoSpace
- 使用
4.2 内核函数调用技术
KDMapper通过hook技术执行任意内核函数:
- 获取
NtAddAtom的用户模式地址 - 获取
NtAddAtom的内核模式地址 - 构造shellcode模板:
48E8 xxxxxxxx FFE0 ; call + jmp rax - Hook
NtAddAtom - 通过hook调用目标内核函数
4.3 内存加载驱动流程
- 在内核申请非分页内存
- 复制PE头到内核内存
- 修复重定位和导入表
- 修复cookie
- 调用DriverEntry
5. 常见漏洞驱动分析
5.1 viragt64.sys
- 符号链接:
\DosDevices\Viragtlt - IOCTL:
0x82730030 - 功能:通过
ZwTerminateProcess终止指定进程 - 实现:
- 使用
ZwQuerySystemInformation查询进程信息 - 遍历匹配进程名
- 调用
ZwTerminateProcess终止进程
- 使用
5.2 gmer64.sys
- 符号链接:动态生成(基于加载时的DisplayName)
- IOCTL:
0x9876C094 - 功能:直接通过PID终止进程
5.3 amsdk.sys
- IOCTL:
0x80002048 - 功能:根据调用者模式决定使用
NtOpenProcess或ZwOpenProcess打开进程
6. 实战注意事项
- 参数验证:许多驱动会对输入参数进行验证(如长度检查)
- 错误处理:注意处理
0xC000000D(无效参数)等错误 - 内存操作:确保内存操作在合法范围内
- 进程终止:终止进程时确保传递正确的字符串长度
7. 防御措施
- 禁用不必要的驱动程序
- 监控驱动加载行为
- 限制低权限用户加载驱动
- 定期更新已知漏洞驱动
通过深入理解BYOVD技术和相关驱动的工作原理,安全研究人员可以更好地防御此类攻击,同时也能在合法授权范围内进行相关安全测试。