开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 27146|回复: 75
收起左侧

[技术专题] 【Etw系列】你想知道的关于ETW的信息,都在这里……

  [复制链接]
发表于 2022-7-14 13:49:54 | 显示全部楼层 |阅读模式   四川省宜宾市

Etw系列:

ETW的基础信息:

  • 在 Windows 2000 之前,Windows 中仅提供基于文本的基本跟踪机制:DbgPrint() 和 DebugPrint() API。 它们需要调试器,并且通常无法动态记录数据。 随着时间的推移,Windows 跟踪机制不断发展;现今,有四种不同的跟踪机制可用。 ETW 和事件日志 API 集已合并到 Windows Vista 中的统一事件日志记录 API 集,这为用户和开发人员提供了一个统一的机制来引发事件。

  • 什么是ETW?ETW,全称Event Tracing for Windows。它提供了一种对用户层应用程序和内核层驱动创建的事件对象的跟踪记录机制。为开发者提供了一套快速、可靠、通用的一系列事件跟踪特性。

  • ETW具有以下优点:

    • 强有效的:它提供了高效的缓冲和日志记录机制。 跟踪缓冲区是由内核管理的。 通过 ETW 进行跟踪不受应用崩溃和挂起的影响。 如果系统发生故障,可以在内存转储文件中访问未保存的事件。
    • 动态化:无需重新启动系统或重启应用即可动态启动、停止、重新配置和暂停跟踪会话。 ETW 提供了多种模式,可以满足各种需求。
    • 内置在 Windows 中:直接使用WIN32API即可控制使用。
    • 轻量化:由于历史跟踪和保存的日志文件的开销经过高度优化,它们不会影响应用或系统性能。
    • 缓存记录:日志记录机制使用内核模式缓冲区,这些缓冲区由一个单独的编写器线程写入磁盘,因此跟踪的开销是有限的。
  • ETW具有以下特性:

    • 开发人员可以根据预期用途选择合适的实现集。
    • ETW可记录基础结构管理常用信息,如时间戳、函数名称和源文件行号。
    • 相同的实现用于用户模式应用和内核模式组件。
    • ETW 可在故障转储和实时调试中进行访问。
    • ETW 可以被重定向到内核调试器以进行实时查看。
    • ETW 具有实时视图。
    • 日志文件保存在二进制日志文件(ETL 文件)中。
    • ETW 支持多进程日志记录。
    • ETW 具有高吞吐量。
    • 可以在另一台计算机上查看日志文件。
    • ETW 支持循环缓冲,以实现持续日志记录和监视。
    • ETW 可以根据目标受众分组到一个通道中。
  • ETW有三种类型的事件:

    • 1.Windows 软件跟踪预处理器 (WPP) 和经典 ETW。
    • 2.托管对象格式 (MOF):MOF 是一种描述 WMI 对象以及启用和解码事件的方法。
    • 3.基于清单:在 Windows Vista 中引入了一个基于 XML 的统一跟踪定义。 XML 文件包含提供程序写入的事件的元素。

ETW的体系结构

  • ETW 中有四个主要组件:提供程序(Provider)、会话(Session)、控制器(Controller)和使用者(Comsumer)

  • 提供程序(Provider):

    • 提供程序是一个工具化组件,可以生成事件。 提供程序可以是用户模式应用、内核模式驱动程序,或 Windows 内核本身。 除了固定的事件数据(标头)之外,事件还可以携带用户数据。
    • 提供程序必须在 ETW 中注册,并通过调用 ETW 日志记录 API 发送事件。 提供程序为启用和禁用通知注册了一个回调函数,这样就可以动态地启用和禁用跟踪。
  • 会话(Session):

    • ETW 会话基础结构充当中间代理,将事件从一个或多个提供程序中继给使用者。 会话是一个内核对象,它将事件收集到内核缓冲区中,并将其发送到指定的文件或实时使用者进程。 可以将多个提供程序映射到单个会话,让用户能够从多个源收集数据。
    • Session由系统内核控制。
    • 所谓驱动的InfinityHook,其实是启用了Circular Kernel Session Provider中的syscall监听,然后劫持掉系统内核中ETW Session部分的EtwpGetCycleCount函数,然后向上遍历堆栈,获取到syscall的入口,然后直接修改当前syscall指向的真实函数,从而实现内核函数的Hook(InfinityHook没有修改SSDT等受保护部分,所以根本不会触发KPP。这实际上是ETW设计中的一个内核漏洞。后微软修改了EtwpGetCycleCount的实现,造成老InfinityHook失效)
  • 控制器(Controller):

    • 控制器启动、停止或更新跟踪会话。 会话是用于跟踪的单元。 提供程序被映射(或启用)到特定会话。 控制器启用和禁用提供程序,使它们可以开始向 ETW 发送事件。
  • 使用者(Comsumer):

    • 使用者是一个应用,它读取已记录的跟踪文件(ETL 文件),或者实时捕获活动跟踪会话中的事件,并处理事件。 Windows内置的事件查看器和资源监视器都是ETW 使用者应用。

