基于ETW的Windows网络分析工具

2,143 阅读3分钟

PNetAnalyzer

PNetAnalyzer is a process-network monitor based on ETW.

库的地址: 👉PNetAnalyzer

TraceEvent原理

详解请参考The TraceEvent Library Programmers Guide.

ETW的架构组成有三部分如下:

image.png

  1. Event Session: 对应c#类Microsoft.Diagnostics.Tracing.TraceEventSession, 扮演着整个ETW机制中"控制器"的角色,它可以决定采集什么类型的Event Provider所提供的日志信息,什么时候采集开始/结束,采集数据的转发/存储等;
  2. Event Provider: 对应c#类Microsoft.Diagnostics.Tracing.EventSource, 在ETW中作为一个"生产者"的角色而存在,它是windows日志系统的一部分,用户可以根据不同的Provider来获取自己感兴趣的内容;
  3. Event Consumer: 对应c#类Microsoft.Diagnostics.Tracing.TraceEventSource, 从文件或者Comsumer处拿出数据进行分析整理。

Event Consumer拿到的数据是UNPARSED数据,此处就用到了TraceEventParser之类的解析器来对原始数据进行解析。解析的方法有两种:

  1. 运行时解析: 简单来说就是拿到原始数据再由用户来解析;
  2. 编译期解析: etw提供了一些解析类,通过这些类,用户就不用对原始数据进行格式化;

不同点点击👉: Static vs. Dynamic TraceEventParser parsers

对于编译期解析而言,ETW提供了下图的一些类:

image.png

  • KernelTraceEventParser: 解析内核事件,例如DLL loading, process start/stop, CPU sampling, page faults, Disk I/O file I/O, memory, etc;
  • ClrTraceEventParser: 解析.NET CLR事件,例如GC events, Just in Time compilation events, Exception events, etc;
  • DynamicTraceEventParser: 清楚每个Event Provider的格式,该parser在运行时通过manifests对不同的provider数据进行解析;
  • RegisteredTraceEventParser: 解析每一个在上操作系统使用wevtutil命令行引起的注册事件;
  • WPPTraceEventParser: 解析每一个使用WPP Tracing system引起的事件, 设备驱动和其它基础组件使用该机制;
  • JScriptTraceEventParser: 解析JavaScript运行时事件;
  • TPLTraceEventParser: 解析Task Parallel库事件(例如c#的System.Threading.Tasks);
  • ASPNetTraceEventParser: 解析ASP.NET事件;

Overview

参考👉: Review of the Fundamental TraceEvent Architecture

  1. TraceEventSession开启新的ETW sessions来监控相关的ETW providers,并将数据重定向;

  2. ETW providers有两种:

    • windows os kernel provider,包括.NET, JScript运行时等;
    • 用户自定义的Event Provider;
  3. hook相关的ETWTraceEventSource来获取相关的event数据流;

  4. ETWTraceEventSource的提供的事件数据是为解析的,因此需要使用相关的TraceEventParser来对数据进行解析:

    • 编译期解析: 要解析的event格式在编译期已经确定,因此使用这种方法效率会很高(编译期解析需要使用TraceParserGen生成相关的minifests,系统的event几乎都有相关的manifests,因此不用用户生成);
    • 运行时解析: 用户运行时手动解析hook到的event事件数据;
  5. 在确定了想要关注的etw providers之后,调用ETWTraceEventSource.Process()来获取ETW数据流,并对数据进行处理。

PerfView

perfview是一款微软基于TraceEventLibrary开发的开源性能分析工具。

Pktmon

pktmon 是一个windows官方提供的非常强大的网络诊断工具,它有两种基本模式tracecapture:

  1. trace模式: pktmon会通过trace不同的ETW provider来获取不同的性能数据;
  2. capture模式: 会像wireshark一样进行抓包;

Reference

Components

Event Tracing for Windows (ETW)

Listing of ETW (Event Tracing for Windows) Providers and their GUIDs for Windows 7 x64