睡眠混淆技术分享(sleep obfuscation)
字数 1819 2025-08-30 06:50:35
睡眠混淆技术(Sleep Obfuscation)深度解析与对抗检测
1. 睡眠混淆技术概述
睡眠混淆是一种用于对抗内存检测的高级技术,通过在特定触发器触发或定时执行内存加解密、改变权限等操作来规避AV/EDR的检测。该技术主要用于隐藏恶意代码在内存中的存在,特别是在"睡眠"期间(即不活跃执行时)。
2. 关键技术实现
2.1 Ekko实现分析
Ekko是一个典型的睡眠混淆实现项目,其核心函数EkkoObf工作流程如下:
-
初始化阶段:
- 创建事件对象(
CreateEventW)和定时器队列(CreateTimerQueue) - 获取关键函数地址:
NtContinue(来自ntdll.dll):用于切换线程上下文SystemFunction032(来自Advapi32.dll):用于内存加密
- 创建事件对象(
-
上下文捕获:
- 使用
RtlCaptureContext捕获当前线程上下文到CtxThread - 创建多个上下文副本用于不同ROP链阶段
- 使用
-
ROP链构造:
// 修改内存属性为RW RopProtRW.Rsp -= 8; RopProtRW.Rip = VirtualProtect; RopProtRW.Rcx = ImageBase; RopProtRW.Rdx = ImageSize; RopProtRW.R8 = PAGE_READWRITE; RopProtRW.R9 = &OldProtect; // 加密内存 RopMemEnc.Rsp -= 8; RopMemEnc.Rip = SysFunc032; RopMemEnc.Rcx = &Img; RopMemEnc.Rdx = &Key; // 睡眠延迟 RopDelay.Rsp -= 8; RopDelay.Rip = WaitForSingleObject; RopDelay.Rcx = NtCurrentProcess(); RopDelay.Rdx = SleepTime; // 解密内存 RopMemDec.Rsp -= 8; RopMemDec.Rip = SysFunc032; RopMemDec.Rcx = &Img; RopMemDec.Rdx = &Key; // 恢复内存属性为RWX RopProtRX.Rsp -= 8; RopProtRX.Rip = VirtualProtect; RopProtRX.Rcx = ImageBase; RopProtRX.Rdx = ImageSize; RopProtRX.R8 = PAGE_EXECUTE_READWRITE; RopProtRX.R9 = &OldProtect; // 设置事件通知 RopSetEvt.Rsp -= 8; RopSetEvt.Rip = SetEvent; RopSetEvt.Rcx = hEvent; -
定时器执行:
- 通过
CreateTimerQueueTimer安排ROP链分阶段执行 - 使用
NtContinue切换上下文执行各阶段操作
- 通过
2.2 其他实现变种
-
Cronos:
- 同样通过
RtlCaptureContext获取线程上下文 - 从加载模块中搜索特征码
- 使用
NtContinue切换上下文
- 同样通过
-
QuadSleep:
- 纯汇编实现
- 使用
SleepEx触发APC - 内存操作流程:RW → 加密 → 解密 → RWX
3. 检测方法与对抗技术
3.1 Hunt-Sleeping-Beacons检测框架
-
WorkerFactory扫描:
- 通过
NtQuerySystemInformation查询进程句柄信息 - 获取所有WorkerFactory及其
StartRoutine - 通过
NtQueryInformationWorkerFactory查询StartParameter(指向TP_POOL的指针)
- 通过
-
检测点:
- suspicious_timer:检查TimerQueue是否异常
- blocking_apc:检查堆栈是否调用
KiUserApcDispatcher - blocking_timer:检查堆栈是否调用
RtlpTpTimerCallback - abnormal_intermodular_call:检测异常调用堆栈(如kernel32由ntdll调用)
- return_address_spoofing:检测返回地址是否为
jmp rbx/jmp rbp等 - stomped_module:检查返回地址模块是否被修改
- hardware_breakpoints:检测DR0-3/DR7寄存器
- non_executable_memory:检测无执行权限的调用地址
3.2 ETW检测方法
-
EtwTi-FluctuationMonitor:
- 监控内存权限频繁变化
- 通过订阅
Microsoft-Windows-Threat-Intelligence的KERNEL_THREATINT_KEYWORD_PROTECTVM_LOCAL - 设置回调检测权限变化:
- 首次变化:标记为不可变(
g_ImmutableCodePages) - 后续变化:若为不可变则告警
- 首次变化:标记为不可变(
-
检测阈值:
- 默认阈值为1(即任何权限变化都会被检测)
4. 技术关键点总结
-
核心原理:
- 利用定时器/APC机制在非活跃期加密内存
- 通过ROP/NtContinue实现无直接调用链的操作
- 频繁修改内存权限(PAGE属性)隐藏恶意代码
-
对抗优势:
- 规避内存扫描
- 破坏静态调用链分析
- 增加动态分析难度
-
检测关键:
- 监控异常定时器行为
- 检测非标准调用堆栈
- 跟踪内存权限波动
- 分析线程上下文异常
5. 防御建议
-
增强监控:
- 实现细粒度的定时器行为监控
- 部署ETW-based内存波动检测
- 监控
NtContinue等关键API调用
-
行为分析:
- 建立内存权限修改基线
- 检测异常ROP链模式
- 分析线程上下文切换异常
-
技术组合:
- 结合静态特征与动态行为分析
- 使用机器学习识别异常内存模式
- 实施多层次的防御纵深
通过深入理解睡眠混淆技术的工作原理和实现细节,安全团队可以更有效地构建检测和防御机制,对抗这种高级内存规避技术。