白驱动 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(控制代码)决定驱动执行的操作
- 通信流程:
- 用户态调用
DeviceIoControl - 驱动根据IOCTL执行对应操作
- 通过SystemBuffer传递参数
- 用户态调用
2. 利用有进程终止功能的驱动
2.1 分析流程
-
定位关键函数:
- 在IDA中查找
ZwTerminateProcess()调用 - 分析函数参数(PID)传递方式
- 在IDA中查找
-
追踪调用链:
- 从
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终止进程
- 需先发送IOCTL
2.3 防御措施
- 驱动应进行权限校验
- 限制可信进程列表
- 监控驱动通信行为
3. 利用任意地址读写驱动
3.1 漏洞定位
- 查找
IRP_MJ_DEVICE_CONTROL分发例程 - 分析关键IOCTL实现:
- 查找
MmCopyVirtualMemory()等内存操作函数 - 确定参数格式和校验条件
- 查找
3.2 回调函数修补技术
3.2.1 进程回调修补
-
关键数据结构:
PspCreateProcessNotifyRoutine:进程回调数组(最大64项)PspCallProcessNotifyRoutines:遍历执行回调
-
定位方法:
- 从
PsSetCreateProcessNotifyRoutine()反汇编 - 追踪到
PspSetCreateProcessNotifyRoutine() - 查找
lea指令获取数组地址
- 从
-
回调结构:
typedef struct _EX_CALLBACK_ROUTINE_BLOCK { EX_RUNDOWN_REF RundownProtect; PEX_CALLBACK_FUNCTION Function; // 回调函数地址 PVOID Context; } EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK; -
修补方法:
- 将回调函数地址置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等新技术增加防护
- 硬件级安全方案普及
- 攻击检测技术智能化
-
防御建议:
- 部署多层次防护体系
- 监控驱动加载行为
- 实施严格的证书管理
- 定期更新安全策略
附录:关键代码片段
// 获取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);
}
}
参考资源
- 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手册