如何在Windows下成功編譯OLLVM
前言:
轉眼又是一年,作者前段時間一直在研究Android加固方面的東西,剛好研究到了利用ollvm做so檔案混淆。在網上查詢的資料大部分都講的是Linux下進行編譯,少有的文章講到Windows下編譯,自己實驗起來也是編譯失敗的,應該是自己的環境搭建有問題,但是又查不到相關資料(沒辦法,水平有限 :sob:),在一次偶然的機會看到一篇相關文章。裡面有用到使用cmake命令生成OLLVM的vs解決方案,讓我解決了這一個問題,在Windows下也能輕鬆編譯OLLVM了,於是打算寫下這篇文章作為記錄。
環境:
Windows10 + vs2017 + cmake3.9.1 + android-ndk-r12b
使用cmake生成vs工程:
mkdir build
cd build
cmake ..\obfuscator-llvm-4.0
ps:obfuscator-llvm-4.0為OLLVM的原始碼目錄,cmake命令會自動尋找相應的vs,但需vs2015以上版本方可。
生成完成會有如下提示:
接著進入到build目錄,可以看到名稱為LLVM的解決方案:
雙擊開啟該解決方案,可以看到該解決方案包含了359個專案,可見工程的龐大程度。
接著編譯,OK了 。。。
編譯結果在 build\Debug目錄下
NDK整合OLLVM:
1. 複製貼上android-ndk-r12b\toolchains目錄下的llvm 目錄(生成副本),然後重新命名該目錄為 ollvm-4.0
2. 將上述編譯出來的bin 和lib 兩個目錄刪除掉所有的.pdb檔案,然後拷貝到 android-ndk-r12b\toolchains\ollvm-4.0\prebuilt\windows-x86_64路徑下替換 bin 和 lib64目錄;
3. 複製貼上android-ndk-r12b\build\core\toolchains 目錄(生成副本),然後重新命名為 arm-linux-androideabi-clang-ollvm4.0,修改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/
編寫.so程式碼:
#include "Test.h" #include <jni.h> #include <stdio.h> #include <stdlib.h> #include <time.h> void native_attachBaseContext(JNIEnv *env, jobject thiz, jobject ctx) { srand(time(NULL)); int i; for (i = 0; i < 10; i++) { printf("%d, ", rand()%11); } }
混淆前使用IDA檢視到的so檔案流程圖以及虛擬碼:
加入混淆引數後...
Android.mk檔案加上混淆引數: LOCAL_CFLAGS += -mllvm -fla -mllvm -sub -mllvm -bcf Application.mk檔案指定TOOLCHAIN NDK_TOOLCHAIN_VERSION := clang-ollvm4.0
混淆後使用IDA檢視到的程圖以及虛擬碼:
可以看到,混淆後的效果非常明顯,說明我們在Windows上編譯OLLVM是成功的。
參考連結:
https://bbs.pediy.com/thread-247231.htm