Mac搭建Android NDK ollvm环境

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/binbuild/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库了。

最后我们看下效果,混淆前:程序的流程非常清晰明了。

混淆后:流程加入了大量干扰的模块,并且字符串也是加密的,极大的提高了静态分析的难度。

你可能感兴趣的:(Mac搭建Android NDK ollvm环境)