ETW注册表监控内核实现分析
ETW是一个高性能、高灵活性的跟踪设施,内置于Windows操作系统中。它提供了一个标准化的机制来收集和记录系统事件和应用程序事件,这对于调试、性能分析、安全审计以及系统监控非常有用。
ETW 体系结构主要有四个主要组件:提供程序Providers、会话Session、控制器Controller和使用者Consumer。
Providers
Providers负责生成事件,用户模式应用或内核驱动程序或window系统内核本身,提供程序必须在 ETW 中注册,通过调用 ETW 日志记录 API 发送事件。
Consumer
Consumer实时地接收ETW缓冲区中的数据或者是日志文件中订阅事件。Consumer主要的作用是提供Event Trace Callback。我们可以设计一个通用的callback来处理所有的事件,也可以为特定的我们感兴趣的事件设计callback。对于通用事件的callback。实时地接收ETW缓冲区中的数据。
常见的Consumer有WPA、PerfMon、Resource Monitor。
Session
Session提供了一个接收、存储、处理和分发事件的执行上下文。负责记录Provider生成的事件,管理和刷新缓存,每个进程的内核缓存是不可以换页的内存池,事件可以实时分发给给消费者应用,事件可以存放指定文件
Controller
controller主要控制Session 的启动与停止,利用StartTrace在内存中创建一个Event Trace session,这样Provider就知道该往哪里发生事件,而Controller也会负责将Session里记录的事件送到Consumer。
注册表监控内核分析
Windows的内核程序ntoskrnl.exe初始化的时候会启动和初始化很多信息,启动ETW组件就是其中一项内容,在void __fastcall EtwInitialize(unsigned int Phase)函数中,调用EtwRegister函数去注册一些Etw事件,
通过IDA分析,EtwInitialize调用了EtwRegister函数去注册注册表provider,EtwRegister注册的回调函数是EtwpRegTraceEnableCallback,注册返回的句柄EtwpRegTraceHandle,最后内核也是通过EtwWrite写句柄EtwpRegTraceHandle方式输出日志。
RegistryProvGuid 为注册表的provider的GUID:{70eb4f03–c1de–4f73–a051–33d13d5413bd}
EtwpRegTraceEnableCallback回调函数中,通过调用标准注册表监控回调接口CmRegisterCallback 注册回调函数EtwpRegTraceCallback。
使用中发现监控返回值无法返回键值的基础信息,key路径和键值value等信息不全。
if ( FilterData && FilterData->Size == 4 )
EtwpRegTraceOptions = *Ptr;
这两行代码是设置过滤条件,设置EtwpRegTraceOptions的全局值,设置不同的数值会输出不同的数据,默认0,当EtwpRegTraceOptions为0时内核只会输出一些基本的key 、Type值,但不会输出一些很具体的key完整路径,value data等数据。
所以我们自己编写注册表的监控程序的时,一定要启用这个对应注册表追溯项,下图是关键参数位置代码
通过IDA交叉引用可以看出,注册表EtwpRegTraceEnableCallback回调函数内部是通过EtwWrite写句柄EtwpRegTraceHandle来输出日志。
参考:
learn.microsoft.com/en-gb/windows-hardware/test/weg/instrumenting-your-code-with-etw