问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

移植Ollvm到LLVM+Clang21.0

创作时间:
作者:
@小白创作中心

移植Ollvm到LLVM+Clang21.0

引用
CSDN
1.
https://m.blog.csdn.net/qq_24508399/article/details/145534091

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

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

首次编译预计会花费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月:

  1. 在编译复杂代码,使用-mllvm -enable-allobf启用所有混淆器时,会消耗非常多的内存(已请求内存可达100GB+),可能会导致电脑崩溃。这个问题可能是由于代码内存泄漏导致的。故在大型项目请勿启用所有混淆器。

  2. 虚假控制流参数-enable-bcfobf启用时。代码中不能存在(抛出异常好像可以存在)捕获异常的代码,会导致编译器崩溃。这个问题据说是Ollvm中fixstack函数导致的,如果要修复可能得修改eh的返回边还有invoke的支配关系。(反正我不是很搞得懂)。希望有大佬出手。

  3. Ollvm会影响性能,即使开启-O3优化选项性能仍然会下降。而如果开启-O0你会发现程序几乎不能正常运行。

  4. 开启编译器的优化选项可能会导致Ollvm混淆器效果下降,所有请根据实际情况选择优化选项。

关于移植中的一些问题

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号