免杀基础-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):

  1. 派遣函数(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_OPEN
  • Exclusive:是否独占设备

2.3 符号链接

用户模式程序需要通过符号链接访问设备:

  • 内核模式符号链接:\??\开头
  • 用户模式符号链接:\\.\开头

创建符号链接使用IoCreateSymbolicLink函数。

3. 用户模式与驱动通信

3.1 基本通信流程

  1. 用户模式通过CreateFile获取设备句柄

    HANDLE hDevice = CreateFile(
      L"\\\\.\\DeviceName",
      GENERIC_READ | GENERIC_WRITE,
      0,
      NULL,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      NULL
    );
    
  2. 使用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处理函数:

  1. 0x33:内存复制操作

    • 使用memmove函数
    • 参数结构:
      • a1+24:目标地址(PVOID Dst)
      • a1+16:源地址(PVOID Src)
      • a1+32:复制大小(SIZE_T MaxCount)
  2. 0x25:获取物理地址

    • 参数结构:
      • a1+24:线性地址(Liner Addr)
      • a1+16:物理地址(Physic Addr)
  3. 0x19:映射物理地址到线性地址

    • 使用MmMapIoSpace
  4. 0x1A:取消映射

    • 使用MmUnmapIoSpace

4.2 内核函数调用技术

KDMapper通过hook技术执行任意内核函数:

  1. 获取NtAddAtom的用户模式地址
  2. 获取NtAddAtom的内核模式地址
  3. 构造shellcode模板:
    48E8 xxxxxxxx FFE0  ; call + jmp rax
    
  4. Hook NtAddAtom
  5. 通过hook调用目标内核函数

4.3 内存加载驱动流程

  1. 在内核申请非分页内存
  2. 复制PE头到内核内存
  3. 修复重定位和导入表
  4. 修复cookie
  5. 调用DriverEntry

5. 常见漏洞驱动分析

5.1 viragt64.sys

  • 符号链接\DosDevices\Viragtlt
  • IOCTL0x82730030
  • 功能:通过ZwTerminateProcess终止指定进程
  • 实现
    • 使用ZwQuerySystemInformation查询进程信息
    • 遍历匹配进程名
    • 调用ZwTerminateProcess终止进程

5.2 gmer64.sys

  • 符号链接:动态生成(基于加载时的DisplayName)
  • IOCTL0x9876C094
  • 功能:直接通过PID终止进程

5.3 amsdk.sys

  • IOCTL0x80002048
  • 功能:根据调用者模式决定使用NtOpenProcessZwOpenProcess打开进程

6. 实战注意事项

  1. 参数验证:许多驱动会对输入参数进行验证(如长度检查)
  2. 错误处理:注意处理0xC000000D(无效参数)等错误
  3. 内存操作:确保内存操作在合法范围内
  4. 进程终止:终止进程时确保传递正确的字符串长度

7. 防御措施

  1. 禁用不必要的驱动程序
  2. 监控驱动加载行为
  3. 限制低权限用户加载驱动
  4. 定期更新已知漏洞驱动

通过深入理解BYOVD技术和相关驱动的工作原理,安全研究人员可以更好地防御此类攻击,同时也能在合法授权范围内进行相关安全测试。

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 函数创建设备对象: 参数说明: DriverObject :所属驱动对象 DeviceName :设备名称(格式为 \Device\Name ) DeviceType :通常使用 FILE_DEVICE_SECURE_OPEN Exclusive :是否独占设备 2.3 符号链接 用户模式程序需要通过符号链接访问设备: 内核模式符号链接: \??\ 开头 用户模式符号链接: \\.\ 开头 创建符号链接使用 IoCreateSymbolicLink 函数。 3. 用户模式与驱动通信 3.1 基本通信流程 用户模式通过 CreateFile 获取设备句柄 使用 DeviceIoControl 发送控制代码 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模板: 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技术和相关驱动的工作原理,安全研究人员可以更好地防御此类攻击,同时也能在合法授权范围内进行相关安全测试。