中文 | English
旧的 ollvm 最高到 llvm+clang17.06
的,而 llvm+clang17.06 的版本太老了,为了学习c++
的新特性import
,所以我决定将 ollvm(Hikari) 复制移植到 llvm+clang21.0 上。
如果你觉得本项目对你有帮助请点个star
⭐。
ollvm是一个基于llvm的代码混淆器,用于反调试和反编译。
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 启用函数封装
Release
你可以下载我编译好的版本然后直接替换到官方的llvm+clang
中。
和这篇文章差不多。详细步骤可参考: 构建含有ollvm功能的clang-cl
所需工具vs studio
+cmake
我用的编译器是
msvc
。其他的编译器我没有测试过,不过应该也可以编译。
找个空间大的地方
git clone https://github.com/lux-QAQ/ollvm-clang21.0.git -b clang+ollvm-21.0.0 --depth 1 --recursive
创建个build文件夹
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,如果你需要其他的可以自己添加。
随后进入build文件夹,打开生成的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虽然不及很多商业混淆器,但是效果仍然非常强,对付普通的逆向和脚本小子足够了。
截至2025年2月
- 在编译复杂代码,使用
-mllvm -enable-allobf
启用所有混淆器时,会消耗非常多的内存(已请求内存可达100GB+)
,可能会导致电脑崩溃。这个问题可能是由于代码内存泄漏导致的。故在大型项目请勿启用所有混淆器。 - 虚假控制流参数
-enable-bcfobf
启用时。代码中不能存在(抛出异常好像可以存在)捕获异常的代码,会导致编译器崩溃。这个问题据说是:ollvm
中fixstack
函数导致的,如果要修复可能得修改eh的返回边
还有invoke的支配关系
。(反正我不是很搞得懂)。希望有大佬出手。 ollvm
会影响性能,即使开启-O3
优化选项性能仍然会下降。而如果开启-O0
你会发现程序几乎不能正常运行。- 开启编译器的优化选项可能会导致
ollvm
混淆器效果下降,所有请根据实际情况选择优化选项。 - 对于AntiClassDump的功能只适用于Apple平台,其他平台无效。
我发现llvm17.06和21.0的llvm/lib/Passes/PassBuilderPipelines.cpp
一些代码已经不一样了。根据我粗浅的理解:这里需要确定何种情况下向MPM
中导入ObfuscationPass()
。我按照llvm+clang17
的版本中的情况,将ObfuscationPass()
导入到了MPM
中。但是,有一些21.0新增的情况我不知道是否应该添加ObfuscationPass()
到MPM
中(我选择的是不添加)。所以这里可能存在一些问题,会导致混淆性能下降。