ETW机制详解与安全研究
字数 2408 2025-08-29 08:29:59

ETW机制详解与安全研究

1. ETW概述

ETW (Event Tracing for Windows) 是Windows提供的一个高效机制,用于跟踪和记录应用程序产生的事件。整个ETW体系由三个核心组件构成:

  • 提供者(Provider): 产生事件的组件,每个Provider都有唯一的GUID标识
  • 跟踪会话(Tracing Session): 收集和记录事件的会话
  • 消费者(Consumer): 接收和处理事件的组件

2. ETW基础操作

2.1 查询Provider信息

logman query providers  # 查看所有提供者
logman query providers "Provider Name"  # 查看特定Provider的事件

例如,进程创建监控的Provider是Microsoft-Windows-Kernel-Process

2.2 查询事件ID含义

wevtutil gp Microsoft-Windows-Kernel-Process /ge:true

2.3 查看运行中的消费者

logman query -ets  # 查看所有正在运行的跟踪会话

3. 用户模式API

3.1 基本API

  1. EventRegister: 注册ETW提供者

    • 参数: ProviderId(GUID), EnableCallback(回调函数), CallbackContext, RegHandle(返回句柄)
    • 示例GUID:
      GUID guid = { 0xd99e9dba, 0x1772, 0x407c, {0xa9, 0x60, 0x81, 0xa3, 0xd4, 0x52, 0x2a, 0x98} };
      
  2. EventUnregister: 取消注册ETW提供者

    • 参数: RegHandle(句柄)
  3. EventWrite: 写入事件

    • 参数: RegHandle(句柄), EventDescriptor(事件描述结构), UserDataCount(用户数据结构数量), UserData(用户数据指针)

3.2 事件描述结构

EVENT_DESCRIPTOR重要成员:

  • Level: 事件重要性级别
  • Task: 事件分类
  • Keyword: 事件分类

3.3 跟踪会话管理

  1. StartTrace: 启动事件追踪

    • 参数: TraceId(写回ID), InstanceName(名称), Properties(指向EVENT_TRACE_PROPERTIES结构)

    EVENT_TRACE_PROPERTIES重要成员:

    • Wnode.BufferSize: 结构体大小
    • Wnode.Flags: 特性
    • Wnode.ClientContext: 时间戳来源
    • LogFileMode: 日志存储模式
    • EnableFlags: 要捕获的事件类型
  2. ControlTrace: 控制跟踪会话

    • 当ControlCode设置为EVENT_TRACE_CONTROL_STOP时停止追踪
  3. QueryAllTraces: 查询所有运行中的跟踪会话属性

3.4 高级API

  1. EnableTraceEx2: 启用/禁用跟踪

    • 参数: ProviderId(GUID), ControlCode(禁用/启用), EnableParameters(指向ENABLE_TRACE_PARAMETERS结构)

    ENABLE_TRACE_PARAMETERS重要成员:

    • EnableProperty: 通常为0x41 (EVENT_ENABLE_PROPERTY_SID | EVENT_ENABLE_PROPERTY_ENABLE_KEYWORD_0)
  2. TdhEnumerateProviders: 获取所有提供者信息(GUID, nameoffset等)

  3. EnumerateTraceGuidsEx: 获取跟踪会话相关信息

4. ETW安全研究

4.1 ETW对抗技术

  1. 移除Autologger注册表项

    • 路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Autologger
    • 移除指定事件会话的提供者或修改Enable值
    • 效果: 重启后生效
  2. 修改Provider Properties

    • EVENT_ENABLE_PROPERTY_ENABLE_KEYWORD_0(0x40)替换为EVENT_ENABLE_PROPERTY_IGNORE_KEYWORD_0(0x10)
    • 结果: 不记录keyword为0的事件
    • 效果: 重启后生效
  3. 从事件会话中移除提供者

    • 需要SYSTEM权限
    • 立即生效
    • 命令行示例:
      logman update trace EventLog-Application --p Microsoft-Windows-PowerShell -ets --p取消订阅 -p订阅
      
  4. Hook ETW相关函数

    • 可Hook函数: EtwEventWrite, EtwpEventWriteFull(未导出), NtTraceEvent
    • 推荐Hook EtwpEventWriteFull
  5. 会话劫持

    • 步骤:
      1. 通过QueryAllTraces获取运行中的会话
      2. 遍历traceProps获取目标会话
      3. 通过ControlTrace停止会话
      4. 修改LogFileName
      5. 重新启动会话

4.2 内核ETW机制

  1. 威胁情报记录

    • 函数前缀: EtwTi (Threat-Intelligence)
    • 示例: EtwTiLogAllocExecVm记录内存分配执行事件
  2. 保护掩码转换

    • MiMakeProtectionMask将三环保护标志转换为内核标志
    • 例如: PAGE_READONLY(0x2) → MM_READONLY(0x1)
  3. ETW启用检查

    • EtwProviderEnabled: 检查Provider是否在指定level和keyword上启用
    • EtwEventEnabled: 检查是否启用了事件
    • 两者都返回TRUE才会记录日志

