gaasedelen/tenet

GitHub: gaasedelen/tenet

一个用于 IDA Pro 的执行追踪探索插件,支持双向时间导航和可视化断点分析。

Stars: 1530 | Forks: 160

# Tenet - 面向逆向工程师的执行跟踪探索器

Tenet Trace Explorer

## 概述 Tenet 是一个用于探索执行跟踪的 [IDA Pro](https://www.hex-rays.com/products/ida/) 插件。该插件的目标是在针对给定二进制文件导航执行跟踪时,提供更自然、更人性化的控制。这项工作的基础源于希望研究新的或创新的方法,以检查和提炼软件中复杂的执行模式。 有关此项目的更多背景信息,请阅读关于其初始发布的 [博客文章](http://blog.ret2.io/2021/04/20/tenet-trace-explorer/)。 特别感谢 [QIRA](https://github.com/geohot/qira) / [geohot](https://twitter.com/realGeorgeHotz) 等人提供的灵感。 ## 版本发布 * v0.2 -- 映像基址检测、单元格可视化、断点重构、错误修复。 * v0.1 -- 初始发布 # 安装说明 Tenet 是一个跨平台(Windows、macOS、Linux)的 Python 3 插件。它零第三方依赖,使得代码既便携又易于安装。 1. 在反汇编器的 Python 控制台中,运行以下命令以找到其插件目录: - **IDA Pro**: `import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")` 2. 将此仓库的 `/plugins/` 文件夹内容复制到列出的目录中。 3. 重启反汇编器。 此插件仅支持 IDA 7.5 及更新版本。 # 用法 一旦安装正确,反汇编器中将出现一个新的菜单条目。这可用于将外部收集的执行跟踪加载到 Tenet 中。

Load Tenet trace

