Tenet Trace Explorer (修改版)
April 15, 2025 · View on GitHub
本项目是对 Tenet Trace Explorer 的修改版本,进行了一些改进和适配。
效果图
对抗虚假控制流、各种未知的混淆
使用单步执行可以有效对抗这些混淆。

分析算法
分析算法时可便捷查看内存变化信息。

时间回溯调试
支持向上单步、向下单步以及时间回溯。

- 红色为已经走过的路径。
- 蓝色为未来要走的路径。
例如,我们可以明确知道 BLR X8 跳转到了 B.CS,并且知道 B.CS 进行了向左的分支跳转。
寄存器跟踪

有两个左右的小按钮,可以找涉及到这个寄存器的上一条汇编的位置
时间旅行

主要改动
- 支持了 AArch64 架构的 Trace 格式导入。
- 解决了 ASLR 地址随机化后的基地址识别问题。
- 增加了单步调试等多个快捷键。
- 修复了原版存在的一些 Bug。
- 支持 IDA Pro 8.x 及 9.0。
- 美化了部分 UI 显示。
如何使用
-
安装插件
- 在 IDA Python 窗口输入以下命令获取插件目录路径:
import idaapi, os; print(os.path.join(idaapi.get_user_idadir(), "plugins")) - 将
tenet文件夹和tenet_plugin.py文件一起复制到上一步获取的plugins文件夹中。 - 重启 IDA Pro。
- 在 IDA Python 窗口输入以下命令获取插件目录路径:
-
加载 Trace 文件
- 打开
demo文件夹,将libRequestEncoder.so文件拖入 IDA Pro 进行分析。 - 在 IDA 窗口左上角选择
File -> Load File -> Tenet Trace File。 - 选择
demo文件夹中的log.txt文件打开。
- 打开
-
开始追踪
- 在 IDA 右下角的
Position输入框中输入1,跳转到 Trace 的起始位置。 - 或者使用快捷键(见下文)开始单步调试。
- 在 IDA 右下角的
快捷键


prev_insn: 回到上一个执行位置。step_into: 步入(F7)。step_out: 步出函数(有 Bug)。step_over: 步过(F8)。next_execution: 跳转到当前选中地址的下一次执行位置。- 例如,在以下循环中:
for(int i=0; i<10; i++){ printf("%d\n", i); // 假设当前选中此行 } - 如果当前
i的值是0,在printf行使用next_execution快捷键,则会直接跳转到下一次执行printf时(即i为1时)的状态。
- 例如,在以下循环中:
更多实用技巧(原版作者)
请参考原版作者的博客文章: Tenet: A Trace Explorer for Reverse Engineers
Trace 格式
Trace 文件的格式规范可以参考原版仓库中的 tracers 目录:
https://github.com/gaasedelen/tenet/tree/master/tracers
注意: 本项目使用的 Trace 格式针对 ASLR 进行了定制修改。请参考 demo 文件夹中 log.txt 的第一行输出格式。其他部分与原版作者的格式保持一致。