OLLVM特性、使用原理

OLLVM是一种用于C/C++的混淆器,具备指令替换、虚假控制流、控制流打平等功能。通过指令替换,它使用复杂指令序列替换简单运算,如加法、减法、位操作。虚假控制流通过插入包含不透明谓语的新基本块来修改调用流程。控制流打平则将控制流图完全扁平化,增加逆向工程难度。此外,还可以通过注解指定混淆函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、OLLVM特性

目前ollvm支持的特性有以下几种:

  1. 指令替换 -mllvm -sub
  2. 虚假控制流 -mllvm -bcf
  3. 打平控制流 -mllvm -fla
  4. 函数(Funtions)注解

二、指令替换

所谓指令替换仅仅是对标准二进制运算(比如加、减、位运算)使用更复杂的指令序列进行功能等价替换,当存在多种等价指令序列时,随机选择一种。

这种混淆并不直截了当而且并没有增加更多的安全性,因为通过重新优化可以很容易地把替换的等价指令序列变回去。然而,提供一个伪随机数,就可以使指令替换给二进制文件带来多样性。

目前,只有在整数上的操作可用,因为在浮点数上的运算替换会带来四舍五入的错误以及不必要的数值不准确。

可用选项有

  1. -mllvm -sub:激活指令替换趟(pass
  2. -mllvm -sub_loop=3:如果激活了指令替换,使用这个选项在一个函数中应用3次指令替换。默认应用1次。

如何实现?

  1. 加法

    (1)a = b - (-c)

      %0 = load i32* %a, align 4

      %1 = load i32* %b, align 4

      %2 = sub i32 0, %1

      %3 = sub nsw i32 %0, %2

 

    (2)a= (-b + (-c))

     

### OLLVM使用方法 #### 安装与配置 CMake 和 LLVM 为了使用 OLLVM,首先需要安装并配置 CMake 和 LLVM 工具链。通过指定 `-T` 参数来设置目标平台工具集,并启用所需的项目模块[^2]。 ```bash cmake -S llvm -B build \ -DLLVM_ENABLE_PROJECTS="clang" \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_INCLUDE_TESTS=OFF \ -DLLVM_ENABLE_NEW_PASS_MANAGER=OFF \ -T host=x64 ``` 上述命令会生成适用于 Windows 平台的 Visual Studio 工程文件,同时禁用了测试功能以及新传递管理器的支持,从而减少不必要的依赖项和复杂度。 --- #### 启用 OLLVM 混淆选项 在编译过程中可以通过向 `CMAKE_C_FLAGS_RELEASE` 添加特定标志来激活 OLLVM 提供的各种混淆技术。例如: ```bash SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} \ -mllvm -bcf \ -mllvm -bcf_loop=4 \ -mllvm -bcf_prob=100 \ -mllvm -sub \ -mllvm -sub_loop=2 \ -mllvm -fla \ -mllvm -sobf \ -mllvm -split") ``` 这些参数分别对应不同的混淆策略: - **BCF (Bogus Control Flow)**: 插入虚假控制流以增加逆向分析难度。 - **SUB (Instruction Substitution)**: 替换某些指令为语义等价但形式更复杂的版本。 - **FLA (Flattening)**: 将程序逻辑转换为状态机的形式,破坏原有的控制结构。 - **SOBF**: 执行子表达式混淆操作。 - **Splitting**: 对函数体进行分割处理[^1]。 以上配置可以显著提升二进制代码的安全性和抗反汇编能力。 --- #### 构建 Android 项目中的应用实例 如果是在 Android 环境下遇到编译错误,则可能是因为未正确适配 NDK 或者缺少必要的支持库。建议检查以下几点: 1. 确认所使用的 NDK 版本兼容 OLLVM; 2. 调整 CMakeLists.txt 文件以包含额外的编译标记; 3. 如果存在链接阶段的问题,尝试手动调整 LDFLAGS 设置。 具体实现可参照官方文档说明完成相应修改工作。 --- #### 示例代码片段展示如何集成到构建脚本中 以下是将 OLLVM 整合进入常规 C++ 应用的一个简单例子: ```cpp #include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; } ``` 对应的 CMakeLists.txt 可能如下所示: ```cmake cmake_minimum_required(VERSION 3.18) project(MyProject LANGUAGES CXX) add_executable(myapp main.cpp) set_target_properties(myapp PROPERTIES COMPILE_FLAGS "-Oz -Xclang -plugin -Xclang obfuscation" ) ``` 注意这里启用了最高级别的优化开关 (`-Oz`) 来配合插件加载路径定义。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值