ETW内部机制概述
ETW(Windows事件追踪)的两个核心组件是提供者(providers)和消费者(consumers)。提供者将事件发送到ETW全局唯一标识符(GUID),事件会被写入文件、内存缓冲区或两者。每个Windows系统都有数百甚至数千个注册的提供者,可以通过logman query providers
命令查看。
消费者则是跟踪日志会话,从一个或多个提供者接收事件。例如依赖ETW数据进行检测的EDR产品,会消费来自安全相关ETW通道(如威胁情报通道)的事件。
查找ETW消费者进程
从用户模式获取ETW日志会话的消费者信息有限,因此我们需要转向内核调试会话。通过编写JavaScript脚本扫描所有进程的句柄表,寻找指向EtwConsumer
对象的句柄:
|
|
通过解析ETW_REALTIME_CONSUMER
结构体,我们可以获取订阅该日志会话的进程信息。更高效的方法是直接遍历WMI_LOGGER_CONTEXT
结构体中的Consumers
链表,该链表连接了所有订阅此日志会话的实时消费者结构。
查找提供者GUID
要了解哪些提供者通知特定的日志会话,我们需要检查ETW_SILODRIVERSTATE
结构中的EtwpGuidHashTable
字段。这个哈希表存储了所有已注册的提供者GUID,每个GUID条目包含一个EnableInfo
数组,记录该GUID为哪些日志会话提供事件。
通过以下JavaScript函数可以打印匹配特定LoggerID的GUID:
|
|
安全应用价值
这些技术可以帮助我们:
- 识别机器上运行的ETW日志会话
- 了解哪些进程通知每个GUID
- 发现哪些进程订阅了这些会话
- 识别被禁用的日志会话(可能是攻击者试图绕过安全检测)
从防御者角度,这提供了对ETW内部运作的更深入可见性;从攻击者角度,则有助于了解哪些ETW提供者被监控,哪些可以被安全忽略。
所有JavaScript函数已在GitHub开源,为安全研究人员提供了强大的ETW分析工具。