Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
tenet — 一款面向逆向工程师的追踪浏览器 | Kitploit
工具/GitHubGitHub/gaasedelen/tenet
动态分析 (沙盒)逆向工程调试器二进制分析
GitHubgaasedelen/tenet

tenet

一款面向逆向工程师的追踪浏览器

查看仓库
1.5k1694年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Tenet - 逆向工程师的追踪浏览器

Tenet 追踪浏览器概览

概述

Tenet 是一款用于探索执行轨迹的 IDA Pro 插件。该插件的目标是提供更自然、更人性化的控制方式,以便在给定二进制文件中导航执行轨迹。这项工作的基础源于研究新的或创新方法来检查和提炼软件中复杂执行模式的愿望。

关于该项目的更多背景,请阅读其初始发布时的博客文章。

特别感谢 QIRA / geohot 等人带来的灵感。

发布版本

  • 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 中。

加载 Tenet 轨迹

由于这是初始版本,Tenet 仅接受简单的人类可读文本轨迹。请参阅本仓库中的追踪自述文件,了解更多关于轨迹格式、限制以及参考追踪器的信息。

双向探索

使用 Tenet 时,插件会‘绘制’轨迹,以指示从当前执行轨迹位置向前(蓝色)和向后(红色)的执行流。

Tenet 轨迹

要向前或向后步进时间,你只需在反汇编器右侧的时间线上方悬停并滚动。要步过函数调用,则在滚动时按住 SHIFT。

轨迹时间线

轨迹时间线将停靠在反汇编器的右侧。该组件用于可视化轨迹时间线上的不同类型事件,并执行上述基本导航。

放大轨迹时间线

通过在时间线上点击并拖动,可以放大执行轨迹的特定部分。此操作可以重复任意次数,以达到所需的粒度。

执行断点

在寄存器窗口中双击指令指针,会将其高亮为红色,显示该指令在轨迹时间线上所有被执行的位置。

在当前指令上设置断点

要在不同执行之间跳转,在悬停高亮指令指针时向上或向下滚动。

此外,你可以在反汇编列表中右键点击,然后选择一个基于导航的菜单项,快速定位到感兴趣指令的执行位置。

定位到指令的首次执行

IDA 原生的 F2 快捷键也可用于在任意指令上设置断点。

内存断点

在栈视图或内存视图中双击一个字节,你将立即看到对该地址的所有读/写在轨迹时间线上的可视化展示。黄色表示内存读取,蓝色表示内存写入。

使用内存断点探索内存访问

内存断点可以使用执行断点描述的相同技术进行导航。双击一个字节,然后在悬停所选字节时滚动,将轨迹定位到其每次访问。

右键点击感兴趣的字节将会提供选项,可以在内存读/写/访问之间进行定位,如果你有特定的导航需求。

内存定位

要将内存视图导航到任意地址,点击内存视图,然后按 G 输入地址或数据库符号,将视图定位到该位置。

区域断点

可以通过高亮一块内存区域,然后双击它来设置一个访问断点,从而在内存区域上设置内存断点。

内存区域访问断点

与普通内存断点一样,悬停在该区域并滚动可以遍历所选内存区域的访问。

寄存器定位

在逆向工程中,经常会遇到这样的情况:你问自己*‘是哪条指令将这个寄存器设置成当前值的?’*

使用 Tenet,你可以一键向后定位到那条指令。

定位到前一个寄存器写入

向后定位是跨寄存器变化导航中最常见的方向……但为了灵活起见,你也可以使用寄存器右侧的蓝色箭头向前定位到下一个寄存器赋值。

时间戳外壳

提供了一个简单的‘外壳’,用于导航到轨迹中的特定时间戳。将时间戳粘贴(或键入……)到外壳中,带或不带逗号均可。

使用时间戳外壳在轨迹中定位

使用感叹号,还可以定位到轨迹中的指定‘百分比’。输入 !100 将定位到轨迹中的最后一条指令,而 !50 将定位到轨迹的大约 50% 处。!last 将定位到反汇编器可查看的最后一条可导航指令。

