逆向工程技术全解析:从OLLVM到符号执行
1. OLLVM简介
OLLVM(Obfuscator - LLVM)是基于LLVM(Low - Level Virtual Machine)实现的控制流扁平化混淆工具。其核心思想源于2010年的论文《Obfuscating C++ Programs via Control Flow Flattening》,旨在打乱程序基本块之间的控制关系,将其交由统一的分发器管理。
1.1 控制流扁平化原理
正常程序的控制流图和经过控制流扁平化后的控制流图有明显区别。在扁平化后,程序的整个执行流程由主分发器控制,分发器会在每个基本块结束时根据当前状态更新状态变量,从而决定下一个要执行的基本块。分发器的结构与VM Handler类似,区分二者需仔细查看控制程序执行流程的关键变量。
1.2 解除混淆方法
要解决控制流扁平化混淆,可提取状态变量,并根据分发器的分发规则进行追踪,以恢复原始程序的控制流。可使用deflat.py(https://security.tencent.com/index.php/blog/msg/112)和HexRaysDeob(https://www.hex-rays.com/blog/hex-rays-microcode-api-vs-obfuscating-compiler/)等开源工具实现OLLVM反混淆。
1.3 现有问题与应对策略
然而,这些通用的开源反混淆工具只能处理部分标准的控制流扁平化混淆。原始的OLLVM在2017年已停止维护,现有的修改版本多由个人维护,常添加新功能或采用新实现方式,如添加假状态变量、增加不可执行的基本块