如何使用ETW:

  • 提示:本贴中不会说明如何创建“提供程序(Provider)”,有兴趣者可自行去GitHub上学习。

  • 创建控制器(Controller):

    • 利用StartTraceA和EnableTraceEx即可创建Controller,具体过程如下:
    • StartTraceA:
    • m_TraceConfig.Wnode.BufferSize表示给StartTraceA的事件结构的大小
    • m_TraceConfig.Wnode.Flags表示这个Controller监听的提供程序标识(使用GUID)
    • m_TraceConfig.Wnode.ClientContext表示记录每个事件的时间戳时使用的时钟分辨率。
    • m_TraceConfig.BufferSize表示为每个事件跟踪会话缓冲区分配的千字节内存大小。
    • m_TraceConfig.MinimumBuffers为跟踪会话的缓冲池保留的最小缓冲区数。
    • m_TraceConfig.LogFileMode表示事件跟踪会话的日志记录标志。使用此成员可以指定是要将事件写入内存中的循环缓冲区、日志文件还是实时使用者。(这里使用实时)
    • m_TraceConfig.LoggerNameOffset表示启动的Controller的名称的偏移(从结构的已分配内存的开头到包含会话名称的 nul 终止字符串的开头的偏移量)
    • m_TraceConfig.FlushTimer表示刷新任何非空跟踪缓冲区的频率(以秒为单位)。对于实时会话:将 FlushTimer 设置为 0 将启用默认超时 1 秒。(系统强制要求最低为1秒以减少CPU开销,这是造成用户层监听内核层产生延迟的最大的原因)
    • EnableTraceEx:
    • EnableTraceEx用于配置Controller将什么事件记录到跟踪会话。
    • 例如上方使用了ProcessGUID(这是一个manifest提供的ETW事件),其事件全称为Microsoft-Windows-Kernel-Process(点击这里看Microsoft-Windows-Kernel-Process的完整manifest接口,点击这里看Microsoft-Windows-Kernel-Process反馈的事件参数信息)
    • 这个GUID是怎么从“{22fb2cd6-0e7b-422b-a0c7-2fad1fd0e716}”转换到图中的样子的?图中表示的其实是这个GUID的内存表示,具体可以在C++中使用DEFINE_GUID将GUID定义,在使用CE等程序查看其内存表示。(其实也不需要,GUID组成是1个4字节int,2个双字节word和8个byte组成,根据GUID可直接推算其内存形式,不过要注意内存大小端的问题)
  • 使用者(Comsumer):

    • 利用OpenTraceA和ProcessTrace函数创建Comsumer。
    • OpenTraceA:
    • OpenTraceA告诉系统我们监听的Controller名称叫什么,以及Comsumer的回调函数在哪里。
    • ProcessTrace则表示开始监视:
    • 注意:ProcessTrace是一个阻塞函数,在没有销毁Controller或Comsumer时不会返回,所以本ETW系列全部监听过程在非主线程中完成。
  • 回调函数(EVENT_RECORD_CALLBACK):

    • 具体可参考:PEVENT_RECORD_CALLBACK callback function
    • ETW最强势的部分在于回调信息的强大:
    • EVENT_RECORD会给你包括ProcessId、ThreadId、KernelTime、UserTime、ProviderId等非常详尽的基础信息,EVENT_RECORD->UserData则会给你本事件反馈的参数信息(这个可以在Windows10EtwEvents中查询相关函数的UserData的参数信息,应该有800多个大类事件,50000多个Events,覆盖Windows系统操作的方方面面,我只写了一些我感兴趣的事件的例子,实际还有非常多的事件等待探索)

