移植Ollvm到LLVM+Clang21.0
移植Ollvm到LLVM+Clang21.0
Ollvm是一个基于LLVM的代码混淆器,用于反调试和反编译。本文将介绍如何将Ollvm移植到最新版的LLVM+Clang 21.0上,包括具体的移植步骤、使用方法和已知问题。
Ollvm简介
Ollvm是一个基于LLVM的代码混淆器,用于反调试和反编译。
Hikari-LLVM15项目地址
Hikari-LLVM15是混淆器的核心实现。
使用方法
HikariObfuscator的wiki中列出了常见的使用方法:
-mllvm -enable-allobf 全部启用
-mllvm -enable-bcfobf 启用伪控制流
-mllvm -enable-cffobf 启用控制流平坦化
-mllvm -enable-splitobf 启用基本块分割
-mllvm -enable-subobf 启用指令替换
-mllvm -enable-acdobf 启用反class-dump
-mllvm -enable-indibran 启用基于寄存器的相对跳转,配合其他加固可以彻底破坏IDA/Hopper的伪代码(俗称F5)
-mllvm -enable-strcry 启用字符串加密
-mllvm -enable-funcwra 启用函数封装
安装
编译好的版本
你可以下载编译好的版本,然后直接替换到官方的LLVM+Clang中。
如何自己编译
所需工具
- Visual Studio
- CMake
我使用的是MSVC编译器。其他编译器我没有测试过,但应该也可以编译。
下载源码
git clone https://github.com/lux-QAQ/ollvm-clang21.0.git -b clang+ollvm-21.0.0 --depth 1 --recursive
创建构建目录
mkdir build
cd build
配置CMake
cmake -DLLVM_ENABLE_PROJECTS="clang;lld;" -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_BENCHMARKS=OFF -G "Visual Studio 17 2022" -A x64 -Thost=x64 ..\llvm
这里只选择了Clang和LLD,如果你需要其他的可以自己添加。
编译
打开生成的LLVM.sln,将编译设置为Release,然后编译Clang即可。
注意编译的时候会消耗大量内存(预计会超过25GB),如果内存不够请:
- 减少编译最大并发数
- 增加虚拟内存
首次编译预计会花费20分钟左右。
编译后在Release/bin目录下会有clang.exe和clang++.exe,你需要下载官方的LLVM+Clang,然后把你自己编译产物替换到官方的LLVM+Clang的bin中即可。
截至2025年2月,官方发布的Release版本是LLVM 20.1.0-rc1。但是我使用的是官方main分支编译的,所以版本号是21.0.0。故这里可能存在一些未知的兼容性问题。
混淆效果
Ollvm虽然不及很多商业混淆器,但是效果仍然非常强,对付普通的逆向和脚本小子足够了。
变量混淆
大量虚假控制流+平坦化
字符串加密
已知的问题
当前版本Ollvm已知问题
截至2025年2月:
在编译复杂代码,使用-mllvm -enable-allobf启用所有混淆器时,会消耗非常多的内存(已请求内存可达100GB+),可能会导致电脑崩溃。这个问题可能是由于代码内存泄漏导致的。故在大型项目请勿启用所有混淆器。
虚假控制流参数-enable-bcfobf启用时。代码中不能存在(抛出异常好像可以存在)捕获异常的代码,会导致编译器崩溃。这个问题据说是Ollvm中fixstack函数导致的,如果要修复可能得修改eh的返回边还有invoke的支配关系。(反正我不是很搞得懂)。希望有大佬出手。
Ollvm会影响性能,即使开启-O3优化选项性能仍然会下降。而如果开启-O0你会发现程序几乎不能正常运行。
开启编译器的优化选项可能会导致Ollvm混淆器效果下降,所有请根据实际情况选择优化选项。
关于移植中的一些问题
我发现LLVM 17.06和21.0的llvm/lib/Passes/PassBuilderPipelines.cpp一些代码已经不一样了。根据我粗浅的理解:这里需要确定何种情况下向MPM中导入ObfuscationPass()。我按照llvm+clang17的版本中的情况,将ObfuscationPass()导入到了MPM中。但是,有一些21.0新增的情况我不知道是否应该添加ObfuscationPass()到MPM中(我选择的是不添加)。所以这里可能存在一些问题,会导致混淆性能下降。