OLLVM
OLLVM是一个基于LLVM的框架的混淆器,主要功能有三:指令替换、混淆控制流、控制流平坦化。一言以蔽之,ollvm可以用来混淆程序,增加逆向难度。
LLVM
那么什么是LLVM呢?LLVM(low level virtual machine)是一个编译器框架,是一系列模块化、可重用的编译器及工具链技术的集合。
通过这张图,可以很好的理解llvm的作用。
第一部分:Clang作为前端接收C(各种语言)源文件,生成中间代码IR
第二部分:中间代码IR经pass的优化处理得到新的IR,不同的PASS对应不同的优化
第三部分:生成机器码
OLLVM原理
费这么大篇幅介绍LLVM肯定是有用的,前面讲了OLLVM是基于LLVM,最大的区别在于PASS不同,我的理解是LLVM的pass是用来优化的,而OLLVM的PASS是用来混淆的。
OLLVM的环境搭建
涉及到gcc、g++以及各种环境,建议直接在Ubuntu使用docker一步到位
跟着铁头干混淆3 ubuntu下用docker编译ollvm(保证成功) - 哔哩哔哩 (bilibili.com)
OLLVM的使用
控制流平坦化
可用选项:
- -mllvm -fla : 激活控制流平坦化
- -mllvm -split : 激活基本块分割
- -mllvm -split_num=3 : 指定基本块分割的数目
语法
1 | clang 选项一 选项二 选项N 原码 -o 可执行文件 |
1 | clang -mllvm -fla test.c -o test |
虚假控制流
可用选项:
- -mllvm -bcf : 激活虚假控制流
- -mllvm -bcf_loop=3 : 混淆次数,这里一个函数会被混淆3次,默认为 1
- -mllvm -bcf_prob=40 : 每个基本块被混淆的概率,这里每个基本块被混淆的概率为40%,默认为 30 %
语法同上
指令替换
可用选项:
- -mllvm -sub : 激活指令替代
- -mllvm -sub_loop=3 : 混淆次数,这里一个函数会被混淆3次,默认为 1次
语法同上
下一篇文章介绍各个混淆实现的效果。
参考链接: