由于工作的需要,在逆向分析中,遇到了强混淆,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 函数的参数解开发中…
7,增加了对还原的算法检测脚本。相关介绍见<13楼> : 脚本工具:基于lldb的trace脚本(新增<block级trace命令>,辅助算法分析,过混淆等) - #13 由 yangyss
8,增加 block 级 trace 命令 [trace_b -e address -l debug -p] 。相关介绍见 <43楼>: 脚本工具:基于lldb的trace脚本(新增<block级trace命令>,辅助算法分析,过混淆等) - #43 由 yangyss
优化 :
1, 注释掉:解析函数名和其方法名代码 <解决 : 因为某些未知原因,导致不能写入文件>
2, 修复了 在函数结束位置的下断点 的bug
怎么使用该脚本:
1,在你准备追踪的地方下断点:(我的断点,从breakpoint函数 si 进入到 a函数的 第一行)
2,导入lldbTrace.py脚本。(你可以设置,默认的 log 文件路径。如果不设置,默认和脚本同位置)
3,设置一个停止追踪的地址:(当前a函数,我把结束地址设为 最后地址,和 ret 地址。为了查看debug信息,我把log类型设置成了debug)
4,设置好,直接回车,结果如下:
脚本在 git 上 :https://github.com/yangyss/lldb-trace
脚本还有很多不完善的地方,需要慢慢优化。
不过利用trace 结果,能还原 手写的算法,以及强混淆 或者 某些 vm虚拟机。
某手撸 aes 算法的还原: