AsuNa-jp/TLGMapper
GitHub: AsuNa-jp/TLGMapper
一款 IDA Pro 脚本,用于静态解析 x64 PE 文件中嵌入的 TraceLogging ETW 元数据,并通过数据流和调用图分析将事件关联到其所属提供程序和触发函数。
Stars: 19 | Forks: 6

# 🔍 TLGMapper
🪵 一款 IDA Pro 脚本,用于解析 x64 PE 二进制文件中嵌入的 [TraceLogging](https://learn.microsoft.com/en-us/windows/win32/tracelogging/trace-logging-portal) 元数据,并将每个事件解析到其所属的 ETW 提供程序以及触发该事件的函数。
## 🧭 概述
使用 TraceLogging 检测的 Windows 二进制文件会将自描述的 ETW 元数据直接嵌入到二进制文件中。`TLGMapper` 会提取这些元数据,枚举所有的提供程序和事件,然后使用数据流和调用图分析将每个事件链接回实际发出该事件的函数。
这对于以下用途以及其他目的(如取证和动态分析)非常有用。
- 🕵️ **逆向工程** — 无需运行即可快速了解二进制文件生成的 TraceLogging ETW 事件。
- 🛡️ **检测工程** — 通过识别二进制文件可以发出的 TraceLogging ETW 事件,有助于发现可用于检测恶意活动的事件。
## ⚙️ 工作原理
该脚本分两个阶段运行:
### 📦 阶段 A — 元数据提取
1. 🔎 **查找 ETW0 头部** — 在非可执行段中扫描具有预期 magic 值 (`0xBB8A052B88040E86`) 的 `ETW0` 签名。
2. 🧩 **解析 blob** — 在每个头部之后按顺序遍历 blob 流,解码提供程序 blob(Type 2 / Type 4)和事件 blob(Type 3 / Type 5 / Type 6),包括所有字段描述符。
3. 📌 **定位 `_tlgProvider_t`** — 通过匹配已知的元数据指针,在 `.data` 段中搜索运行时提供程序结构。
### 🔗 阶段 B — 提供程序-事件-函数解析
通过 `DataRefsFrom` 和 `CodeRefsFrom` 遍历二进制文件中的每个函数,然后应用优先级链来确定哪个提供程序拥有每个事件:
| 优先级 | 方法 | 描述 |
|----------|--------|-------------|
| 🥇 1 | **SingleProvider** | 二进制文件仅包含一个提供程序 |
| 🥈 2 | **Direct-Preceding** | 提供程序引用出现在同一函数中的事件引用之前 |
| 🥉 3 | **Direct-Nearest** | 同一函数中按地址计算最接近的提供程序引用 |
| 🔗 4 | **CallGraph-d*N*** | 通过被调用者进行深度优先搜索(最大深度为 3),优先向后搜索 |
| ❓ 5 | **Unknown** | 无法解析任何提供程序 |
## 📋 系统要求
- 🧰 **IDA Pro**(带有 IDAPython)— 已在 IDA 8.x+ 上测试
- 💻 **x64 PE 二进制文件** — 该脚本目前仅支持 64 位二进制文件
不需要外部 Python 包;该脚本仅使用 IDA 的内置模块。
## 🚀 用法
### 🖥️ GUI 模式
1. 在 IDA Pro 中打开一个 64 位 PE 二进制文件。
2. 等待自动分析完成。
3. 转到 **File → Script file…** 并选择 `TLGMapper.py`。
将出现两个选择窗口:
- 📄 **TLG events** — 从 ETW0 元数据中提取的所有事件(名称、级别、关键字、操作码、通道、字段)。
- 🔗 **TLG linked** — 已解析的事件,包含调用者函数、提供程序、GUID 和置信度。双击任意行可跳转到相应的地址。
### ⚡ 批处理模式
```
ida64.exe -A -o"C:\output\.i64" -S"TLGMapper.py C:\output" -LC:\output\log.txt
```
在批处理模式下,脚本会将 CSV 文件(`_tlg.csv`)写入指定的输出目录并自动退出。
## 📊 输出字段
每条已解析的事件记录包含:
| 字段 | 描述 |
|-------|-------------|
| 🏷️ `Provider` | 所属 ETW 提供程序的名称 |
| 🪪 `GUID` | 提供程序 GUID |
| 📡 `Event` | 事件名称 |
| 📶 `Level` | 事件严重级别 |
| 🔑 `Keyword` | 事件关键字掩码 |
| 🧾 `Fields` | 以逗号分隔的 `name:type` 字段描述符列表 |
| 📞 `Caller` | 引用该事件的函数名称 |
| 📍 `InstructionEA` | 引用指令的地址 |
| ✅ `Confidence` | 所使用的解析方法(参见上文优先级链) |
## 💡 输出示例
```
============================================================
[*] TLGMapper.py — TraceLogging provider/event resolver
============================================================
[+] ETW0 header at 0x140364000 (flags=64bit)
[*] Parsed: 11 provider(s), 241 event(s)
Provider: InputCore GUID={5FB75EAC-9F0B-550C-339F-FC21FDE966CD}
Provider: Win32kClipboardAggregateProvider GUID={3EBCC356-DD7C-4CA7-8CD1-3C86C1FE14F5}
Provider: Win32kSyscallLogging GUID={CE20D1CC-FAEE-4EF6-9BF2-2837CEF71258}
Provider: Win32kTraceLogging GUID={487D6E37-1B9D-46D3-A8FD-54CE8BDF8A53}
....
[*] Locating _tlgProvider_t runtime structures...
[+] _tlgProvider_t 'InputCore' at 0x140398b80
[+] _tlgProvider_t 'Win32kTraceLogging' at 0x140398bb8
[+] _tlgProvider_t 'Win32kClipboardAggregateProvider' at 0x140398bf0
[+] _tlgProvider_t 'Microsoft.Windows.InteractiveCtrl' at 0x140398c28
....
[*] Walking functions for data references...
[*] Resolving providers per event...
[*] Total linked: 365
InputCore: 124 unique event(s)
Microsoft.Windows.InkProcessor: 2 unique event(s)
Microsoft.Windows.InteractiveCtrl: 1 unique event(s)
Microsoft.Windows.SimpleHapticsCtrl: 1 unique event(s)
Microsoft.Windows.TlgAggregateInternal: 1 unique event(s)
TelemetryAssert: 4 unique event(s)
Win32kClipboardAggregateProvider: 5 unique event(s)
Win32kTraceLogging: 61 unique event(s)
[Direct-Preceding]: 365
```
https://github.com/user-attachments/assets/c25b7da1-351f-4150-9729-ca8d3fd07264
## ⚠️ 限制
- 🚫 仅支持 x64 PE 二进制文件。不支持 32 位和非 PE 格式。
- 🌳 调用图 DFS 深度上限为 3,以避免过度遍历;可能会遗漏深度间接的事件注册。
- 🏷️ Type 2(旧版)提供程序 blob 不携带嵌入式 GUID,因此 GUID 将被报告为 `Unknown(Type2)`。
- 🧱 blob 解析器在遇到 128 个连续未知字节后会中止,这可能会导致在高度混淆的二进制文件中出现不完整的结果。
## ❗ 免责声明
本工具按“原样”提供,不提供任何形式的明示或暗示保证。作者对因使用或滥用本工具而造成的任何损害、数据丢失或其他不良影响不承担任何责任。使用风险由您自行承担。
本工具仅用于安全研究和逆向工程等合法目的。作者对因在未经授权或非法活动中使用本工具而产生的任何后果不承担责任。
## 📜 许可证
本项目基于 MIT 许可证授权。有关详细信息,请参见 LICENSE 文件。
## 🙏 致谢
- [Matt Graeber](https://github.com/mattifestation) — Matt 的 [TraceLogging 元数据 blob 解析器](https://gist.github.com/mattifestation/edbac1614694886c8ef4583149f53658) 在本工具的开发过程中发挥了不可估量的作用,并作为理解 TraceLogging 提供程序和事件 blob 内部结构的关键参考。
- [John Uhlmann](https://github.com/jdu2600) — 没有他,这个工具就不会存在。他激发了对这项研究的最初设想,并慷慨地分享了他关于 ETW 内部机制的深厚专业知识。他的 [API-To-ETW](https://github.com/jdu2600/API-To-ETW) 项目(将 Windows API 调用映射到底层的 ETW 事件)直接启发了 TLGMapper 的设计和实现方法。
标签:Conpot, DAST, DNS重绑定攻击, ETW, Event Tracing for Windows, IDA Pro, IDAPython, PE文件解析, T1027.005, TraceLogging, Windows安全, x64, 事件提供者, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 元数据提取, 安全脚本, 恶意软件分析, 网络安全审计, 调用图分析, 进程保护, 逆向工具, 逆向工程, 静态分析