1、环境搭建:python
系统:win10_X64linux
ndk版本:ndk-r12b(ndk-r12b后续版本也适用)android
cmake-3.9.1-win64-x64.msi 用于针对不一样编译器生成源代码构建文件,如使用VS则生成(.sln)等VS配置文件,若是使用gcc则生成(Makefile)git
mingw-w64-install.exe 基于windows的GNU gcc编译器github
python2.7 跑python脚本,不要使用3.0及以上版本windows
cmake,mingw,python下载地址(百度网盘):https://pan.baidu.com/s/1v49gBKzF-2VAqMywvtnlUw 密码:hd7z安全
添加环境变量:C:\Python27bash
C:\Program Files (x86)\mingw-w64\i686-7.2.0-posix-dwarf-rt_v5-rev1\mingw32\bin架构
C:\Program Files\CMake\bin框架
环境变量请根据软件具体安装路径配置
2、编译OLLVM
一、搞清楚概念:LLVM 和 OLLVM
Obfuscator-LLVM (OLLVM)是瑞士西北应用科技大学安全实验室针对LLVM编译组件开发的代码混淆工具,该工具彻底开源,目的是为了增长逆向工程的难度,保证代码的安全性。
Obfuscator-LLVM (OLLVM)集成了编译器,而且兼容LLVM支持的全部语言(C,C++, Objective-C, Ada and Fortran)和平台(x86, x86-64, PowerPC, PowerPC-64,ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430, SystemZ,and XCore)。
二、编译说明
git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git mkdir build cd build cmake -G “MinGW Makefiles” -DCMAKE_BUILD_TYPE=Release ../obfuscator/ mingw32-make -j7
网上不少资料上使用make命令,而不是mingw32-make命令,在我所安装的mingw并无提供make命令,前面说明了我是在win10 64系统上经过mingw-w64-install.exe安装的。多是系统不同的缘由。
cmake若是不指定参数的话,会默认去选择当前电脑里已有的编译器,若是安装了VS的话,会自动去查找VS编译器
若是打算使用vs编译
cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
会生成32位的依赖版本
cmake -G “Visual Studio 15 2017 Win64” -DCMAKE_BUILD_TYPE=Release ../obfuscator/
“Visual Studio 15 2017 Win64” 中的15和2017是指VS中平台工具集的编号与VS版本号的对应关系,14对应2015,12对应2013,若是要用VS编译,注意根据你所安装的VS版本进行配置。上面这种方法就会生成64位版本的编译环境,不过在测试编译时,32位正常编译经过,64位踩了不少坑,因此仍是不建议使用VS编译。
使用MinGw编译时,须要加上参数
cmake -G “MinGW Makefiles” -DCMAKE_BUILD_TYPE=Release ../obfuscator/
三、编译过程大约须要30分钟左右或者更长,编译完成后build文件夹下可看到bin 和 lib 两个文件夹,这是后续须要用到的。
3、在ndk中使用ollvm
一、android-ndk-r12b\toolchains路径下会有个 llvm 文件夹 ,复制 llvm 文件夹的一个副本到相同的路径(即android-ndk-r12b\toolchains路径下),而后重命名该文件夹为 ollvm-4.0
二、删掉android-ndk-r12b\toolchains\ollvm-4.0\prebuilt\windows-x86_64路径下的bin 和 lib64 文件夹,将上述build目录下的bin 和 lib 两个文件夹拷贝到路径android-ndk-r12b\toolchains\ollvm-4.0\prebuilt\windows-x86_64;
三、在 android-ndk-r12b\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 文件。
4、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
5、参考文献
https://www.anquanke.com/post/id/86384
http://blog.csdn.net/wangbaochu/article/details/45370543