简介
Obfuscator-LLVM 是 2010 年 6 月由 Yverdon-les-Bains 的瑞士西部应用科学与艺术大学 ( HEIG-VD ) 的信息安全小组发起的一个项目。
该项目的目的是提供LLVM编译套件的开源分支,能够通过代码混淆和防篡改提供更高的软件安全性。由于我们目前主要在中间表示(IR) 级别工作,因此我们的工具兼容所有编程语言(C、C++、Objective-C、Ada 和 Fortran)和目标平台(x86、x86-64、PowerPC、PowerPC-64 、ARM、Thumb、SPARC、Alpha、CellSPU、MIPS、MSP430、SystemZ 和 XCore)当前受 LLVM 支持。仓库地址,只不过仅更新到llvm的4.0,2017年开始就没在更新。
这里安装的是修改后的9.0.1版本,ndk使用20.0.5594570版本
下载
git clone https://github.com/heroims/obfuscator.git
编译
cd obfuscator
git checkout llvm-9.0.1
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CREATE_XCODE_TOOLCHAIN=ON -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
make -j8 #8是你的CPU线程数量 比如8核16线程可以写 -j16
整合到Android NDK
编译完成之后,需要把我们编译的新的支持Ollvm的clang复制替换掉 AndroidStudio使用的NDK目录 中的对应文件。
我们编译目录 /build/bin下面 clang、clang-9、clang-format、clang++ 这四个文件,复制到 AndroidStudio使用的NDK目录 /toolchains/llvm/prebuilt/darwin-x86_64/bin,存在同名文件需要替换掉。
我们编译目录 /build/lib/clang/9.0.1/include下面 stdarg.h 、stddef.h 、__stddef_max_align_t.h 、float.h 这四个文件复制到 AndroidStudio使用的NDK目录 /toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include 文件夹下。
配置
在CMakeLists.txt文件中加入
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -mllvm -fla -mllvm -split -mllvm -split_num=3 -mllvm -sub -mllvm -sub_loop=3 -mllvm -bcf -mllvm -bcf_prob=40 -mllvm -sobf")
ollvm指令
控制流扁平化
这个模式主要是把一些if-else语句,嵌套成do-while语句
- -mllvm -fla:激活控制流扁平化
- -mllvm -split:激活基本块分割。在一起使用时改善展平。
- -mllvm -split_num=3:如果激活了传递,则在每个基本块上应用3次。默认值:1
指令替换
这个模式主要用功能上等效但更复杂的指令序列替换标准二元运算符(+ , – , & , | 和 ^)
- -mllvm -sub:激活指令替换
- -mllvm -sub_loop=3:如果激活了传递,则在函数上应用3次。默认值:1
虚假控制流程
这个模式主要嵌套几层判断逻辑,一个简单的运算都会在外面包几层if-else,所以这个模式加上编译速度会慢很多因为要做几层假的逻辑包裹真正有用的代码。
- -mllvm -bcf:激活虚假控制流程
- -mllvm -bcf_loop=3:如果激活了传递,则在函数上应用3次。默认值:1
- -mllvm -bcf_prob=40:如果激活了传递,基本块将以40%的概率进行模糊处理。默认值:30
其他
- -mllvm -sobf 开启字符串混淆
- -mllvm -seed=0xdeadbeaf 指定随机数种子生成器
评论区