关于ETW (Event Tracing for Windows)

ETW介绍

事件追踪 Event Tracing for Windows (ETW) 是Windows系统内置的强大事件跟踪机制。它可以收集在系统上不同事件和活动的详细信息。这些事件可以是由系统本身发起的(例如加载一个DLL)或者由用户发起的(例如打开一个文件)。

无论是用户的程序,还是内核驱动生成的事件都会被ETW记录在日志里面,我们就可以去分析日志知道系统发生了什么。所以对防守方(杀软,EDR啥的),ETW是一个非常实用的工具

ETW的组成

提供程序 (Providers) - 提供程序是最上级组件,他们负责生成事件。提供程序可以是用户模式应用、内核模式驱动程序,或 Windows 内核本身。每个提供程序由一个独有的 GUID 作为标识。

(跟踪)会话 (Tracing session) - “ETW 会话基础结构充当中间代理,将事件从一个或多个提供程序中继给使用者。 会话是一个内核对象,它将事件收集到内核缓冲区中,并将其发送到指定的文件或实时使用者进程。 可以将多个提供程序映射到单个会话,让用户能够从多个源收集数据。” 简而言之,ETW 会话可作为一个了一个中心容器来负责从单个或者多个 ETW 提供程序中收集和管理事件。

控制器 (Controllers) - 控制器负责“启动”、“停止”或”更新”跟踪会话。当一个会话被启用后,指定的 ETW 提供程序就可以开始发送事件给这个会话,这时使用者 (consumers) 也可以读取这些事件了。

使用者 (Consumers) - 使用者是一个应用连接到 ETW 会话来读取已记录的跟踪文件,或者实时捕获活动跟踪会话中的事件并处理事件。一个会话可以不需要任何使用者并保持运行。此外,ETW 使用者可以连接到多个会话,这样使用者可以同时读取多种类型的日志事件(例如系统事件和网络事件)。
Windows 的事件查看器和资源监视器都是内置的 ETW 使用者应用。

ETW实现原理

(不知道说的对不对,但是查阅资料是这样的)

ETW 的原理是通过在内核态和用户态的一些关键 API 入口处加入ETW的函数,记录事件数据。这些函数通常内置在 Windows 内核中,能够跟踪包括文件操作、进程/线程管理、网络通信等。

当应用程序调用这些被钩住的 API 时,ETW 收集到的数据包括调用进程的 ID、执行线程的 ID、时间戳、参数(如文件路径、句柄、操作类型等),然后将这些信息封装为事件。

ETW 使用高速缓冲区收集事件数据,这些数据会存储在内存中,然后可以根据预设的追踪配置(如追踪某个特定应用的行为)或通过配置的事件消费者(Trace Session)将事件日志记录下来。

每个被跟踪的事件都有其唯一的 GUID,以区分不同类型的操作。比如,一个文件打开操作和一个线程创建操作的事件类型不同,但都可以通过 ETW 被记录

ETW 的事件Consumers可以是调试工具、系统日志工具(如 Windows Performance Recorder 或 Event Viewer),或者你自定义的程序。它们通过访问 ETW 提供的事件数据流,分析哪些程序触发了哪些事件。

具体来说,我们可以这样验证

ntoskrnl.exe 是我们熟知的操作系统内核可执行文件,包含了 NT 内核的执行层面和负责硬件抽象、句柄管理、和内存管理等。内核通过 EtwTi 函数来管理 ETW。Ti 表示 “threat intelligence” - 威胁情报。

通过查阅资料了解到,当我们在用户模式下调用 WriteProcessMemory 会对应执行 NtWriteVirtualMemory,随之会调用 MiReadWriteVirtualMemory,最后,EtwTiLogReadWriteVm 会被调用来记录读写操作。

我们可以通过 IDA 来看看 MiReadWriteVirtualMemory 的流程。

1729435089828

通过查找 MiReadWriteVirtualMemory 我们发现 NtReadVirtualMemoryNtWriteVirtualMemory、和NtReadVirtualMemoryEx 都会调用 MiReadWriteVirtualMemory

EtwTiLogReadWriteVm 就是我们要找的 EtwTi 函数用于记录读写操作。

所以以上的验证应该没错