脚本工具:基于lldb的trace脚本(辅助算法分析,过混淆等)

由于工作的需要,在逆向分析中,遇到了强混淆,vm虚拟机等加固方案。在分析的过程中,痛不欲生。为了能在逆向的过程中,能安心的喝口咖啡,同时能还原出 高度混淆/vm虚拟机 中的代码。参考函数追踪的原理,弄个 指令级 的 lldb-trace脚本。

[前瞻]:

平时分析的过程中,难免遇到c函数,c++函数,objc函数。而objc函数又包括很多realease函数…顾儿,在trace过程中,objc的 形如 release,引用计数类的函数,都忽略掉。对于 c/c++ 函数而言,类构造函数啊 … 系统函数啊…等等,都需要过滤。而 objc_msgsend 函数,可以做重点分析:在于你是否要分析这个函数。而我不需要,所以我只要objc_msgsend中的函数名,而函数的实现,我就不trace了。

框架分析:
对不同平台,做不同的配置。忽略掉的函数,都放到忽略函数列表中。objc_msgsend函数需要特殊处理,顾放到受保护列表中。由于trace过程中,需要读取那些寄存器的值,顾用正则解析汇编指令,获得此汇编需要的寄存器。

更新 :

1,trace 参数优化,绝大部分参数都为默认参数。
2,结束地址可以有多个(在某些混淆情况下,不确定结束地址到哪里,可以多设置几个结束地址)
3,增加了 暂停其他线程 的 可选参数
4,增加了 只 trace 本模块的 可选参数
5,增加了 进度 信息(防止以为脚本卡死…等的不耐心…从而关闭了 lldb)
6,对msg_send 函数的参数解开发中…

怎么使用该脚本:

1,在你准备追踪的地方下断点:(我的断点,从breakpoint函数 si 进入到 a函数的 第一行)

2,导入lldbTrace.py脚本。(你可以设置,默认的 log 文件路径。如果不设置,默认和脚本同位置)
2222

3,设置一个停止追踪的地址:(当前a函数,我把结束地址设为 最后地址,和 ret 地址。为了查看debug信息,我把log类型设置成了debug)

4,设置好,直接回车,结果如下:

脚本在 git 上 :GitHub - yangyss/lldb-trace: Tracing instruction in lldb debugger.Just a python-script for lldb.

脚本还有很多不完善的地方,需要慢慢优化。
不过利用trace 结果,能还原 手写的算法,以及强混淆 或者 某些 vm虚拟机。

某手撸 aes 算法的还原:

7 Likes

大神厉害,体验了一下很好用.

顾儿

哈哈哈,牛逼,y总

道爷,别奶我…
就瞎搞瞎搞,为分析混淆/虚拟机 提供一个方案

大佬,加载出现这个错是怎么解决啊
error: module importing failed: Traceback (most recent call last):
File “”, line 1, in
File “/opt/lldb_scripts/lldbTrace.py”, line 117
def handle_command(command,debugger:lldb.SBDebugger):

感觉,可能是你的 python环境,我这个是python3环境

而且我只实现了 arm64 架构的trace x86 系列的 没有弄
def handle_command(command,debugger:lldb.SBDebugger): 这个是 python3的语法

谢谢,我试试切换一下

感觉很牛逼,体验下来反馈

感觉会有效率问题。以前使用ida trace过vm,太慢了。

感觉还行。
一般10分钟左右,trace 2-3w行

如果trace 10几万行,那就脱离了 trace 的价值。
trace的主要目的 是 分析算法,抠出关键逻辑。

ida trace 没用过。还是比较相信lldb 自带api接口。

而trace vm 是需要技巧的,直接全局trace 。。。妈妈呀,只能紫薯布丁了

摸摸摸摸摸摸摸 :star_struck:

脚本优化如下:
1,增加了多个 结束地址,用 “;” 分割
2,增加了 调试 500 行,显示 相关信息
3,增加了 trace 本模块的 可选参数
4,增加了 暂停其他线程的 可选参数

3 Likes