睡眠混淆技术分享(sleep obfuscation)
字数 1819 2025-08-30 06:50:35

睡眠混淆技术(Sleep Obfuscation)深度解析与对抗检测

1. 睡眠混淆技术概述

睡眠混淆是一种用于对抗内存检测的高级技术,通过在特定触发器触发或定时执行内存加解密、改变权限等操作来规避AV/EDR的检测。该技术主要用于隐藏恶意代码在内存中的存在,特别是在"睡眠"期间(即不活跃执行时)。

2. 关键技术实现

2.1 Ekko实现分析

Ekko是一个典型的睡眠混淆实现项目,其核心函数EkkoObf工作流程如下:

  1. 初始化阶段

    • 创建事件对象(CreateEventW)和定时器队列(CreateTimerQueue)
    • 获取关键函数地址:
      • NtContinue(来自ntdll.dll):用于切换线程上下文
      • SystemFunction032(来自Advapi32.dll):用于内存加密
  2. 上下文捕获

    • 使用RtlCaptureContext捕获当前线程上下文到CtxThread
    • 创建多个上下文副本用于不同ROP链阶段
  3. 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;
    
  4. 定时器执行

    • 通过CreateTimerQueueTimer安排ROP链分阶段执行
    • 使用NtContinue切换上下文执行各阶段操作

2.2 其他实现变种

  1. Cronos

    • 同样通过RtlCaptureContext获取线程上下文
    • 从加载模块中搜索特征码
    • 使用NtContinue切换上下文
  2. QuadSleep

    • 纯汇编实现
    • 使用SleepEx触发APC
    • 内存操作流程:RW → 加密 → 解密 → RWX

3. 检测方法与对抗技术

3.1 Hunt-Sleeping-Beacons检测框架

  1. WorkerFactory扫描

    • 通过NtQuerySystemInformation查询进程句柄信息
    • 获取所有WorkerFactory及其StartRoutine
    • 通过NtQueryInformationWorkerFactory查询StartParameter(指向TP_POOL的指针)
  2. 检测点

    • 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检测方法

  1. EtwTi-FluctuationMonitor

    • 监控内存权限频繁变化
    • 通过订阅Microsoft-Windows-Threat-IntelligenceKERNEL_THREATINT_KEYWORD_PROTECTVM_LOCAL
    • 设置回调检测权限变化:
      • 首次变化:标记为不可变(g_ImmutableCodePages)
      • 后续变化:若为不可变则告警
  2. 检测阈值

    • 默认阈值为1(即任何权限变化都会被检测)

4. 技术关键点总结

  1. 核心原理

    • 利用定时器/APC机制在非活跃期加密内存
    • 通过ROP/NtContinue实现无直接调用链的操作
    • 频繁修改内存权限(PAGE属性)隐藏恶意代码
  2. 对抗优势

    • 规避内存扫描
    • 破坏静态调用链分析
    • 增加动态分析难度
  3. 检测关键

    • 监控异常定时器行为
    • 检测非标准调用堆栈
    • 跟踪内存权限波动
    • 分析线程上下文异常

5. 防御建议

  1. 增强监控

    • 实现细粒度的定时器行为监控
    • 部署ETW-based内存波动检测
    • 监控NtContinue等关键API调用
  2. 行为分析

    • 建立内存权限修改基线
    • 检测异常ROP链模式
    • 分析线程上下文切换异常
  3. 技术组合

    • 结合静态特征与动态行为分析
    • 使用机器学习识别异常内存模式
    • 实施多层次的防御纵深

通过深入理解睡眠混淆技术的工作原理和实现细节,安全团队可以更有效地构建检测和防御机制,对抗这种高级内存规避技术。

睡眠混淆技术(Sleep Obfuscation)深度解析与对抗检测 1. 睡眠混淆技术概述 睡眠混淆是一种用于对抗内存检测的高级技术,通过在特定触发器触发或定时执行内存加解密、改变权限等操作来规避AV/EDR的检测。该技术主要用于隐藏恶意代码在内存中的存在,特别是在"睡眠"期间(即不活跃执行时)。 2. 关键技术实现 2.1 Ekko实现分析 Ekko是一个典型的睡眠混淆实现项目,其核心函数 EkkoObf 工作流程如下: 初始化阶段 : 创建事件对象( CreateEventW )和定时器队列( CreateTimerQueue ) 获取关键函数地址: NtContinue (来自ntdll.dll):用于切换线程上下文 SystemFunction032 (来自Advapi32.dll):用于内存加密 上下文捕获 : 使用 RtlCaptureContext 捕获当前线程上下文到 CtxThread 创建多个上下文副本用于不同ROP链阶段 ROP链构造 : 定时器执行 : 通过 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链模式 分析线程上下文切换异常 技术组合 : 结合静态特征与动态行为分析 使用机器学习识别异常内存模式 实施多层次的防御纵深 通过深入理解睡眠混淆技术的工作原理和实现细节,安全团队可以更有效地构建检测和防御机制,对抗这种高级内存规避技术。