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 |
|
没加任何混淆

.\clang.exe add.c -o add.exe -mllvm -enable-allobf -mllvm -bcf_prob=100
使用混淆出现一万多行的代码以及极其复杂的流程图,这效果看上去就不错

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

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


