如何在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

 

posted @ 2019-01-18 16:16  jKing777  阅读(1887)  评论(1编辑  收藏  举报