深入探索ETW内部机制:安全研究与取证分析指南

本文深入解析Windows事件追踪(ETW)的内部工作原理,包括提供者与消费者的交互机制、日志会话的实时监控技术,以及如何通过内核调试获取ETW消费者进程和提供者GUID等关键安全信息。

ETW内部机制概述

ETW(Windows事件追踪)的两个核心组件是提供者(providers)和消费者(consumers)。提供者将事件发送到ETW全局唯一标识符(GUID),事件会被写入文件、内存缓冲区或两者。每个Windows系统都有数百甚至数千个注册的提供者,可以通过logman query providers命令查看。

消费者则是跟踪日志会话,从一个或多个提供者接收事件。例如依赖ETW数据进行检测的EDR产品,会消费来自安全相关ETW通道(如威胁情报通道)的事件。

查找ETW消费者进程

从用户模式获取ETW日志会话的消费者信息有限,因此我们需要转向内核调试会话。通过编写JavaScript脚本扫描所有进程的句柄表,寻找指向EtwConsumer对象的句柄:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function EtwConsumersForProcess(process) {
    let handles = process.Io.Handles;
    for (let handle of handles) {
        if (handle.Object.ObjectType === "EtwConsumer") {
            let consumer = host.createTypedObject(handle.Object.Body.address, "nt", "_ETW_REALTIME_CONSUMER");
            let loggerId = consumer.LoggerId;
            // 输出进程信息和LoggerID
        }
    }
}

通过解析ETW_REALTIME_CONSUMER结构体,我们可以获取订阅该日志会话的进程信息。更高效的方法是直接遍历WMI_LOGGER_CONTEXT结构体中的Consumers链表,该链表连接了所有订阅此日志会话的实时消费者结构。

查找提供者GUID

要了解哪些提供者通知特定的日志会话,我们需要检查ETW_SILODRIVERSTATE结构中的EtwpGuidHashTable字段。这个哈希表存储了所有已注册的提供者GUID,每个GUID条目包含一个EnableInfo数组,记录该GUID为哪些日志会话提供事件。

通过以下JavaScript函数可以打印匹配特定LoggerID的GUID:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function GetGuidsForLoggerId(loggerId, guidType) {
    let guidHashTable = typedhostSiloGlobals.EtwSiloState.EtwpGuidHashTable;
    for (let bucket of guidHashTable) {
        let guidEntries = host.namespace.Debugger.Utility.Collections.FromListEntry(
            bucket.ListHead[guidType], "nt!_ETW_GUID_ENTRY", "GuidList");
        for (let guid of guidEntries) {
            for (let enableInfo of guid.EnableInfo) {
                if (enableInfo.LoggerId === loggerId) {
                    // 输出GUID和提供者进程信息
                }
            }
        }
    }
}

安全应用价值

这些技术可以帮助我们:

  1. 识别机器上运行的ETW日志会话
  2. 了解哪些进程通知每个GUID
  3. 发现哪些进程订阅了这些会话
  4. 识别被禁用的日志会话(可能是攻击者试图绕过安全检测)

从防御者角度,这提供了对ETW内部运作的更深入可见性;从攻击者角度,则有助于了解哪些ETW提供者被监控,哪些可以被安全忽略。

所有JavaScript函数已在GitHub开源,为安全研究人员提供了强大的ETW分析工具。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计