5. 参考资源

  1. ETW Internals for Security Research and Forensics
  2. Tampering with Windows Event Tracing
  3. ETW Event Tracing for Windows 101
  4. Uncovering Windows Events
  5. ETW Killer
  6. Bypassing ETW-based Solutions
  7. Evading Windows Defender ATP
ETW机制详解与安全研究 1. ETW概述 ETW (Event Tracing for Windows) 是Windows提供的一个高效机制,用于跟踪和记录应用程序产生的事件。整个ETW体系由三个核心组件构成: 提供者(Provider) : 产生事件的组件,每个Provider都有唯一的GUID标识 跟踪会话(Tracing Session) : 收集和记录事件的会话 消费者(Consumer) : 接收和处理事件的组件 2. ETW基础操作 2.1 查询Provider信息 例如,进程创建监控的Provider是 Microsoft-Windows-Kernel-Process 2.2 查询事件ID含义 2.3 查看运行中的消费者 3. 用户模式API 3.1 基本API EventRegister : 注册ETW提供者 参数: ProviderId(GUID), EnableCallback(回调函数), CallbackContext, RegHandle(返回句柄) 示例GUID: EventUnregister : 取消注册ETW提供者 参数: RegHandle(句柄) EventWrite : 写入事件 参数: RegHandle(句柄), EventDescriptor(事件描述结构), UserDataCount(用户数据结构数量), UserData(用户数据指针) 3.2 事件描述结构 EVENT_DESCRIPTOR 重要成员: Level: 事件重要性级别 Task: 事件分类 Keyword: 事件分类 3.3 跟踪会话管理 StartTrace : 启动事件追踪 参数: TraceId(写回ID), InstanceName(名称), Properties(指向EVENT_ TRACE_ PROPERTIES结构) EVENT_TRACE_PROPERTIES 重要成员: Wnode.BufferSize: 结构体大小 Wnode.Flags: 特性 Wnode.ClientContext: 时间戳来源 LogFileMode: 日志存储模式 EnableFlags: 要捕获的事件类型 ControlTrace : 控制跟踪会话 当ControlCode设置为 EVENT_TRACE_CONTROL_STOP 时停止追踪 QueryAllTraces : 查询所有运行中的跟踪会话属性 3.4 高级API EnableTraceEx2 : 启用/禁用跟踪 参数: ProviderId(GUID), ControlCode(禁用/启用), EnableParameters(指向ENABLE_ TRACE_ PARAMETERS结构) ENABLE_TRACE_PARAMETERS 重要成员: EnableProperty: 通常为0x41 ( EVENT_ENABLE_PROPERTY_SID | EVENT_ENABLE_PROPERTY_ENABLE_KEYWORD_0 ) TdhEnumerateProviders : 获取所有提供者信息(GUID, nameoffset等) EnumerateTraceGuidsEx : 获取跟踪会话相关信息 4. ETW安全研究 4.1 ETW对抗技术 移除Autologger注册表项 路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Autologger 移除指定事件会话的提供者或修改Enable值 效果: 重启后生效 修改Provider Properties 将 EVENT_ENABLE_PROPERTY_ENABLE_KEYWORD_0 (0x40)替换为 EVENT_ENABLE_PROPERTY_IGNORE_KEYWORD_0 (0x10) 结果: 不记录keyword为0的事件 效果: 重启后生效 从事件会话中移除提供者 需要SYSTEM权限 立即生效 命令行示例: Hook ETW相关函数 可Hook函数: EtwEventWrite , EtwpEventWriteFull (未导出), NtTraceEvent 推荐Hook EtwpEventWriteFull 会话劫持 步骤: 通过 QueryAllTraces 获取运行中的会话 遍历traceProps获取目标会话 通过 ControlTrace 停止会话 修改LogFileName 重新启动会话 4.2 内核ETW机制 威胁情报记录 函数前缀: EtwTi (Threat-Intelligence) 示例: EtwTiLogAllocExecVm 记录内存分配执行事件 保护掩码转换 MiMakeProtectionMask 将三环保护标志转换为内核标志 例如: PAGE_READONLY (0x2) → MM_READONLY (0x1) ETW启用检查 EtwProviderEnabled : 检查Provider是否在指定level和keyword上启用 EtwEventEnabled : 检查是否启用了事件 两者都返回TRUE才会记录日志 5. 参考资源 ETW Internals for Security Research and Forensics Tampering with Windows Event Tracing ETW Event Tracing for Windows 101 Uncovering Windows Events ETW Killer Bypassing ETW-based Solutions Evading Windows Defender ATP