ETW(Event Trace For Windows) 最后更新时间:2025年12月04日 ### 什么是ETW? ETW,全称 Event Trace For Windows,是微软在Windows中提供的一种高效事件记录机制。简单来讲,可以把它看成一个大型日志系统,能够从程序、内核、驱动收集各种运行信息。 1. ETW的特性: - 轻量化:ETW在运行时对系统性能的影响微乎其微,因此可以安全地用于生产环境。 - 实时性:你可以实时捕获和分析事件,而不需要重启系统或应用。 - 灵活性:支持自定义事件,开发者可以根据需要定义自己的事件并收集数据。 2. ETW的主要用途: - 性能分析: ETW可以捕获系统和应用程序的性能指标,从而做到优化程序的运行效率。 - 故障排除: 借助ETW,可以通过程序的UI Delay时间、StackWalk等信息来捕获崩溃信息。 - 安全检查: ETW 还能记录一些与安全相关的事件,例如登录尝试、系统资源访问等。 3. ETW 的核心组件(三部分) - Provider(事件提供者): Provider 是 ETW 的数据生产者。它负责定义并生成事件数据。Provider 可以是 Windows 系统(如内核、驱动程序等),也可以是开发者自定义的应用程序。在实际使用中,每个 Provider 都有一个唯一的标识符(GUID)和一组定义的事件。 - Controller(控制器): Controller 主要负责控制 ETW 会话的行为。它的职责包括启动或停止会话、定义跟踪参数,如记录的事件类型、日志大小等。 - Consumer(事件消费者): 日志数据的消费者,根据情况,接收日志信息的对象。 ### ETW 能采集的典型进程行为包括: | 行为类型 | 对应的 ETW Provider | 说明 | |----------|---------------------|------| | **进程创建/退出** | `Microsoft-Windows-Kernel-Process` | 捕获 `Process Create`(Event ID 1)、`Process Terminate`(Event ID 2)等 | | **线程创建/退出** | `Microsoft-Windows-Kernel-Thread` | 线程级行为跟踪 | | **映像加载(DLL/EXE)** | `Microsoft-Windows-Kernel-Image` | 记录进程加载了哪些模块(如 DLL 注入) | | **文件 I/O 操作** | `Microsoft-Windows-Kernel-FileIO` | 进程读写文件的行为 | | **网络活动** | `Microsoft-Windows-Kernel-Network` 或 `Microsoft-Windows-TCPIP` | TCP/UDP 连接、收发包等 | | **注册表访问** | `Microsoft-Windows-Kernel-Registry` | 进程对注册表的读写操作 | | **上下文切换 / CPU 调度** | `Microsoft-Windows-Kernel-Processor` | 可用于分析进程 CPU 使用情况 | | **安全相关行为(如令牌变化)** | `Microsoft-Windows-Security-Auditing` | 需配合审核策略启用 | > 上述大部分属于 **内核提供者(Kernel Providers)**,由 Windows 内核直接发出事件,覆盖全系统所有进程。 --- ### 示例:捕获所有进程的启动与退出 使用 **Windows Performance Recorder (WPR)** 或命令行工具: ```cmd # 使用 logman 启动一个会话,监听进程和映像事件 logman start ProcTrace -p "Microsoft-Windows-Kernel-Process" 0x10 0xff -p "Microsoft-Windows-Kernel-Image" 0x10 0xff -o proc_trace.etl -ets ``` - `0x10` 是进程创建/退出的关键字(Keyword) - `0xff` 是日志级别(Level),表示记录所有级别(Verbose) 运行一段时间后停止: ```cmd logman stop ProcTrace -ets ``` 然后用 **Windows Performance Analyzer (WPA)** 或 **PerfView** 打开 `proc_trace.etl`,即可看到: - 每个新进程的 PID、PPID、命令行(如果启用了命令行捕获) - 进程退出时间 - 加载了哪些 DLL - 启动该进程的父进程是谁 > **注意**:默认情况下,`Process Create` 事件 **不包含命令行参数**。若需命令行,需启用额外的审计策略或使用 `Microsoft-Windows-Sysmon`(第三方但广泛使用)。 --- ### 限制与注意事项 1. **命令行参数默认不可见** Windows 内核的 `Process Create` 事件在较新版本(Win10 1809+)中可通过特定配置记录命令行,但需: - 启用 **“Audit Process Creation”** 安全策略(本地安全策略 → 审核策略) - 或使用 **Sysmon**(System Monitor,微软 Sysinternals 工具) 2. **权限要求** 捕获内核级 ETW 事件通常需要 **管理员权限** 或 **SYSTEM 权限**。 3. **性能影响** 虽然 ETW 开销低,但如果同时启用大量高频率事件(如 FileIO + Registry + Network),仍可能影响系统性能。 4. **隐私与安全策略** 在企业环境或受限制的 Windows 版本中,某些 ETW 提供者可能被组策略禁用。 --- ### 替代方案:Sysmon 如果你需要更详细、更易用的进程行为监控(如完整命令行、哈希、父子进程链、远程线程创建等),推荐结合使用 **[Sysmon](https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon)**: - Sysmon 本身基于 ETW 和驱动实现 - 输出结构化日志到 Windows Event Log - 支持高度可配置的过滤规则
Comments | NOTHING