由于这是初始版本,Tenet 仅接受简单的人类可读文本跟踪。有关跟踪格式、限制和参考跟踪器的更多信息,请参阅此仓库中的 [跟踪自述文件](https://github.com/gaasedelen/tenet/tree/master/tracers)。 ## 双向探索 在使用 Tenet 时,插件将“绘制”轨迹,以指示从当前活动执行跟踪中的位置向前(蓝色)和向后(红色)的执行流。

Tenet trails

要随时间向前或向后 `单步` 执行,只需 *在悬停在反汇编器右侧的时间线上时滚动*。要 `单步跳过` 函数调用,请在滚动时按住 `SHIFT`。 ## 跟踪时间线 跟踪时间线将停靠在反汇编器的右侧。此小部件用于可视化跟踪时间线上不同类型的事件,并执行上述的基本导航。

Zooming in on the trace timeline

通过 *单击并拖动时间线*,可以放大执行跟踪的特定部分。可以重复此操作任意次数,以达到所需的粒度。 ## 执行断点 双击寄存器窗口中的指令指针将其以红色高亮显示,揭示该指令在整个跟踪时间线上执行的所有位置。

Placing a breakpoint on the current instruction

要在执行之间跳转,请 *在悬停高亮显示的指令指针时向上或向下滚动*。 此外,您可以 *在反汇编列表中右键单击* 并选择一个基于导航的菜单条目,以快速跳转到感兴趣的指令的执行处。

Seeking to the first execution of an instruction

IDA 原生的 `F2` 热键也可用于在任意指令上设置断点。 ## 内存断点 通过双击堆栈或内存视图中的字节,您将立即看到该地址在整个跟踪时间线上的所有读/写操作可视化。黄色表示内存 *读取*,蓝色表示内存 *写入*。

Exploring memory accesses using memory breakpoints

可以使用与执行断点相同的技术来导航内存断点。双击一个字节,并 *在悬停选定的字节时滚动*,以将跟踪定位到其每次访问处。 *右键单击* 感兴趣的字节将为您提供在内存读取/写入/访问之间跳转的选项,如果您有特定的导航操作需求。

Memory seeking

要将内存视图导航到任意地址,请单击内存视图并按 `G`,输入地址或数据库符号以将视图定位到该处。 ## 区域断点 可以通过高亮显示一块内存并双击它来设置内存断点,从而跨内存区域设置断点。

Memory region access breakpoints

与普通内存断点一样,悬停该区域并 *滚动* 可用于遍历对所选内存区域的访问。 ## 寄存器定位 在逆向工程中,经常会遇到这样的情况,您会问自己 *“哪条指令将此寄存器设置为其当前值?”* 使用 Tenet,您只需单击一下即可向后定位到该指令。

Seeking to the previous register write

向后定位是跨越寄存器变化最常见的导航方向……但为了灵活性,您也可以使用寄存器右侧的蓝色箭头向前定位到下一次寄存器赋值。 ## 时间戳 Shell 提供了一个简单的“shell”来导航到跟踪中的特定时间戳。将时间戳粘贴(或输入……)到 shell 中,带或不带逗号均可。

Seeking around the trace using the timestamp shell

使用感叹号,您还可以定位到跟踪中指定的“百分比”。输入 `!100` 将定位到跟踪中的最后一条指令,而 `!50` 将定位到跟踪的大约 50% 处。`!last` 将定位到可在反汇编器中查看的最后一条可导航指令。 ## 主题 Tenet 附带两个默认主题 —— 一个“浅色”主题和一个“深色”主题。根据反汇编器当前使用的颜色,Tenet 将尝试选择最合适的主题。

Tenet Themes

主题文件以简单的 JSON 格式存储在磁盘上,并且高度可配置。如果您对默认主题或颜色不满意,可以创建自己的主题并直接放入用户主题目录中。 Tenet 将记住您的主题偏好,以便将来加载和使用。 # 常见问题解答 #### 问:如何使用 Tenet 记录执行跟踪? * *答:Tenet 是一个跟踪读取器,而不是跟踪记录器。您必须使用动态二进制插桩框架(或其他相关技术)来生成兼容的执行跟踪。有关现有跟踪器或如何实现自己的跟踪器的更多信息,请参阅 [跟踪](https://github.com/gaasedelen/tenet/tree/master/tracers) 自述文件。* #### 问:Tenet 支持加载哪些跟踪架构? * *答:仅支持 x86 和 AMD64,但代码库几乎完全与架构无关。* #### 问:Tenet 可以加载/导航多大的跟踪文件? * *答:Tenet 的跟踪读取器是纯 Python 编写的,它是作为 MVP(最小可行性产品)编写的。在原生后端替换它之前,无法保证超过 1000 万条指令的跟踪能够流畅导航。* #### 问:我加载了一个执行跟踪,现在有一个“.tt”文件。它是什么? * *答:当 Tenet 加载给定的文本跟踪时,它将解析、索引并将跟踪压缩为性能更高的格式。在随后的加载中,Tenet 将尝试加载“.tt”文件,其加载时间应仅为加载原始文本跟踪时间的一小部分。* #### 问:插件崩溃/抛出错误/显示错误的跟踪信息,我该怎么办? * *答:如果您遇到可重现的问题或不准确之处,请向此仓库提交 issue 并上传样本跟踪和可执行文件。* #### 问:我的跟踪中的内存正在变化,但该区域没有写入操作。这是一个 bug 吗!? * *答:您的日志文件可能没有捕获所有内存写入。例如,用户模式 DBI 通常不会获得外部写入进程内存的内存回调。这种情况最常发生在从文件或套接字读取时 —— 是内核将内存写入您指定的用户模式缓冲区,使得该事件对传统的插桩不可见。* * Microsoft TTD 通常表现出相同的行为,在没有对系统调用进行建模的情况下,这很难解决。 #### 问:这会被移植到 Binary Ninja / Ghidra / ... 吗? * *答:可能会,但不会很快(除非有 **重大** 激励)。作为一个面向研究的 projektu,主要的驱动力是开发组织 and 探索程序执行的新策略——而不是移植它们。* #### 问:我的组织想要支持这个项目,我们该如何提供帮助? * *答:如果没有资金,我能投入到这个项目的时间是有限的。如果您的组织对这里提出的想法感到兴奋,并且有能力提供资金以赞助专门的研发,请 [联系我们](https://ret2.io/contact)。* # 未来工作 如果时间和~~动力~~资金允许,未来的工作可能包括: * 从跟踪中过滤/凝聚库调用 * 寄存器/堆栈视图的指针分析(例如注释) * 原生 TraceFile 和 TraceReader 实现(例如更大、更快的跟踪) * 导航历史 + 书签视图(也许是二合一?) * 更丰富的跟踪信息学,对相关事件(例如函数调用)进行更积极的索引 * 跟踪制图,改进跟踪地理的总结和表示 * 使“cpu 架构”的选择/检测稍微不那么硬编码 * 更多开箱即用的跟踪桥接器,DynamoRIO、TTD、RR、QEMU、Bochs 等…… * 支持 Hex-Rays / 反编译视图(除了基本视图同步之外) * 改进自动加载或迭代跟踪的工作流 * 差异分析,高级“跟踪对比” * 更好的线程、时间片导航和分解 * 更好地支持导航“多模块”跟踪(例如全系统跟踪) * Binary Ninja 支持 * ... ? 我欢迎外部贡献、问题和功能请求。如果您希望它们被考虑用于未来的版本,请向此仓库的 `develop` 分支提交 pull request。 # 作者 * Markus Gaasedelen ([@gaasedelen](https://twitter.com/gaasedelen))
标签:Binary Analysis, Dynamic Instrumentation, IDA Pro 插件, Python, Trace Explorer, Wayback Machine, 二进制分析, 云安全运维, 云资产清单, 反汇编, 可配置连接, 恶意代码分析, 情报收集, 执行追踪, 无后门, 漏洞研究, 程序分析, 逆向工程, 配置文件