OLLVM分析

一、LLVM是什么

LLVM最初是Low Level Virtual Machine的缩写,定位是一个,但是是比较底层的虚拟机。然而LLVM本身并不是一个完整的编译器,LLVM是一个编译器基础架构(infrastructure),把很多编译器需要的功能以可调用的模块形式实现出来并包装成库,供其他编译器实现者可以根据自己的需要选择使用或者扩展。主要聚焦于编译器后端功能,如代码生成、代码优化、JIT等。

编译器前端和后端就是编译器经典的三段式设计中的组成。如下图所示

LLVM是一个优秀的编译器框架,它也采用经典的三段式设计。前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操作,通过一系列的Pass对IR做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。如下图所示

从源码角度分析,如果你下载LLVM的代码,那么它就是一个IR到ARM/机器码的编译器。比如bin/opt就是对IR的优化器,bin/llc就是IR->ASM的翻译,bin/llvm-mc就是汇编器。如果你再从http://llvm.org下载Clang,那么就有了C->IR的翻译以及完整的编译器Driver。GDB是GNU的调试器。只要编译器支持DWARF格式,就可以用GDB调试。

LLVM IR是LLVM的中间表示,优化器就是对IR进行操作的,具体的优化操作由一些列的Pass来完成,当前端生成初级IR后,Pass会依次对IR进行处理,最终生成后端可用的IR。具体过程见第二部分介绍Clang与LLVM关系。

三、Clang与LLVM关系

LLVM与Clang是C/C++编译器套件。对于整个LLVM的框架来说,包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端(第一部分有讲到)。Clang使用了LLVM中的一些功能,目前所知道的主要就是对中间格式代码的优化,或许还有一部分生成代码的功能。从源代码角度来讲,Clang和LLVM的源码位置可以看出,Clang是基于LLVM的一个工具。而从功能的角度来说, LLVM可以认为是一个编译器的后端,而Clang是一个编译器的前端,它们的关系就更加的明了了,一个编译器前端想要程序最终变成可执行文件,是缺少不了对编译器后端的介绍的。


三、OLLVM是什么

OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,这个项目的目标是提供一个LLVM编译套件的开源分支,能够通过代码混淆和防篡改,增加对逆向工程的难度,提供更高的软件安全性。目前,OLLVM已经支持LLVM-4.0.1版本。

OLLVM的混淆操作就是在中间表示IR层,通过编写Pass来混淆IR,然后后端依据IR来生成的目标代码也就被混淆了。得益于LLVM的设计,OLLVM适用LLVM支持的所有语言(C, C++, Objective-C, Ada 和 Fortran)和目标平台(x86, x86-64, PowerPC, PowerPC-64, ARM, Thumb, SPARC, Alpha, CellSPU,MIPS, MSP430, SystemZ, 和 XCore)

Linux下首先下载源码,编译OLLVM混淆器,方法如下

用cmake编译的过程中,可能会出现如下问题


CMake Error at cmake/modules/AddLLVM.cmake:1163 (add_custom_target):
add_custom_target cannot create target "check-llvm-bindings-ocaml" because
another target with the same name already exists. The existing target is a
custom target created in source directory
"/home/xxx/obfuscator/test". See documentation
for policy CMP0002 for more details.
Call Stack (most recent call first):
cmake/modules/AddLLVM.cmake:1226 (add_lit_target)
test/CMakeLists.txt:150 (add_lit_testsuites)


修改为以下命令再尝试编译可顺利通过


cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../fuscator/


下载的源码里已经包含了LLVM和Clang,编译完成后,编译好的二进制程序都存放在build/bin目录下。

使用Obfuscator-LLVM最简单的方法是将标志(第一部分提到的PASS)传递给Clang的LLVM后端。 当前可用的标志是:

1.     -fla 控制流扁平化的PASS参数

2.     -sub指令替换的PASS参数

3.     -bcf虚假控制流的PASS参数

具体使用过程如下:

假设有一个命名为test.c的源文件,如果要使用工具,在终端输入如下命令

如果一次操作传递不止一个PASS,也可以这样输入命令

在多源文件项目中可以通过这样修改MakeFile来使用OLLVM工具

 

04-02
### Obfuscated LLVM (OLLVM) 的简介 Obfuscated LLVM (简称 OLLVM) 是一种基于 LLVM 构建的开源项目,旨在通过对前端语言生成的中间表示(IR)代码进行混淆处理来增强软件的安全性[^1]。该项目通过引入多种高级代码混淆技术,使得逆向工程变得极为困难,从而保护程序中的敏感逻辑和数据。 #### OLLVM 的主要特点 OLLVM 提供了一系列强大的混淆功能,这些功能能够显著提升二进制文件的抗反编译能力。以下是其核心特性: - **控制流平坦化(Control Flow Flattening)**: 将原始的控制流结构替换为状态机形式的状态转移表,使静态分析更加复杂。 - **虚假控制流注入(False Control-flow Injection)**: 向程序中插入无意义的操作路径,干扰动态追踪工具的工作机制。 - **指令子域编码(Instruction Substitution and Domain Encoding)**: 替换标准操作码并重新定义运算方式,隐藏实际计算意图。 #### 配置与集成指南 为了在开发环境中有效利用 OLLVM 功能,开发者通常需要完成特定设置步骤。例如,在 macOS 下使用 Xcode 进行 C/C++ 编程时,可以通过以下命令调整默认构建链路至支持 OLLVM 版本[^2]: ```bash cd Resources/ sudo mv Clang\ LLVM\ 1.0.xcspec Obfuscator.xcspec sudo vim Obfuscator.xcspec ``` 上述脚本片段展示了如何修改系统级配置文件以启用定制化的 clang 工具链实例指向 obfuscator 实现版本。 #### 结合其他组件扩展应用范围 除了单独部署外,还可以借助周边生态系统完善整体解决方案架构设计思路。比如结合 Clang 前端解析器以及 Opt 调试辅助手段共同协作达成更优效果[^3]。具体而言: - 利用 `clang` 执行源码到 IR 的转换过程; - 应用由 LLVM Pass Manager 加载指定插件模块实施额外变换措施; - 最终依靠 opt 工具验证最终产物质量状况或者继续精调参数设定直至满足预期目标为止。 另外值得注意的是,在某些场景下可能还需要考虑针对字符串常量部分采取专门防护策略防止泄露隐私信息内容[^4]。此时可参考相应文档资料学习实现细节进而融入既有体系当中形成统一管理方案。 ```cpp // 示例:简单字符串加密函数原型声明 std::string encryptString(const std::string& input); std::string decryptString(const std::string& encryptedInput); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值