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库了。
最后我们看下效果,混淆前:程序的流程非常清晰明了。
混淆后:流程加入了大量干扰的模块,并且字符串也是加密的,极大的提高了静态分析的难度。