Skip to content

lux-QAQ/ollvm-clang21.0

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

移植 ollvm(Hikari) 到 llvm+clang21.0

中文 | English

旧的 ollvm 最高到 llvm+clang17.06 的,而 llvm+clang17.06 的版本太老了,为了学习c++的新特性import,所以我决定将 ollvm(Hikari) 复制移植到 llvm+clang21.0 上。
如果你觉得本项目对你有帮助请点个star⭐。


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 启用函数封装

安装

编译好的版本

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),如果内存不够请:

  1. 减少编译最大并发数
  2. 增加虚拟内存

首次编译预计会花费20分钟左右。

编译后在Release/bin目录下会有clang.execlang++.exe,生成。你需要下载官方的llvm+clang,然后把你自己编译产物替换到官方的llvm+clang的bin中即可。

截至2025年2月,官方发布的Release版本是LLVM 20.1.0-rc1。但是我使用的是官方main分支编译的,所以版本号是21.0.0。故这里可能存在一些未知的兼容性问题。


混淆效果

Ollvm虽然不及很多商业混淆器,但是效果仍然非常强,对付普通的逆向和脚本小子足够了。

变量混淆

1

大量虚假控制流+平坦化

2

字符串加密

3


已知的问题

当前版本 ollvm 已知问题

截至2025年2月

  1. 在编译复杂代码,使用-mllvm -enable-allobf启用所有混淆器时,会消耗非常多的内存(已请求内存可达100GB+),可能会导致电脑崩溃。这个问题可能是由于代码内存泄漏导致的。故在大型项目请勿启用所有混淆器。
  2. 虚假控制流参数-enable-bcfobf启用时。代码中不能存在(抛出异常好像可以存在)捕获异常的代码,会导致编译器崩溃。这个问题据说是:ollvmfixstack函数导致的,如果要修复可能得修改eh的返回边还有invoke的支配关系。(反正我不是很搞得懂)。希望有大佬出手。
  3. ollvm会影响性能,即使开启-O3优化选项性能仍然会下降。而如果开启-O0你会发现程序几乎不能正常运行。
  4. 开启编译器的优化选项可能会导致ollvm混淆器效果下降,所有请根据实际情况选择优化选项。
  5. 对于AntiClassDump的功能只适用于Apple平台,其他平台无效。

关于移植中的一些问题

我发现llvm17.06和21.0的llvm/lib/Passes/PassBuilderPipelines.cpp一些代码已经不一样了。根据我粗浅的理解:这里需要确定何种情况下向MPM中导入ObfuscationPass()。我按照llvm+clang17的版本中的情况,将ObfuscationPass()导入到了MPM中。但是,有一些21.0新增的情况我不知道是否应该添加ObfuscationPass()MPM中(我选择的是不添加)。所以这里可能存在一些问题,会导致混淆性能下降。

About

将ollvm移植到llvm+clang21.0

Topics

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Packages

No packages published

Languages

  • LLVM 39.1%
  • C++ 33.8%
  • C 13.3%
  • Assembly 9.6%
  • MLIR 1.3%
  • Python 0.8%
  • Other 2.1%