方案简介
LLVM 是一个编译器框架,包含了从编译器前端「Clang」、中间语言「IR」、编译器后端、链接器整个链条,基于 LLVM 的代码保护技术主要通过向 LLVM 框架中添加混淆流程「Pass」,对编译的中间语言 IR 进行混淆,最后通过 LLVM 编译器后端生成具体的平台相关指令,再链接成相应的可执行程序,大致流程如下:
简而言之,基于LLVM的代码保护方案就是在对中间指令 IR 处理,实现了如控制流扁平化、切分基本块、指令替换、虚假控制流等代码混淆功能,开发者不用关心后端的平台相关指令,都交由 LLVM 完成。
保护效果
使用OLLVM保护RC4算法,然后使用IDA Pro进行分析,对于如下:
控制流程图
反编译结果
通过反编译结果可以看出,经过OLLVM保护后的代码逻辑变得复杂难懂,起到了一定的防逆向分析效果。
问题描述
虽然使用OLLVM进行保护后,可以在一定程度上起到防止反编译的作用,但依旧存在很多问题。
可以被反编译
由于 OLLVM 是在编译过程中对 LLVM IR 进行了处理,IR 属于架构无关指令,在 LLVM 后端依然要生成平台相关的指令,所以最终只是变成了「更加复杂的 C/C++ 代码」而已。
边界清晰
通过「基本块」拆分,虽然函数中的逻辑块变得很分散,但它们依旧排列在一起,函数有明确的起始和结尾。
函数间引用关系可见
混淆对象受限于 IR 指令,无法精细的对 Native 指令进行操作,使得保护后的代码仍然可以被反编译工具用 「交叉引用」 搜索到,对函数间调用关系的保护效果差。