用途
该技能面向软件保护与反逆向工程场景,提供基于 LLVM 的代码混淆框架与技术知识。适用于需要在编译期对程序进行混淆、增加静态与动态分析难度的开发与安全研究工作。
主要能力
控制流混淆
- 控制流平坦化(CFF):将结构化控制流转换为带状态机的单一调度循环。
- 虚假控制流(BCF):插入不透明谓词与死代码路径。
- CFG 随机化:随机化基本块顺序并添加虚假边。
数据混淆
- 字符串加密:编译期加密字符串字面量,运行时解密。
- 常量替换:用复杂表达式替换常量。
- 变量拆分:将变量拆分为多个组成部分。
代码变换
- 指令替换:用等价的复杂指令序列替换标准指令。
- MBA(混合布尔算术):使用混合布尔算术表达式进行混淆。
- 虚拟化(VMP):将代码转换为由内嵌虚拟机执行的自定义字节码。
主要 OLLVM 框架
- 经典 OLLVM:https://github.com/obfuscator-llvm/obfuscator ,特性包括 BCF、CFF、指令替换、字符串加密。
- 现代变体:Hikari(含函数包装、反类转储等高级特性)、Pluto-Obfuscator(维护良好,含 MBA、间接分支、全局加密)、Arkari(现代实现,特性增强)、o-mvll(面向 iOS/Android 的移动端混淆器)。
- 专用工具:IR VMP(GANGE666/xVMP、NiTianErXing666/SmallVmp 用于虚拟化)、Warbird(微软商业混淆技术)。
使用方式
创建自定义 LLVM 混淆 Pass
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
class MyObfuscationPass : public llvm::FunctionPass {
public:
static char ID;
MyObfuscationPass() : FunctionPass(ID) {}
bool runOnFunction(llvm::Function &F) override {
// Implement obfuscation logic
for (auto &BB : F) {
for (auto &I : BB) {
// Transform instructions
}
}
return true;
}
};
最佳实践
- 保持语义:确保变换不破坏程序正确性。
- 随机化:使用带种子的随机数生成器以实现可复现构建。
- 分层方法:组合多种混淆技术。
- 性能平衡:权衡运行时开销与保护强度。
- 测试:在不同输入与平台上进行充分测试。
工具链集成
- NDK 集成:OLLVM 配合 Android NDK(r17-r23+),示例:android-ndk-aarch64-host-LLVM6.0-Ollvm-Armariris。
- 编译器工具链:ollvm-mingw(Windows 交叉编译)、ollvm-rust(Rust 工具链集成)、Swift 集成(swift-Ollvm11)。
适用场景
- 需要对发布软件进行代码混淆以提升反逆向难度的场景。
- 移动端(iOS/Android)应用的代码保护。
- 安全研究与混淆/去混淆技术分析。
限制与反去混淆注意事项
实施混淆时需考虑:
- 对符号执行(SymCC、KLEE)的抵抗能力。
- 针对模式匹配去混淆器的防护。
- 实现反调试检查。
- 使用动态派发以阻碍静态分析。
获取详细信息
需要详细且最新的资源链接、工具列表或项目参考时,可从以下地址获取最新数据:
https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md
该 README 包含以下综合精选列表:
- 80+ OLLVM 实现与分支(OLLVM 部分)
- MSVC Warbird 混淆工具(MSVC Warbird 部分)
- 基于 IR 的 VMP 与虚拟化项目
- 不同版本的 NDK 集成示例