白驱动 Kill AV/EDR(下)
字数 2272 2025-08-23 18:31:08

白驱动对抗杀软/EDR技术研究

1. 驱动通信基础

1.1 驱动通信机制

  • 驱动程序在DriverEntry()中创建设备对象、符号链接和设置分发例程
  • 必须实现IRP_MJ_CREATE(0x00)IRP_MJ_CLOSE(0x02)分发例程
  • 用户态通信函数:
    • WriteFile:向驱动发送数据
    • ReadFile:从驱动读取数据
    • DeviceIoControl:主要通信方式

1.2 DeviceIoControl工作机制

  • 驱动需实现IRP_MJ_DEVICE_CONTROL(0x0e)分发例程
  • IOCTL(控制代码)决定驱动执行的操作
  • 通信流程:
    1. 用户态调用DeviceIoControl
    2. 驱动根据IOCTL执行对应操作
    3. 通过SystemBuffer传递参数

2. 利用有进程终止功能的驱动

2.1 分析流程

  1. 定位关键函数

    • 在IDA中查找ZwTerminateProcess()调用
    • 分析函数参数(PID)传递方式
  2. 追踪调用链

    • DriverEntry()开始分析
    • 查找IRP_MJ_DEVICE_CONTROL分发例程
    • 确定处理不同IOCTL的代码路径
  3. 参数格式分析

    • 确定PID传递格式(通常为ULONG)
    • 检查是否有前置校验条件

2.2 实例分析(gmer64.sys)

  1. 关键函数:

    • sub_164C0:调用ZwTerminateProcess()
    • 参数为PID
  2. 调用流程:

    • DriverEntry()sub_1132C()
    • 设置IRP_MJ_DEVICE_CONTROL分发例程
    • IOCTL 0x9876C094触发进程终止
  3. 前置条件:

    • 需先发送IOCTL 0x9876C004初始化
    • 然后发送0x9876C094终止进程

2.3 防御措施

  • 驱动应进行权限校验
  • 限制可信进程列表
  • 监控驱动通信行为

3. 利用任意地址读写驱动

3.1 漏洞定位

  1. 查找IRP_MJ_DEVICE_CONTROL分发例程
  2. 分析关键IOCTL实现:
    • 查找MmCopyVirtualMemory()等内存操作函数
    • 确定参数格式和校验条件

3.2 回调函数修补技术

3.2.1 进程回调修补

  1. 关键数据结构

    • PspCreateProcessNotifyRoutine:进程回调数组(最大64项)
    • PspCallProcessNotifyRoutines:遍历执行回调
  2. 定位方法

    • PsSetCreateProcessNotifyRoutine()反汇编
    • 追踪到PspSetCreateProcessNotifyRoutine()
    • 查找lea指令获取数组地址
  3. 回调结构

    typedef struct _EX_CALLBACK_ROUTINE_BLOCK {
        EX_RUNDOWN_REF RundownProtect;
        PEX_CALLBACK_FUNCTION Function;  // 回调函数地址
        PVOID Context;
    } EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK;
    
  4. 修补方法

    • 将回调函数地址置0
    • 或写入ret指令

3.2.2 实现步骤

  1. 获取ntoskrnl基地址
  2. 定位PspCreateProcessNotifyRoutine数组
  3. 枚举并识别杀软回调
  4. 修补指定回调或全部回调

3.3 其他利用方式

  1. 修补线程回调(PsSetCreateThreadNotifyRoutine)
  2. 修补映像加载回调(PsSetLoadImageNotifyRoutine)
  3. 禁用ETW(Event Tracing for Windows)
  4. 修改进程句柄权限
  5. 禁用DSE(Driver Signature Enforcement)

4. 防御检测技术

4.1 SSDT Hook检测

  • 32位系统:直接挂钩SSDT
  • 64位系统
    • 绕过PatchGuard
    • 内存中禁用PG
    • 在PG检查前摘钩
  • 防御原理
    • 监控ZwTerminateProcess()等关键函数
    • 拦截对EDR进程的操作

4.2 硬件虚拟化技术

  • Intel VT/AMD SVM
    • 将OS作为Guest运行
    • VMM层监控Guest行为
  • 应用
    • 无痕SSDT Hook
    • 内核提权检测
    • EPT Hook

4.3 过滤驱动程序

  • 附加到目标设备
  • 拦截所有IRP请求
  • 检测可疑通信模式

4.4 驱动自保护

  • 监控回调函数完整性
  • 校验自身内存区域
  • 实现多因素认证机制

5. 技术对比

方法 优点 缺点 隐蔽性
Kill进程 简单直接 EDR显示掉线
修补回调 不影响进程通信 实现复杂,版本兼容问题
禁用ETW 影响广泛 可能影响系统功能
修改句柄权限 精确控制 需要高权限

6. 结论与展望

  1. 当前有效性

    • 对多数传统EDR有效
    • 对基于硬件虚拟化的防护效果有限
  2. 发展趋势

    • 微软VBS等新技术增加防护
    • 硬件级安全方案普及
    • 攻击检测技术智能化
  3. 防御建议

    • 部署多层次防护体系
    • 监控驱动加载行为
    • 实施严格的证书管理
    • 定期更新安全策略

附录:关键代码片段

// 获取ntoskrnl基地址
PVOID GetNtoskrnlBase() {
    PRTL_PROCESS_MODULES ModuleInfo = (PRTL_PROCESS_MODULES)calloc(1024*1024, 1);
    NTSTATUS status = NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)11, 
                                             ModuleInfo, 1024*1024, NULL);
    // 遍历模块查找ntoskrnl.exe
    // ...
    return ModuleInfo->Modules[i].ImageBase;
}

