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