0%

初识OLLVM

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次

语法同上

下一篇文章介绍各个混淆实现的效果。

参考链接:

OLLVM混淆学习(0)——环境搭建及混淆初体验 - 思泉 | Jev0n

LLVM 简介 (一) - Erio - 博客园 (cnblogs.com)