版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
前言
在 Android 应用安全中,Native 层 so 库往往是最容易被逆向分析的目标 。无论是游戏的核心逻辑,还是 App 的关键算法,一旦 so 被反编译,核心代码就可能暴露无遗。
传统的 Java 层混淆工具(如 ProGuard、R8)对 C/C++ 代码无能为力,因此 NDK 层代码的保护 成了安全加固中的难点。解决思路:在编译阶段对 so 进行混淆处理 ,让逆向难度大幅提升。
LLVM 生态中有一个安全扩展 —— OLLVM (Obfuscator-LLVM) ,它在编译流程里插入了混淆 Pass,能对 C/C++ 代码做 控制流平坦化、虚假控制流、指令替换 等处理,从而显著增加逆向门槛。
本文将带你实战:如何将 OLLVM 移植到 LLVM/NDK,并在 Android Studio 工程中使用它,为 Native 代码加上一层混淆保护。
OLLVM、LLVM 与 Android NDK
LLVM 是一个高度模块化的编译器框架,它能够将 C/C++ 等高级语言源码编译为中间表示(LLVM IR),再经过优化、生成目标机器码。它不仅仅是一个编译器,更是一个“编译基础设施”。
在 Android 平台上,自 NDK r18 开始,Google 就全面弃用了 GCC,转而采用 LLVM/Clang 作为官方工具链。也就是说,所有的 C/C++ 代码编译、优化、生成 so 库的过程,底层都是由 LLVM 驱动完成的。
OLLVM (Obfuscator-LLVM) 则是在 LLVM 基础上扩展的一个安全项目。它在 LLVM 编译流程中增加了混淆 Pass,可以对 C/C++ 代码进行 控制流平坦化、虚假控制流、指令替换 等混淆处理,从而有效提高逆向分析和反编译的难度,保护 Android 应用中 Native so 层的核心逻辑不被轻易破解。
最终实现编译流程大概如下:
┌──────────────────┐
│ C / C++ 源码 │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ LLVM (Clang) │ ← Android NDK 内置的官方编译器工具链
│ 前端:生成 IR │
└────────┬─────────┘
│ LLVM IR
▼
┌──────────────────┐
│ OLLVM Pass │ ← 基于 LLVM 的扩展:混淆(控制流平坦化、指令替换等)
│ (插入在中间) │
└────────┬─────────┘
│ 混淆后的 IR
▼
┌──────────────────┐
│ LLVM 后端优化 │
│ + 代码生成 │
└────────┬─────────┘
│ 汇编
▼
┌──────────────────┐
│ 链接生成 so │ ← 最终供 Android 应用调用的 native 库
└──────────────────┘
编译 LLVM
1. 下载源码
NDK 中 LLVM 所在路径:<android-ndk>/toolchains/llvm/prebuilt/<host-system>/bi

最低0.47元/天 解锁文章
1074

被折叠的 条评论
为什么被折叠?



