OLLVM混淆so文件初探

基础知识

LLVM 是一个开源的编译器基础架构,广泛应用于编译器和程序分析

LLVM 的核心组件:

  • LLVM Core Libraries:提供用于编译器开发的核心工具集,包括代码生成、优化、目标机器描述等
  • Clang:一个基于 LLVM 的 C、C++、Objective-C 编译器前端
  • LLVM IR(Intermediate Representatio n):一种类似汇编的中间表示语言,是 LLVM 的核心抽象。代码在编译过程中先被转换为 LLVM IR,随后进行各种优化,再生成目标机器码
  • LLVM Optimizer:对 LLVM IR 进行各种优化,如循环优化、内联展开等,以提升性能
  • LLVM Code Generator:将优化后的 LLVM IR 转换为特定平台的机器码
  • Linker:LLVM 也包含了一些链接器工具(如 LLD),用于将编译好的目标文件链接成可执行文件或库

自 Android NDK r18 开始,Google 弃用了 GCC,全面转向使用 LLVM/Clang 作为 NDK 的编译工具链,Clang 作为 C/C++ 的编译前端,负责将 C/C++ 代码编译为 LLVM IR

OLLVM 是 LLVM 的一个分支,增加了代码混淆功能(如控制流平坦化、指令替换),主要用于保护二进制代码的安全性

编译ollvm

直接的ollvm-4.0版本太旧,于是选择下载llvm源码进行编译

复制obfuscation等文件之后再次编译

一开始尝试用ninja构建

cmake -G “Ninja” -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=”llvm;clang;lld” -DLLVM_ENABLE_RTTI=OFF -DLLVM_ENABLE_EH=OFF ../llvm

增加ollvm相关内容后再次编译有报错,不知道为什么在用本地的MinGW-w64编译导致报错

要不然就得重新用Visual Studio编译

这里还有一种方法就是找已经编译好的,只要与需要的版本相近,可以去github找或者直接在浏览器搜索

我后面就是直接用的编译好的ollvm

构建含有ollvm功能的LLVM(clang-cl)供Microsoft Visual Studio 2022使用 - 哔哩哔哩

相关的选项

https://github.com/HikariObfuscator/Hikari/wiki/Usage

功能与使用

不同ollvm选项稍有不同,但大致如下

  • 控制流扁平化(-mllvm -fla):通过扁平化控制流,使代码的执行路径变得复杂且难以理解,从而增加逆向工程的难度
  • 指令替换(-mllvm -sub):用等效但不同的指令序列替换原有指令,增加代码阅读和分析的复杂度
  • 虚假控制流程(-mllvm -bcf):在代码中插入虚假的控制流和逻辑,使得代码看起来混乱且难以推理
  • 字符串加密(-mllvm -sobf):对字符串进行加密处理,防止字符串在二进制文件中被轻易识别和解析

测试代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main() {
int a = 1;
int b = 1;
int sum;

// 执行加法运算
sum = a + b;

// 输出运算结果
printf("Result: %d + %d = %d\n", a, b, sum);

return 0;
}

没加任何混淆

.\clang.exe add.c -o add.exe -mllvm -enable-allobf -mllvm -bcf_prob=100

使用混淆出现一万多行的代码以及极其复杂的流程图,这效果看上去就不错

在Android Studio的CMakeList.txt中添加选项

最后达到了一定的混淆效果:流程图改变/程序逻辑混乱+存在虚假代码+关键算法混淆


OLLVM混淆so文件初探
https://j1ya-22.github.io/2025/04/01/OLLVM混淆so文件初探/
作者
j1ya
发布于
2025年4月1日
许可协议