Obfuscator-LLVM是這樣一個旨在提供開源的針對LLVM的代碼混淆工具的項目,以增加對逆向工程的難度。
本文將介紹在Mac上搭建Android NDK ollvm環境過程。
一、macOS配置ollvm環境
參考obfuscator官網:https://github.com/obfuscator-llvm/obfuscator/wiki。
不過官方版本很久沒更新過了,所以這里采用了一個移植的版本,大神在原版的基礎上,做了一些功能上的增強和擴展。
1、下載LLVM
直接下載整理好的移植版本,我選則了llvm-8.0的版本。
https://github.com/heroims/obfuscator/tree/llvm-8.0
注意,LLVM支持Windows/iOS/Mac/Linux/Android等全平臺,OLLVM同理。只要你的工程使用LLVM-Clang進行編譯,自然可以用OLLVM做混淆。如果只支持GCC編譯則需要做調整
2、編譯
解壓縮zip后,進入目錄新建一個build目錄,然后按照下面的命令編譯(耐心等待,這一過程會很長)。
mkdir build
cd build
#如果不想跑測試用例加上-DLLVM_INCLUDE_TESTS=OFF
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CREATE_XCODE_TOOLCHAIN=ON ../obfuscator/
make -j7
3、mac上直接使用
原版ollvm中提供了3種混淆方式,分別是:
-mllvm -fla:控制流扁平化
-mllvm -sub:指令替換
-mllvm -bcf:虛假控制流程
大神移植的時候又擴展了一個字符串混淆方式,-mllvm -sobf
字符串加密,可以豐富我們的使用場景。
直接使用編譯的二進制文件
build/bin/clang test.c -o test -mllvm -sub -mllvm -fla -mllvm -bcf
也可以重新編譯
/build/bin/clang -shared -fPIC you.c you2.c -o libxxx.so -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf
二、整合到Android NDK中
在本人項目中,使用了NDK 18.1.5063045 版本。
這里沒有采用網上新建ollvm文件夾的做法,而是直接替換了其中的文件。
找到Android SDK目錄中的 ../ndk-bundle/toolchains/llvm 文件夾,先備份下llvm文件夾,可以在不小心搞壞了后及時恢復。然后將obfuscator編譯好的 build/bin 和 build/lib 這2個文件夾直接拷貝到../llvm/prebuilt/darwin-x86_64/文件夾下,直接覆蓋替換。
三、Android NKD使用ollvm
項目中編譯so庫已經集成cmake,所以不需要去修改config.mk 與 setup.mk也是正常的,這里只介紹了cmake的方式。
在CMakeLists.txt中修改如下,添加-mllvm參數。
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf" )
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -mllvm -sub -mllvm -sobf -mllvm -fla -mllvm -bcf" )
完成后,運行下Make Project就得到ollvm后的so庫了。
最后我們看下效果,混淆前:程序的流程非常清晰明了。
混淆后:流程加入了大量干擾的模塊,并且字符串也是加密的,極大的提高了靜態分析的難度。