Tenet 是一款用于探索执行轨迹的 IDA Pro 插件。该插件的目标是提供更自然、更人性化的控制方式,以便在给定二进制文件中导航执行轨迹。这项工作的基础源于研究新的或创新方法来检查和提炼软件中复杂执行模式的愿望。
关于该项目的更多背景,请阅读其初始发布时的博客文章。
Tenet 是一个跨平台(Windows、macOS、Linux)的 Python 3 插件。它不依赖任何第三方库,使得代码既便携又易于安装。
从反汇编器的 Python 控制台中,运行以下命令找到其插件目录:
import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")将该仓库中 /plugins/ 文件夹的内容复制到所列出的目录。
重启你的反汇编器。
此插件仅支持 IDA 7.5 及更高版本。
正确安装后,反汇编器中会新增一个菜单项。该菜单项可用于将外部收集的执行轨迹加载到 Tenet 中。
由于这是初始版本,Tenet 仅接受简单的人类可读文本轨迹。请参阅本仓库中的追踪自述文件,了解更多关于轨迹格式、限制以及参考追踪器的信息。
使用 Tenet 时,插件会‘绘制’轨迹,以指示从当前执行轨迹位置向前(蓝色)和向后(红色)的执行流。
要向前或向后步进时间,你只需在反汇编器右侧的时间线上方悬停并滚动。要步过函数调用,则在滚动时按住 SHIFT。
轨迹时间线将停靠在反汇编器的右侧。该组件用于可视化轨迹时间线上的不同类型事件,并执行上述基本导航。
通过在时间线上点击并拖动,可以放大执行轨迹的特定部分。此操作可以重复任意次数,以达到所需的粒度。
在寄存器窗口中双击指令指针,会将其高亮为红色,显示该指令在轨迹时间线上所有被执行的位置。
要在不同执行之间跳转,在悬停高亮指令指针时向上或向下滚动。
此外,你可以在反汇编列表中右键点击,然后选择一个基于导航的菜单项,快速定位到感兴趣指令的执行位置。
IDA 原生的 F2 快捷键也可用于在任意指令上设置断点。
在栈视图或内存视图中双击一个字节,你将立即看到对该地址的所有读/写在轨迹时间线上的可视化展示。黄色表示内存读取,蓝色表示内存写入。
内存断点可以使用执行断点描述的相同技术进行导航。双击一个字节,然后在悬停所选字节时滚动,将轨迹定位到其每次访问。
右键点击感兴趣的字节将会提供选项,可以在内存读/写/访问之间进行定位,如果你有特定的导航需求。
要将内存视图导航到任意地址,点击内存视图,然后按 G 输入地址或数据库符号,将视图定位到该位置。
可以通过高亮一块内存区域,然后双击它来设置一个访问断点,从而在内存区域上设置内存断点。
与普通内存断点一样,悬停在该区域并滚动可以遍历所选内存区域的访问。
在逆向工程中,经常会遇到这样的情况:你问自己*‘是哪条指令将这个寄存器设置成当前值的?’*
使用 Tenet,你可以一键向后定位到那条指令。
向后定位是跨寄存器变化导航中最常见的方向……但为了灵活起见,你也可以使用寄存器右侧的蓝色箭头向前定位到下一个寄存器赋值。
提供了一个简单的‘外壳’,用于导航到轨迹中的特定时间戳。将时间戳粘贴(或键入……)到外壳中,带或不带逗号均可。
使用感叹号,还可以定位到轨迹中的指定‘百分比’。输入 !100 将定位到轨迹中的最后一条指令,而 !50 将定位到轨迹的大约 50% 处。!last 将定位到反汇编器可查看的最后一条可导航指令。
Tenet 自带两个默认主题——一个‘浅色’主题和一个‘深色’主题。根据你的反汇编器当前使用的颜色,Tenet 将尝试选择最合适的主题。
主题文件以简单的 JSON 格式存储在磁盘上,并且高度可配置。如果你对默认主题或颜色不满意,可以创建自己的主题,然后将其放入用户主题目录即可。
Tenet 会记住你的主题偏好,以便将来加载和使用。
时间和动力资金允许的话,未来工作可能包括:
我欢迎外部贡献、问题和功能请求。如果你希望未来版本考虑你的更改,请将任何拉取请求提交到此仓库的 develop 分支。