转载:https://blog.csdn.net/u011337769/article/details/86659566
1.下载llvm4.0
2.安装ndk,版本信息为
添加环境变量
export NDK_HOME=/opt/android/ndk/android-ndk-r10b export PATH=$NDK_HOME:$PATH |
3.准备编译ollvm的环境
安装编译工具 apt-get install cmake apt-get install g++
编译ollvm源码 git clone -b obfuscator-llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git mkdir build cd build cmake -DCMAKE_BUILD_TYPE:String=Release ../ make -j7 在build目录下会生成编译后的程序,我们只会用到bin和lib目录下的文件
|
执行cmake时报错
修改为以下命令再尝试编译可顺利通过
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../ |
然后执行make –j7,编译报错,可能是虚拟机配置低了,库与库之间存在依赖导致报错,将配置改为4核4G内存,再次make 不加-j参数,编译通过,
4.将编译好的工具链整合到NDK中
将ndk中的toolchains下的llvm/prebuilt复制到toolchains/o-llvm-4.0中
将编译好的ollvm4.0的bin和lib复制替换到ndk/toolchains/ollvm-4.0/下的bin和lib
在android-ndk-r14b/build/core/toolchains目录下,新建目录 arm-linux-androideabi-clang-ollvm4.0,拷贝目录 arm-linux-androideabi-clang 下的文件 config.mk 与 setup.mk 到 arm-linux-androideabi-clang-ollvm4.0 中,修改setup.mk文件。
#change before #LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,llvm) #LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/ #change after OLLVM_NAME := ollvm-4.0 LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,$(OLLVM_NAME)) LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/ |
使用 ollvm 进行 ndk 的编译需要对 Application.mk 和 Android.mk 文件做相应的修改。Android.mk 中添加混淆编译参数:
LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla |
Application.mk 中配置 NDK_TOOLCHAIN_VERSION
APP_ABI := x86 armeabi-v7a x86_64 arm64-v8a armeabi mips64 NDK_TOOLCHAIN_VERSION := clang-ollvm-4.0 |
5.使用ollvm生成混淆过的程序
命令介绍
-mllvm -fla 开启控制流平坦化 -mllvm -sub 开启指令替换 -mllvm -bcf 开启虚假控制流 -mllvm -sobf 开启字符串混淆 -mllvm -seed=0xdeadbeaf 指定随机数种子生成器 bcf可以配合下面参数使用 -mllvm -bcf_loop=3 设置函数混淆次数为3次 不加此选项默认为1次 -mllvm -bcf_prob=40 设置代码块被混淆的概率是40%,默认30% |
创建工程目录 此处为test,创建子目录jni,在jni目录下创建Android.mk并根据需求编写mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := test LOCAL_SRC_FILES := test.c LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla LOCAL_ARM_MODE := arm include $(BUILD_EXECUTABLE) |
在jni目录下创建Application.mk并根据需求编写mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) APP_PLATFORM :=android-14 APP_ABI := armeabi-v7a NDK_TOOLCHAIN_VERSION := clang-ollvm-4.0 include $(BUILD_EXECUTABLE) |
在jni目录下创建代码文件hello.c
#include <stdio.h> int main(int argc, char** argv) { int a=1; int b=0; if(a>b) { printf("a:%d\n",a); } else{ printf("b:%d\n",b); } return 0; } |
在工程目录下执行ndk-build命令
混淆后的效果: