如何在Windows下成功编译OLLVM
前言:
转眼又是一年,作者前段时间一直在研究Android加固方面的东西,刚好研究到了利用ollvm做so文件混淆。在网上查询的资料大部分都讲的是Linux下进行编译,少有的文章讲到Windows下编译,自己实验起来也是编译失败的,应该是自己的环境搭建有问题,但是又查不到相关资料(没办法,水平有限 😭),在一次偶然的机会看到一篇相关文章。里面有用到使用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