OLLVM
0x00 前言
- LLVM是一个优秀的编译器框架,采用经典的三段式设计。前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);Pass对IR做优化,后端(Backend)负责将优化好的IR解释成对应平台的机器码.
- 从字面看,OLLVM就是在LLVM的基础上增加了obfuscator(混淆),LLVM的pass是用来优化分析的,将这些pass的功能改为混淆代码,就是OLLVM项目.
0x01 OLLVM的几种混淆方式
1.指令替换(Instructions Substitution)
用功能等效但更复杂的指令序列替换标准的二进制运算符(如加法、减法或布尔运算符)。当有多个等效指令序列时,随机选择一个。
如:
- 加法:
a = -(-b + (-c))
,r = rand (); a = b + r; a = a + c; a = a - r
- AND:
a = b & c => a = (b ^ ~c) & b
- XOR:
a = a ^ b => a = (~a & b) | (a & ~b)
2.虚假控制流(Bogus Control Flow)
BCF模式通过加入包含不透明谓词的条件跳转(即跳转与否在运行之前就已经确定的跳转,但IDA无法分析)和不可达的基本块,来干扰IDA的控制流分析和F5反汇编
3.控制流平坦化(Control Flow Flattening) - 通过一个主分发器来控制程序基本块的执行流程
- 不改变源代码的功能前提下,将C或C++代码中的if、while、for、do等控制语句转换成switch分支语句
- 这种混淆方式增加了很多无用的case分支,但是没有改变原来的函数调用关系,基于这点,可以根据经验筛选出一些重点函数来hook,看看这些函数的参数都是啥,都返回了什么,以此来猜测这些函数的功能
4.字符串加密如Armariris字符串混淆
OLLVM
http://example.com/2025/03/27/3/