[Code翻译]Tenet:逆向工程师的跟踪浏览器 | RET2系统博客

476 阅读8分钟

本文由 简悦SimpRead 转码,原文地址 blog.ret2.io

调试在传统上是一项乏味、单调的工作。虽然有些人喜欢考古 ......

调试在传统上是一项乏味、单调的工作。虽然有些人喜欢使用调试器来发现软件缺陷或执行软件逆向工程的任务的考古过程,但几乎所有人都同意,这些工具在面对现代软件时已经开始显示出它们的年龄。

我们的运行时自省方法仍然过度关注单个的执行状态。这是一个问题,因为软件已经变得非常复杂,需要更多的背景和 "情景意识 "来正确解释。无时限调试](blog.ret2.io/2018/06/19/…

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

Tenet是一个实验性的插件,用于探索IDA Pro中的软件执行痕迹。

背景

Tenet的灵感直接来源于QIRA。我为此写的最早的原型可以追溯到2015年,当时我在微软担任软件安全工程师。这些原型是建立在TTD的私人 "跟踪阅读器 "API之上的,以前被称为TTT,或iDNA。

我放弃了这项工作,因为我不相信一个汇编级的跟踪探索器会在这个世界上Windows被称为_'开源软件'_的公司里有意义。

我正在重新审视跟踪探索器的想法,因为它是2021年,而且这个领域仍然***地没有发展起来。在其他想法中,我坚信程序执行有一个地理景观的概念,而传统制图学的原则可以应用于这些景观的总结、说明和导航。

尽管我希望你能发现这个插件的酷,但Tenet只是进一步研究这些想法的一个踏脚石。

使用方法

Tenet可以从GitHub下载或克隆。它需要IDA 7.5和Python 3。

一旦正确安装,在反汇编器中会有一个新的菜单项可用。这可以用来将外部收集的执行轨迹加载到Tenet中。

Tenet在IDA中增加了一个菜单项-->加载文件子菜单,用于加载执行轨迹

由于这是最初的版本,Tenet只接受简单的人类可读的文本跟踪。请参考tracing readme,了解更多关于跟踪格式、限制和参考跟踪器的信息。

双向探索

在使用Tenet的时候,该插件会 "画 "出痕迹,表示从你现在的位置开始,在活动的执行轨迹中向前(蓝色)和向后(红色)执行的流程。

Tenet在浏览跟踪时为过去和现在的执行流提供了定位功能

要想 "向前 "或 "向后 "穿越时间,你只需在反汇编器右侧的时间轴上滚动。要 "跨过 "函数调用,请在滚动时按住 "SHIFT "键。

追踪时间线

追踪时间线将停靠在反汇编器的右侧。这个小组件用于沿跟踪时间线可视化不同类型的事件,并执行上述的基本导航。

跟踪时间线是导航Tenet跟踪和关注感兴趣领域的一个关键组成部分

通过在时间轴上点击和拖动,可以放大执行轨迹的某个特定部分。这个动作可以重复若干次,以达到所需的颗粒度。

执行断点

点击寄存器窗口中的指令指针将以红色高亮显示,显示出该指令在整个跟踪时间线上的所有执行位置。

在当前指令上放置一个断点,并通过滚动在指令的执行过程中进行导航

要在不同的执行过程中跳转,可以在悬停高亮显示的指令指针时向上或向下滚动_。

此外,你可以在反汇编列表中点击右键,并选择一个基于导航的菜单条目,快速寻找感兴趣的指令的执行。

使用Tenet导航快捷键来寻找指定指令的第一次执行的轨迹

IDA的本地F2热键也可以用来在任意指令上设置断点。

内存断点

通过点击堆栈或内存视图中的一个字节,你将立即看到该地址的所有读/写在跟踪时间线上的可视化。黄色表示一个内存_读,蓝色表示一个内存_写。

根据对选定的内存字节的访问,在执行状态中寻找跟踪点

内存断点可以使用与执行断点相同的技术进行导航。点击一个字节,并在悬停所选字节的同时滚动,以寻求对其每个访问的跟踪。

如果你有一个特定的导航动作,右键点击一个感兴趣的字节将给你提供在内存读/写/访问之间寻找的选项。

Tenet为内存访问提供了一些导航快捷键

要把内存视图导航到一个任意的地址,点击内存视图,然后点击G,输入一个地址或数据库符号来寻找这个视图。

区域断点

一个相当实验性的功能是为一个内存区域设置访问断点。这可以通过突出一个内存块,并从右键菜单中选择 Find accesses 动作来实现。

Tenet允许你在一个内存区域上设置一个内存访问断点,并在其访问之间进行导航

与普通的内存断点一样,悬停该区域和_滚动_可以用来在对所选内存区域的访问之间进行穿越。

寄存器搜索

在逆向工程中,经常会遇到这样的情况:你问自己_"哪条指令把这个寄存器设置为当前值?"_

使用Tenet,你可以通过一次点击来向后寻找该指令。

寻找负责设置感兴趣的寄存器的时间戳

向后寻求是迄今为止在寄存器变化中最常见的导航方向......但为了灵巧,你也可以使用寄存器右侧的蓝色箭头向前寻求到下一个寄存器的分配。

时间戳Shell

我们提供了一个简单的 "shell "来导航到跟踪中的特定时间戳。粘贴(或输入......)一个时间戳到shell中,无论是否有逗号,都足够了。

时间戳外壳 "可以用来将跟踪器导航到一个特定的时间戳上

使用感叹号,你也可以在跟踪中寻找一个指定的 "百分比"。输入"!100 "将寻找到跟踪中的最后一条指令,而"!50 "将寻找到跟踪中大约50%的内容。

Themes

Tenet有两个默认主题--一个是 "浅色 "主题,另一个是 "深色 "主题。根据你的反汇编程序目前使用的颜色,Tenet会尝试选择看起来最合适的主题。

Tenet有浅色和深色两种主题,将根据用户的反汇编主题来选择。

主题文件以简单的JSON形式存储在磁盘上,并且是高度可配置的。如果你对默认的主题或颜色不满意,你可以创建自己的主题,并简单地把它们放到用户主题目录中。

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

开放源代码

Tenet目前是一个没有经费的研究项目。它可以在GitHub上免费使用,以MIT许可证发布。在公开的README中,有关于如何开始、未来的想法、甚至是FAQ的额外信息,这些信息在这篇文章中都没有涉及。

由于没有资金,我能够投入到这个项目的时间是有限的。如果你的组织对这里提出的想法感到兴奋,并且有能力提供资金来赞助对特尼特的专门开发时间,请[联系我们](ret2.io/contact)。

在这一领域,没有很多强大的项目(或产品),重要的是提高对现有少数项目的认识。如果你觉得这篇博文有趣,请考虑探索和支持更多的这些技术。

  • QIRA - QEMU互动运行时分析器
  • Microsoft TTD - Windows的时间旅行调试器
  • RR // Pernosco - 用于Linux的时间调试
  • PANDA - 全系统跟踪,建立在QEMU之上
  • REVEN - 全系统跟踪,建立在PANDA / VirtualBox上
  • UndoDB - 用于Linux和Android的可逆调试
  • DejaVM - :^)

结语

在这篇文章中,我们介绍了一个新的IDA Pro插件,叫做Tenet。它是一个实验性的插件,旨在探索软件执行的痕迹。它既可以作为逆向工程过程中的辅助工具,也可以作为一种研究技术来探索程序分析、可视化和下一代调试经验的功效等方面的新思路。

我们对这些技术的开发经验是首屈一指的。RET2很乐意在这些领域提供咨询,提供插件开发服务,为现有作品增加定制功能,或其他有关安全工具的独特机会。如果你的组织有这方面的专业知识需求,请随时联系


www.deepl.com 翻译