// 修补进程回调
void PatchProcessCallbacks(INT64 PspCreateProcessNotifyRoutineAddress) {
    BYTE* data = (BYTE*)calloc(1, 1);
    for(int i = 0; i < 64; i++) {
        DriverWriteMemery(data, 
                         (VOID*)(PspCreateProcessNotifyRoutineAddress + (i*8)), 
                         8);
    }
}

参考资源

  1. Silencing the EDR. How to disable process, threads and image-loading detection callbacks
  2. EchOh-No! a Vulnerability and PoC demonstration in a popular Minecraft AntiCheat tool
  3. Windows内核安全编程指南
  4. Intel Virtualization Technology手册
白驱动对抗杀软/EDR技术研究 1. 驱动通信基础 1.1 驱动通信机制 驱动程序在 DriverEntry() 中创建设备对象、符号链接和设置分发例程 必须实现 IRP_MJ_CREATE(0x00) 和 IRP_MJ_CLOSE(0x02) 分发例程 用户态通信函数: WriteFile :向驱动发送数据 ReadFile :从驱动读取数据 DeviceIoControl :主要通信方式 1.2 DeviceIoControl工作机制 驱动需实现 IRP_MJ_DEVICE_CONTROL(0x0e) 分发例程 IOCTL(控制代码)决定驱动执行的操作 通信流程: 用户态调用 DeviceIoControl 驱动根据IOCTL执行对应操作 通过SystemBuffer传递参数 2. 利用有进程终止功能的驱动 2.1 分析流程 定位关键函数 : 在IDA中查找 ZwTerminateProcess() 调用 分析函数参数(PID)传递方式 追踪调用链 : 从 DriverEntry() 开始分析 查找 IRP_MJ_DEVICE_CONTROL 分发例程 确定处理不同IOCTL的代码路径 参数格式分析 : 确定PID传递格式(通常为ULONG) 检查是否有前置校验条件 2.2 实例分析(gmer64.sys) 关键函数: sub_164C0 :调用 ZwTerminateProcess() 参数为PID 调用流程: DriverEntry() → sub_1132C() 设置 IRP_MJ_DEVICE_CONTROL 分发例程 IOCTL 0x9876C094 触发进程终止 前置条件: 需先发送IOCTL 0x9876C004 初始化 然后发送 0x9876C094 终止进程 2.3 防御措施 驱动应进行权限校验 限制可信进程列表 监控驱动通信行为 3. 利用任意地址读写驱动 3.1 漏洞定位 查找 IRP_MJ_DEVICE_CONTROL 分发例程 分析关键IOCTL实现: 查找 MmCopyVirtualMemory() 等内存操作函数 确定参数格式和校验条件 3.2 回调函数修补技术 3.2.1 进程回调修补 关键数据结构 : PspCreateProcessNotifyRoutine :进程回调数组(最大64项) PspCallProcessNotifyRoutines :遍历执行回调 定位方法 : 从 PsSetCreateProcessNotifyRoutine() 反汇编 追踪到 PspSetCreateProcessNotifyRoutine() 查找 lea 指令获取数组地址 回调结构 : 修补方法 : 将回调函数地址置0 或写入ret指令 3.2.2 实现步骤 获取ntoskrnl基地址 定位 PspCreateProcessNotifyRoutine 数组 枚举并识别杀软回调 修补指定回调或全部回调 3.3 其他利用方式 修补线程回调( PsSetCreateThreadNotifyRoutine ) 修补映像加载回调( PsSetLoadImageNotifyRoutine ) 禁用ETW(Event Tracing for Windows) 修改进程句柄权限 禁用DSE(Driver Signature Enforcement) 4. 防御检测技术 4.1 SSDT Hook检测 32位系统 :直接挂钩SSDT 64位系统 : 绕过PatchGuard 内存中禁用PG 在PG检查前摘钩 防御原理 : 监控 ZwTerminateProcess() 等关键函数 拦截对EDR进程的操作 4.2 硬件虚拟化技术 Intel VT/AMD SVM : 将OS作为Guest运行 VMM层监控Guest行为 应用 : 无痕SSDT Hook 内核提权检测 EPT Hook 4.3 过滤驱动程序 附加到目标设备 拦截所有IRP请求 检测可疑通信模式 4.4 驱动自保护 监控回调函数完整性 校验自身内存区域 实现多因素认证机制 5. 技术对比 | 方法 | 优点 | 缺点 | 隐蔽性 | |------|------|------|--------| | Kill进程 | 简单直接 | EDR显示掉线 | 低 | | 修补回调 | 不影响进程通信 | 实现复杂,版本兼容问题 | 高 | | 禁用ETW | 影响广泛 | 可能影响系统功能 | 中 | | 修改句柄权限 | 精确控制 | 需要高权限 | 高 | 6. 结论与展望 当前有效性 : 对多数传统EDR有效 对基于硬件虚拟化的防护效果有限 发展趋势 : 微软VBS等新技术增加防护 硬件级安全方案普及 攻击检测技术智能化 防御建议 : 部署多层次防护体系 监控驱动加载行为 实施严格的证书管理 定期更新安全策略 附录:关键代码片段 参考资源 Silencing the EDR. How to disable process, threads and image-loading detection callbacks EchOh-No ! a Vulnerability and PoC demonstration in a popular Minecraft AntiCheat tool Windows内核安全编程指南 Intel Virtualization Technology手册