1. 恶意驱动逆向分析概述
在安全研究领域,驱动级恶意软件因其高权限、隐蔽性强等特点,一直是攻防对抗的前沿阵地。最近在分析一批样本时,遇到一个伪装成显卡驱动的恶意程序,其技术实现颇具代表性。这类样本通常会通过数字签名伪装、驱动加载劫持等方式绕过常规防护,值得深入剖析其运作机制。
2. 样本基础分析
2.1 静态特征检测
使用PE工具检查样本发现:
- 编译时间为2023年8月15日
- 导入表仅包含ntoskrnl.exe的基本API
- 资源段包含异常的大尺寸未加密配置数据
- 数字签名使用某小型CA机构证书(已吊销)
特别值得注意的是其版本信息中的CompanyName字段被刻意设置为"NVidia Corporation",这种伪装手法在近年攻击中愈发常见。
2.2 动态行为监控
在隔离环境中加载驱动后观察到:
- 创建\Device\NvidiaGPU0设备对象
- 通过IoCreateSymbolicLink建立到用户态的通信通道
- 注册多个IRP处理例程,重点关注:
- IRP_MJ_DEVICE_CONTROL(0x8001E000-0x8001EFFF)
- IRP_MJ_INTERNAL_DEVICE_CONTROL
3. 核心功能逆向
3.1 通信协议解析
驱动通过DeviceIoControl与用户态组件交互,主要控制码包括:
| 控制码 | 功能描述 | 参数结构 |
|---|---|---|
| 0x8001E004 | 内存操作(读/写/执行) | MEM_OPERATION |
| 0x8001E008 | 进程遍历与注入 | PROCESS_INJECTION |
| 0x8001E00C | 注册表持久化 | REGISTRY_ENTRY |
其中内存操作结构体包含:
typedef struct _MEM_OPERATION { ULONG_PTR TargetPID; PVOID RemoteAddress; PVOID LocalBuffer; SIZE_T Size; ULONG OperationType; // 1=Read, 2=Write, 3=Execute } MEM_OPERATION;3.2 反检测机制
样本采用多种对抗技术:
- 通过MmGetSystemRoutineAddress动态获取API地址
- 关键字符串使用栈动态构造(如"ObReferenceObjectByHandle")
- 检测内核调试器存在:
- 检查KdDebuggerEnabled标志
- 测量时间戳计数器差值
- 挂钩PsLoadedModuleList破坏模块遍历
4. 高级功能分析
4.1 进程注入技术
驱动实现了一种特殊的内存注入方式:
- 通过ZwQuerySystemInformation枚举进程
- 对目标进程执行以下操作:
- 分配RWX内存(NtAllocateVirtualMemory)
- 写入shellcode(MmCopyVirtualMemory)
- 创建APC队列(KeInitializeApc + KeInsertQueueApc)
特别的是其shellcode采用TTP技术(Trampoline-Tail-Padding),通过在内核态构造跳板实现无痕注入。
4.2 持久化机制
注册表项隐藏在:
HKLM\SYSTEM\CurrentControlSet\Services\NvidiaDisplay\Performance使用自定义格式存储配置数据,包括:
- C2服务器IP(编码为DWORD数组)
- 心跳间隔(300-600秒随机)
- 备用通信协议(ICMP/HTTP备用)
5. 对抗分析与检测方案
5.1 行为特征总结
该样本的典型IOC包括:
- 创建\Device\NvidiaGPU0设备对象
- 加载后立即修改CR4寄存器关闭SMEP保护
- 异常的内存操作模式(频繁跨进程读写)
- 注册表项包含非常规性能计数器数据
5.2 检测建议
基于实战经验推荐以下检测策略:
- 驱动加载监控(Event ID 6/20/21)
- 内核模块签名验证(禁用测试签名模式)
- 关键API调用链分析(如MmCopyVirtualMemory调用源)
- 内存属性异常检测(RWX内存区域)
在EDR规则中可配置以下检测逻辑:
rule Kernel_Driver_Injection { meta: description = "Detects suspicious driver memory operations" condition: (kernel_module_load != signed_by_microsoft) and (cross_process_mmcopy > 3 within 10s) and (cr4_register_modified == true) }6. 分析工具与技巧
6.1 必备工具链
推荐的分析工具组合:
- 反汇编:IDA Pro(Kernel调试插件)
- 动态分析:WinDbg Preview(时间旅行调试)
- 行为监控:Process Monitor(驱动过滤配置)
- 内存分析:Volatility(自定义profile)
6.2 实用调试技巧
- 使用!chkimg检测内核钩子
- 通过!pool命令查找异常内存分配
- 设置条件断点:
bp nt!MmCopyVirtualMemory "j (poi(esp+8) != current_process) 'gc';'kb';" - 检查异常线程上下文:
!thread -1 -p
在分析过程中发现该样本会检测硬件断点(DR0-DR3寄存器),此时可改用内存断点或页保护异常机制进行调试。