主题

Tenet 自带两个默认主题——一个‘浅色’主题和一个‘深色’主题。根据你的反汇编器当前使用的颜色,Tenet 将尝试选择最合适的主题。

Tenet 主题

主题文件以简单的 JSON 格式存储在磁盘上,并且高度可配置。如果你对默认主题或颜色不满意,可以创建自己的主题,然后将其放入用户主题目录即可。

Tenet 会记住你的主题偏好,以便将来加载和使用。

常见问题解答

问:如何使用 Tenet 记录执行轨迹?

  • 答:Tenet 是轨迹读取器,不是轨迹记录器。你必须使用动态二进制插桩框架(或其他相关技术)来生成兼容的执行轨迹。请参阅追踪自述文件,了解有关现有追踪器的更多信息,或如何实现你自己的追踪器。

问:Tenet 支持加载哪些轨迹架构?

  • 答:仅支持 x86 和 AMD64,但代码库几乎完全与架构无关。

问:Tenet 能加载/导航多大的轨迹文件?

  • 答:Tenet 的轨迹读取器是纯 Python 实现的,它作为最小可行产品(MVP)编写。在原生后端替代它之前,无法保证超过 1000 万条指令的轨迹能够合理地导航。

问:我加载了一个执行轨迹,现在有一个 '.tt' 文件。这是什么?

  • 答:当 Tenet 加载给定的文本轨迹时,它会将轨迹解析、索引并压缩为更高性能的格式。在后续加载中,Tenet 将尝试加载 '.tt' 文件,其加载时间仅为加载原始文本轨迹所需时间的一小部分。

问:插件崩溃/抛出错误/显示错误的轨迹信息,我该怎么办?

  • 答:如果你遇到可重现的问题或不准确之处,请在此仓库中提交问题,并上传示例轨迹和可执行文件。

问:我的轨迹中的内存发生了变化,但对该区域没有写入。这是不是 bug!?

  • 答:你的日志文件可能没有捕获所有内存写入。例如,用户态 DBI 通常不会对写入进程内存的外部写入获得内存回调。这最常见于从文件或套接字读取时——是内核将内存写入你指定的用户态缓冲区,使得该事件对传统插桩不可见。
    • 微软 TTD 通常表现出相同的行为,如果不模拟系统调用,很难解决。

问:这会移植到 Binary Ninja / Ghidra / ... 吗?

  • 答:可能会,但不会很快(除非有__重大__激励)。作为一个研究导向的项目,主要动力是开发新颖的策略来组织和探索程序执行——而不是移植它们。

问:我的组织想支持这个项目,我们该如何帮助?

  • 答:没有资金,我能投入该项目的时间有限。如果你的组织对这里提出的想法感到兴奋,并且能够提供资金来赞助专门的研发,请联系我们。

未来工作

时间和动力资金允许的话,未来工作可能包括:

  • 从轨迹中过滤/聚合库调用
  • 针对寄存器/栈视图的指针分析(例如注释)
  • 原生 TraceFile 和 TraceReader 实现(例如更大更快的轨迹)
  • 导航历史 + 书签视图(也许是二合一?)
  • 更丰富的轨迹信息学,更积极的索引相关事件(例如函数调用)
  • 轨迹地图,改进轨迹地理的总结和呈现
  • 使‘CPU架构’选择/检测不再那么硬编码
  • 更多开箱即用的追踪桥接,DynamoRIO、TTD、RR、QEMU、Bochs……
  • 支持 Hex-Rays/反编译视图(除了基本视图同步)
  • 改进自动加载或迭代轨迹的工作流程
  • 差异分析,高级‘轨迹差异对比’
  • 更好的线程和时间片导航与分解
  • 更好地支持导航‘多模块’轨迹(例如全系统轨迹)
  • Binary Ninja 支持
  • ……?

我欢迎外部贡献、问题和功能请求。如果你希望未来版本考虑你的更改,请将任何拉取请求提交到此仓库的 develop 分支。

作者

  • Markus Gaasedelen (@gaasedelen)
下载工具