Ubuntu18 下 ndk16b 与 ollvm 环境搭建-2020.05.04

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. 错误处理

编译时,缺少的头文件如:

Ubuntu18 下 ndk16b 与 ollvm 环境搭建-2020.05.04_第1张图片
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 等文件,缺少什么文件就 拷贝什么文件,直到编译成功

参考文档

手把手编译 ollvm

你可能感兴趣的:(Android逆向与安全)