【摘要】
大前天(2021-4-20)林版在群里分享了Tenet的链接,链接页面的动态演示有种“大杀器”的感觉,于是做了跟进。这是基于IDA7.5和python3的对Trace人性化浏览工具,但需要使用者根据格式自己制作Trace记录,虽有样例,还是需要一定的折腾。整体感觉比较新奇,就技术的试验性版本而言,还是比较惊艳。如作者总结的【在此文中,我们展示了一款称为Tenet的IDA Pro插件。这是一个试验性的插件,设计来查览软件执行跟踪记录。它能用来当作逆向工程过程的一个辅助,也能用来当作在程序分析、虚拟化、下一代调试实践的有效性(等)的探索中使用的研究技术。我们对这些技术的开发实践是首屈一指的。...(省略涉及技术合作部分,参考翻译详情)】。
【关键词】
态势感知
时间无关调试 timeless debugging
【技术提要】
可以解决什么?
(1)基于时间线的跟踪记录,理论上可以定位任意时刻的执行状态,所以也可以随意推进和回溯程序执行过程。
(2)某个指令,在整个运行周期(时间线)上那些时刻执行了该指令,并可以在不同时刻间来回切换。
(3)某个寄存器的当前值是在什么时候设置的,在整个时间线上对某个寄存器赋值操作指令的定位来回切换。
(4)某个内存字节(或区域),在整个时间线上,那些时刻进行了读、写、访问,并可以直接在不同时间点切换。
这是一个什么技术?
如果没有理解错,按作者的意思,调试技术很多都是建立在某一个时刻的程序执行状态下的。而这个技术是建立在所有状态之间的关系上进行辅助研究分析。
【难点】
插件安装比较简单,github下载拖放进IDA7.5即可。
但使用时,需要加载“执行跟踪记录”(简称记录);这些记录是需要通过其他工具进行捕获收集的。记录的格式作者在README中做了说明,也提及一些工具,这里复现作者使用Intel的Pin开发的Pintool插件来展示记录的提取。这个过程我也像作者一样是试验性的,但试验后难免会有些骨感。对简单的程序还好(如简单的HelloWord console应用,线程少),对于复杂点的程序(如HellowWord MFC,线程多),几乎绝望,诸君亲测下,若发现更好的获取收集”执行跟踪记录“的方式,还请不吝分享一二。
Tenet 链接
本文分两部分,第一部分是对官方的摘译,第二部分主要是复现Intel的Pin采集”执行跟踪记录“,以展示插件的使用。
一、官方摘译(意译,若缪请斧正)
【前言】
Tenet :一款跟踪记录查览器(供逆向工程师使用)
传统的调试器变得越来越复杂,该何去何从?
传统意义上,调试是一种枯燥乏味尝试。虽然一些大侠热衷于这种类似考古的过程(使用调试器来发掘软件缺陷或在逆向工程中执行任务),
但几乎所有人都会觉得相对于现代软件,这些工具开始显得力不从心。
我们运行时探查的方法仍然高度聚焦在个别的执行状态。这种思路存在明显的缺陷,源于变得越来越复杂的软件要求更多的情景和“态势感知”才能正确解读。时间无关调试(timeless dubgging)的出现虽减轻了些许日渐增加的痛楚,但这些方案依然是建立在探查个别状态的传统方法上,而不是建立在各个状态之间是如何关联的基础上。
我(Tenet作者,gaasedelen)开源了 Tenet,一个对执行跟踪记录的执行探查浏览的IDA Pro插件。此插件的目的是,(对某个给定的二进制代码的执行跟踪记录)提供一种更自然、人性化操作的导览方案。此开源工作的基础源于一种渴望,一种探索新的或革命性的(在软件中检测和提取复杂执行模型的)方法的渴望。
Tenet 是一个实验性的用于查览软执行跟踪记录的IDA Pro插件
【背景】
Tenet的灵感来自QIRA (译注:QIRA 是一款时间无关调试器)。我对它最初的原型的开发时间可以追溯倒2015年,那时我作为微软的一名软件安全工程师。这些原型建立在为TTD设计的不公开的“跟踪记录阅读器”应用接口(API)之上(译注:TTD,微软官方Time Travel Debugging缩写,是一个可以记录执行进程的执行,再后续可以向前或向后回放的工具。TTD允许回撤调试会话。);TTD以前称为TTT或iDNA。
我辞掉了微软的工作,因为我不觉得,在(Window被称为“开源软件”的世界)这样的一个公司里,一个汇编层的跟踪记录查览器会有意义。(译注:作者可能是反讽,众所周知,虽然有部分开源项目,但Windows并不算“开源软件”)
我重拾“跟踪记录查览器”的想法,是因为现在已经是2021年,而该领域依然杂乱而没有发展。在其他一些想法中,我坚信:(1)有一张地图对应着程序执行;(2)传统的制图学基本原理能应用在这些图的汇总、展示、导向上。
我希望大伙能发现此插件的炫酷点,Tenet只是推进研究这些想法的一小步。
【用法】
Tenet可在github上搜索下载。允许条件是IDA 7.5和Python 3.
正确安装后(译注:参考后述安装方法),在反汇编器中会有一个新的菜单项。此菜单项可以用来加载外部收集的执行跟踪记录倒Tenet中。(译注:这里应该注意,实际Tenet只是一个契合IDA7.5的“跟踪记录”的查览器,“跟踪记录”需要根据格式通过其他途径采集,且采集的“跟踪记录”的模块基址如果随机,则需要对IDA反编译器中目标模块的基址进行rebase重定位,参考后续描述)
Tenet 给IDA增加一个加载文件的子菜单来实现执行跟踪记录的加载
由于是最初的分发开源版本,Tenet只接受简单的可供人阅读的文本跟踪记录。更多有关该跟踪记录格式、局限和相关的追踪器的其他信息请参考github开源项目中tenet/tracers/README.md文件。(译注:跟踪记录格式是我们应该关注的,相关的追踪器也是我们应该关注的重点)
【双向查览】
当使用Tenet时,该插件会给运行踪迹上色暗示执行方向:蓝色标记向前执行流,红色标记向后执行流,都是基于当前执行位置相对位置由深到浅渐变色表示。
Tenet 在浏览跟踪记录时提供过去和当前的执行区域流
要通过执行时间向前或向后“步进”,我们只需简单地把鼠标放在反编译器右侧的时间线上,然后上下滚动鼠标滑轮即可。
要“步过”函数调用,只需要在滚动鼠标滑轮的同时按下“SHIFT”键即可。(译注:应该注意到差别,如果不按SHIFT,相当于单步跟进)
【跟踪记录时间线】
跟踪记录的时间线在反编译器的右边。该窗口用来对不同事件类型沿着时间线可视化,且用于上面所述的基本浏览功能。
跟踪记录时间线是一个关键的功能部件,用于浏览Tenet跟踪记录和聚焦感兴趣的区域
通过在时间线上“单击按下鼠标并拖动划过”,可以对执行跟踪记录的指定区间进行放大。此操作可以重复任意次以达到期望的粒度。
【执行断点】
单击寄存器窗口的指令指针寄存器(EIP或RIP等),会红色高亮显示,同时会在整个时间线上定位显示出该指令被执行的时间点。
(译注:这点还是很炫酷,这能在整个时间线上找出所有执行过某个指令或指令流的所有时间节点,可通过鼠标放置在EIP上进行滚轮滑动切换到该指令不同的执行时间点)。
在当前指令上放置断点并通过滚动鼠标滑轮在不同执行时间点上切换
IDA的F2热键也可以用来再任意指令处设置断点。(译注:目前未发现Tenet使用F2设置所谓断点的用处)
(译注:所谓的放置断点,一般在反汇编窗口定位到感兴趣的指令位置(可以通过g快捷键之间输入地址跳转),然后右键选择Tenet的Go to...到Go to first exectuion即可,然后再单击EIP和滚动鼠标滑轮进行执行时间点的切换,如下为译者配图)
【内存断点】
通过再栈或内存视图中单击一个字节,将即刻在可视化的整个跟踪记录时间线上看到对该地址所有读写操作。(译注:GoodJob!)
基于对选中的特定内存的访问,在全部执行状态中定位对应踪迹
内存断点可使用执行断点相同的技术来导览。单击某个字节,然后在鼠标悬停在选中字节上的同时滚动鼠标滑轮即可定位访问它的每一个踪迹。
在感兴趣的字节上右击将提供内存的读/写/访问等定位选项,当然,前提是该处字节存在你想要的指定导览动作。
Tenet为针对内存访问提供许多快捷导览
要导览(或定位)到内存视图中的某个地址,点击进内存视图然后通过g快捷功能输入地址或数据库符号来定位转到目标位置。
【区域断点】
一个十分试验性的功能是对一个内存区域设置访问断点。可通过高亮选定一块内,然后在右键菜单中找到相应访问动作来达到。
Tenet有允许在一个内存区域上设置访问断点,并在访问动作之间导览
与普通内存断点一样,在区域上悬停并滚动鼠标滑轮能用来在对选择的内存区域的不同访问操作之间切换。
【寄存器定位】
在逆向工程中,我们经常会遇到这样的情形,“哪个指令设置了这个寄存器的当前的值?”。
通过Tenet,我们能通过单击一下就能回溯到该指令(设置寄存器值的指令)。(译注:Nice!通过单击寄存器值左侧箭头即可)
定位到对感兴趣的寄存器进行设置的时刻
回溯定位(向后定位)在寄存器值变化方向之间要常用得多,但出于方便我们也能向前定位到下一处对寄存器赋值的地方,通过单击寄存器右侧的蓝色箭头就可以(译注:鼠标悬停在寄存器左\右侧的箭头上才会显示红\蓝色)。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-5-6 09:09
被tritium编辑
,原因: