Ollvm,是C/C++的跨平臺混淆方式泪喊,它提供了指令平坦化的能力棕硫,可以吧邏輯變得相當(dāng)復(fù)雜從而阻止逆向工程。網(wǎng)上有很多關(guān)于在Android平臺使用ollvm的方法袒啼,而Windows/iOS/Mac/Linux上則很少介紹哈扮,下面對于其他系統(tǒng)簡略介紹操作方法,重點介紹Mac/iOS APP的混淆方法
- 指令替換 -mllvm -sub
- 控制流偽造 -mllvm -bcf
- 控制流平坦化 -mllvm -fla
默認(rèn)會變換所有函數(shù)蚓再,加密單個函數(shù):
int foo() __attribute((__annotate__(("fla"))));
int foo() {
return 2;
}
獲得OLLVM
目前有以下版本在git上放出:
(1) 作者放出的原版OLLVM
包括llvm-3.3, llvm-3.4, llvm-3.5, llvm-3.6.1這幾個版本灶泵,下載編譯:
$ git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
$ make
(2) 上海交大改版OLLVM
增加了字符串編譯時混淆-mllvm -sobf,對應(yīng)llvm4.0版本对途,下載編譯:
$ git clone https://github.com/GoSSIP-SJTU/Armariris.git
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
$ make
(3) 第三方改版OLLVM
好事者在上海交大的基礎(chǔ)上赦邻,增加了llvm5.0 llvm6.0版本,下載編譯方式同上
ollvm6.0 https://github.com/Qrilee/Obfuscator-LLVM.git
ollvm5.0 https://github.com/Qrilee/llvm-obfuscator.git
編譯OLLVM
注意实檀,LLVM支持Windows/iOS/Mac/Linux/Android等全平臺惶洲,OLLVM同理。只要你的工程使用LLVM-Clang進(jìn)行編譯膳犹,自然可以用OLLVM做混淆恬吕。如果只支持GCC編譯則需要做調(diào)整
上述編譯方式是普通編譯,在編譯后得到可執(zhí)行文件Clang就是用作混淆的须床,用它來替換編譯使用的clang程序即可铐料,clang路徑可以從編譯時命令行參數(shù)得到。如果使用make/cmake的工程豺旬,可以通過設(shè)置某些選項設(shè)置clang編譯器钠惩。然后通過暴力替換clang達(dá)到同樣的效果
直接編譯
path_to_the/build/bin/clang test.c -o test -mllvm -submake/cmake編譯
CC=path_to_the/build/bin/clang
CFLAGS+="-mllvm -fla" 或 CXXFLAGS+="-mllvm -fla"
./configure
make
android ndk使用ollvm
首先要設(shè)置編譯器為clang
- ndk-build方式,修改android.mk
NDK_TOOLCHAIN_VERSION := clang
- ndk-build方式,修改android.mk
- cmake方式族阅,修改build.gradle
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
arguments '-DANDROID_PLATFORM=android-9',
'-DANDROID_TOOLCHAIN=clang'
// explicitly build libs
targets 'gmath', 'gperf'
}
}
}
...
}
cmake下替換clang程序篓跛,在CMakeLists.txt中修改 set(LOCAL_CFLAGS " -mllvm -fla")
ndkbuild下替換clang程序,在Android.mk中加入?yún)?shù)LOCAL_CFLAGS := -mllvm -fla
visual studio使用ollvm
編譯ollvm的時候坦刀,使用cmake-gui選擇visual studio2015或者命令行選擇cmake -G "Visual Studio 14 2015" -DCMAKE_BUILD_TYPE=Release ../obfuscator/
然后cmake會產(chǎn)生一個visual studio工程愧沟,用vs編譯即可!
至于將Visual Studio的默認(rèn)編譯器換成clang編譯鲤遥,參考https://www.ishani.org/projects/ClangVSX/
Visual Studio2015起官方開始支持Clang沐寺,具體做法:
新建項目->已安裝->Visual C++->跨平臺->安裝Clang with Microsoft CodeGen
Clang是一個完全不同的命令行工具鏈,這時候可以在工程配置中盖奈,平臺工具集選項里找到Clang混坞,然后使用ollvm的clang替換該clang即可
xcode編譯(用于編譯OSX/iOS app)
編譯方式比較特殊,由于xcode本身比較特殊卜朗,需要編譯一套工具鏈給xcode
cmake -G Ninja -DLLVM_CREATE_XCODE_TOOLCHAIN=On -DCMAKE_INSTALL_PREFIX=$PWD/install
ninja install-xcode-toolchain
最后得到一個后綴含toolchain的大文件(如LLVM6.0.0.git.xctoolchain)拔第,大概8G咕村,將文件mv到/Application/Xcode.app/Contents/Developer/Toolchains/下场钉。重啟Xcode將會在菜單->Xcode出現(xiàn)Toolchains菜單項蚊俺。選擇里面的llvm即可切換到新的工具鏈。如果直接編譯逛万,會產(chǎn)生error:cannot specify -o when generating multiple output files
錯誤泳猬,這時候通過逐步排查可以得知將Build Settings->Build Options->Enable Index-While-Building Functionality
設(shè)置為No即可成功編譯