OLLVM + NDK 混淆编译环境搭建

0x00 OLLVM 简介

Obfuscator-LLVM is a project initiated in June 2010 by the information security group of the University of Applied Sciences and Arts Western Switzerland of Yverdon-les-Bains (HEIG-VD).

The aim of this project is to provide an open-source fork of the LLVM compilation suite able to provide increased software security through code obfuscation and tamper-proofing. As we currently mostly work at the Intermediate Representation (IR) level, our tool is compatible with all programming languages (C, C++, Objective-C, Ada and Fortran) and target platforms (x86, x86-64, PowerPC, PowerPC-64, ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430, SystemZ, and XCore) currently supported by LLVM.

源码地址:https://github.com/obfuscator-llvm/obfuscator/

0x01 环境信息

系统环境:MacOS
系统版本:10.12.5
NDK版本:android-ndk-r14b

0x02 下载编译

github 上最新版本是4.0,可以直接 clone github 项目编译,可参考提供的 wiki 文档:Installation

1
2
3
4
5
$ git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
$ make -j7

这里编译的时候需要 cmake 工具,可以通过 Homebrew 直接安装。编译成功后,生成的文件在 build/bin 下

0x03 与 NDK 整合

新建编译链

在 android-ndk-r14b/toolchains 下新建目录 ollvm-4.0/prebuilt/darwin-x86_64,把前一步编译生成的结果拷贝到此目录下(主要是bin和lib)。

这里最好直接复制 llvm 目录,然后进行修改。手动创建的时候遇到过编译失败,直接复制修改就没这种问题。

1
2
3
[armeabi-v7a] Compile++ thumb: native <= jni_export.cpp
make: execvp: /Users/xiangqing/Documents/code/ollvm/build/bin: Permission denied
make: *** [/Users/xiangqing/Documents/project/droid-ndk/example/src/main/obj/local/armeabi-v7a/objs/native/jni_export.o] Error 127

配置编译链

在 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文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#
# Override the toolchain prefix
#
############################ 原始配置 ############################
#LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,llvm)
#LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/
#################################################################
############################ 修改后 #############################
OLLVM_NAME := ollvm-4.0
LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,$(OLLVM_NAME))
LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/
#其他配置不做修改
......

config.mk 保存的是该编译链对应的 CPU 架构,所以上面修改完只能编译 armeabi 和 armeabi-v7a 架构的 so。如果需要编译其他架构需要做相应的修改。文件夹名也必须按照严格的格式,如 mips 的需要添加文件夹:mipsel-linux-android-clang-ollvm4.0,修改相应的 setup.mk 文件。

0x04 OLLVM 使用

使用 ollvm 进行 ndk 的编译需要对 Application.mk 和 Android.mk 文件做相应的修改。

Android.mk 中添加混淆编译参数:

1
LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla

参数相关的文档可以看 github 上的wiki: https://github.com/obfuscator-llvm/obfuscator/wiki

Application.mk 中配置 NDK_TOOLCHAIN_VERSION

1
2
APP_ABI := x86 armeabi-v7a x86_64 arm64-v8a mips armeabi mips64
NDK_TOOLCHAIN_VERSION := clang-ollvm4.0

参考文章: