将OLLVM-3.6.1加入 android-ndk-r14b编译链
编译环境信息
Ubuntu 18.04.1 + android-ndk-r14b+OLLVM-3.6.1
OLLVM下载编译
OLLVM托管在github上,可直接clone项目进行编译。依次执行下列命令进行编译
$ git clone -b llvm-3.6.1 https://github.com/obfuscator-llvm/obfuscator.git
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
$ make -j5
执行命令
$ cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
如果出现错误
CMake Error at cmake/modules/AddLLVM.cmake:1163 (add_custom_target):
add_custom_target cannot create target "check-llvm-bindings-ocaml" because
another target with the same name already exists. The existing target is a
custom target created in source directory
"/home/xxx/obfuscator/test". See documentation
for policy CMP0002 for more details.
Call Stack (most recent call first):
cmake/modules/AddLLVM.cmake:1226 (add_lit_target)
test/CMakeLists.txt:150 (add_lit_testsuites)
则修改为以下命令再次尝试
$ cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
编译完成后,在build目录下生成编译后的文件,这里我门只需要bin和lib这两个目录下的文件。
将OLLVM加入NDK编译链
在NDK下新建编译链
打开目录android-ndk-r14b/toolchains,复制文件llvm并重命名为obfuscator-llvm-3.6,进入目录obfuscator-llvm-3.6/prebuilt/linux-x86-64,删除其中的bin目录和lib64目录,并将之前编译生成的bin和lib拷贝到此目录下。
配置编译链
进入目录android-ndk-r14b/build/core/toolchains,复制文件arm-linux-androideabi-clang并重命名为arm-linux-androideabi-clang3.6-obfuscator。 打开arm-linux-androideabi-clang3.6-obfuscator目录, 修改setup.mk的内容为:
##########修改前#########
#LLVM_TOOLCHAIN_ROOT := $(call get-toolchain-root,llvm)
#LLVM_TOOLCAHIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/
########################
########修改后##########
LLVM_VERSION := 3.6
LLVM_NAME := onfuscator-llvm-$(LLVM_VERSION)
LLVM_TOOLCHAIN_ROOT := $(LLVM_NAME)
LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,$(LLVM_TOOLCHAIN_ROOT))
LLVM_TOOLCAHIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/
#其余内容不变
........
配置使用OLLVM混淆编译
在Application.mk中加入:
NDK_TOOLCHAIN_VERSION := clang3.6-obfuscator
在Android.mk中配置混淆参数
LOCAL_CFLAGS += -mllvn -sub -mllvm -bcf -mllvm -fla
参数说明
-fla for the control flow flattening pass 控制流扁平化
-sub for the instruction substitution pass 指令替换
-bcf for the bogus control flow pass 伪造控制流
说明
以上配置只是32位arm的编译链配置步骤,故只能编译armeabi和armeabi-v7a的.so文件,如果需要编译其它平台的.so文件,则按照类似步骤配置编译链即可。