1.获取最新版本 obfuscator-llvm 中的 4.0 版本
git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
make -j7
2. 下载 linux 版 ndk
进入下载页:https://developer.android.google.cn/ndk/downloads/
如下载 android-ndk-r16b-linux-x86_64.zip
(不要下载最新的,最新的 ndK 头文件会缺失更多)
3. ndk 环境变量设置
unzip android-ndk-r16b-linux-x86_64.zip
vim ~/.bashrc
export NDK_HOME=/home/lmhu/android-ndk/android-ndk-r16b/
export PATH=$NDK_HOME:$PATH
source ~/.bashrc
4. 拷贝 obfuscator-llvm 生成的可执行文件
进入 obfuscator-llvm 前面 make -j7 生成的 build/bin 目录下面 ,将 clang++ 、clang、clang-format、 clang-4.0、拷贝覆盖到 android-ndk-r16b/toolchains/llvm/prebuilt/linux-x86_64/bin(执行前可自行备份)。
5. ollvm 混淆指令
在 CMakeLists.txt 里的 SET(CMAKE_CXX_FLAGS 追加 -mllvm -fla 或在 Android.mk 中 CMAKE_C_FLAGS 增加相应 llvm 相关指令,然后重新编译项目。
注:使用 OLLVM 当前可用的标志有:
-mllvm -fla -mllvm -sub -mllvm -bcf
-fla : 控制流扁平化 (将程序的控制流图完全地扁平化)
-sub : 指令替换(对标准二进制运算(比如加、减、位运算)使用更复杂的指令序列进行功能等价替换)
-bcf : 虚假控制流 (在当前基本块之前添加一个基本块,来修改函数调用流程图)
6. 错误处理
编译时,缺少的头文件如:
toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/jni.h:27:10: fatal error: ‘stdarg.h’ file not found
在 ollvm 前面 make -j7 生成的目标目录下面,搜索 stdarg.h ,找到该文件的所在的目录,拷贝到 toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/ 下面
cp .../lib/clang/4.0.1/include/stdarg.h .../android-ndk-r16b/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include
同理:stddef.h、 __stddef_max_align_t.h、float.h 等文件,缺少什么文件就 拷贝什么文件,直到编译成功
参考文档