代码混淆能起到很好的反逆向分析,类似于 java 的 proguard 混淆和 dex 文件的 dexguard 混淆工具,c/c++ 也有对应的 ollvm 混淆组件。
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
$ 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 目录,然后进行修改。手动创建的时候遇到过编译失败,直接复制修改就没这种问题。
[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文件。
#
# 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 中添加混淆编译参数:
LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla
参数相关的文档可以看 github 上的wiki: https://github.com/obfuscator-llvm/obfuscator/wiki
Application.mk 中配置 NDK_TOOLCHAIN_VERSION
APP_ABI := x86 armeabi-v7a x86_64 arm64-v8a mips armeabi mips64
NDK_TOOLCHAIN_VERSION := clang-ollvm4.0
参考文章:
原文地址:OLLVM + NDK 混淆编译环境搭建