PS:

  • 在“如何使用ETW”中我并没有说明MOF等经典事件和清单事件监听的区别,不过具体可以看之前的ETW系列来了解,更加细节的东西需要具体研究。
  • 系统的ETW的提供者可以在注 册表中查询到(不仅仅可以查询到GUID信息,还可以查询到Provider,例如Microsoft-Windows-Winsock-AFD可是实打实的afd.sys提供的,对Microsoft-Windows-Winsock-AFD的监听是实打实的内核监听):,位置:“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\”
  • 系统当前的Comsumer可以在“计算机管理”中查询到:
  • 希望本贴可对屏幕前的你有一点帮助,希望你可以利用ETW写出强大的监听程序。

参考文献:


点评

命令行CMD运行:logman.exe query providers 可获取全部可使用GUID   浙江省温州市  发表于 2022-12-27 16:58

评分

参与人数 29好评 +17 精币 +52 收起 理由
rszhao + 1 如果程序崩溃StopTraceA已过时,如何使用ControlTrace继续使用?
mypursue + 1 感谢分享,很给力!~
flyk + 1 感谢分享,很给力!~
hhhql + 1 感谢分享,很给力!~
XXGL2005 + 1 感谢分享,很给力!~
Arui + 1 感谢分享,很给力!~
ican8 + 1 感谢分享,很给力!~
无尘666 + 1 感谢分享,很给力!~
qiyuer + 1 感谢分享,很给力!~
※逍遥游※ + 1 感谢分享,很给力!~
mumulu + 1 感谢分享,很给力!~
微风已过 + 1 感谢分享,很给力!~
悟桐的深思 + 1 感谢分享,很给力!~
神女软件定制 + 1 + 3 支持开源~!感谢分享
天涯阿肯 + 1 + 2 感谢分享,很给力!~
完玩 + 1 + 2 精彩文章希望继续努力
流星暴雨 + 1 + 3 支持开源~!感谢分享
camingo + 1 + 2 此处应该有鼓励~
汉族 + 1 + 3 感谢分享,很给力!~
yujiekuxiao + 1 + 2 新技能已get√
z博士 + 1 + 2 开源精神必须支持~
国王软件 + 1 + 2 开源精神必须支持~
yjd + 1 + 2 感谢分享,很给力!~
勾栏听曲 + 1 + 2 能不能搞个模块出来
a524666979 + 1 + 2 支持开源~!感谢分享
1051496412 + 1 + 2 新技能已get√
Bszk + 1 + 3 新技能已get√
冰点 + 1 + 5 感谢分享,很给力!~
外星人群控 + 1 + 3 开源精神必须支持~

查看全部评分


本帖被以下淘专辑推荐:

签到天数: 3 天

发表于 2023-6-29 07:30:25 | 显示全部楼层   浙江省杭州市

++

6666666666666666666
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2023-6-26 07:30:46 | 显示全部楼层   浙江省杭州市

++

6666666666666666666
回复 支持 反对

使用道具 举报

结帖率:100% (21/21)
发表于 2023-6-21 21:49:44 | 显示全部楼层   安徽省滁州市
感谢发布原创作品,精易因你更精彩!
回复 支持 反对

使用道具 举报

结帖率:100% (21/21)
发表于 2023-6-18 10:14:57 | 显示全部楼层   安徽省滁州市
        YYDS大佬!!!
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2023-6-5 21:40:40 | 显示全部楼层   香港特别行政区大埔区
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

签到天数: 6 天

发表于 2023-6-4 16:36:38 | 显示全部楼层   广东省阳江市
所有Wtw系列。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

结帖率:0% (0/4)

签到天数: 1 天

发表于 2023-5-31 22:01:25 | 显示全部楼层   河南省许昌市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

发表于 2023-5-28 16:51:04 | 显示全部楼层   安徽省合肥市
tfsssssssssssssssss
回复 支持 反对

使用道具 举报

结帖率:100% (21/21)
发表于 2023-5-22 15:24:42 | 显示全部楼层   安徽省合肥市
还能这样真心大佬
回复 支持 反对

使用道具 举报

签到天数: 3 天

发表于 2023-5-17 07:30:45 | 显示全部楼层   浙江省杭州市

++

感谢分享,很给力!~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表