ollvm 地址
GitHub - obfuscator-llvm/obfuscator
本文是针对win32环境搭建教程
一 。需要工具
1 mingw-w64.exe 基于windows的GNU gcc编译器
2 cmake.msi 针对不同编译器生成源代码构建文件
3 ndk版本 android-ndk-r10e
所需工具参见文章最后百度网盘链接
二。开始编译
如果下载完毕,解压 你会得到一下目录
顺序执行一下命令
::编译
mkdir build
cd build
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ../
mingw32-make -j7
以下是编译截图
编译结束后 在build -》bin 目录下 会生成一下exe
三。开始配置ndk
1 到ndk 目录 android-ndk-r10e\toolchains
2 新建 arm-linux-androideabi-clang-ollvm4.0 和 ollvm4.0目录
3 复制 ndk 原来 llvm-3.6 目录下的所有文件到 ollvm4.0
3.1 复制 上面编译好build-》bin 和lib 到 android-ndk-r10e\toolchains\ollvm4.0\prebuilt\windows-x86_64 目录
复制之前最好清空android-ndk-r10e\toolchains\ollvm4.0\prebuilt\windows-x86_64\目录下的bin和lib全部文件
3.2 复制 arm-linux-androideabi-clang3.6 目录下所有文件到 arm-linux-androideabi-clang-ollvm4.0
4 修改 arm-linux-androideabi-clang-ollvm4.0 -》setup.mk
参照修改配置
LLVM_NAME := ollvm-4.0
LLVM_TOOLCHAIN_ROOT := $(NDK_ROOT)/toolchains/$(LLVM_NAME)
LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call host-prebuilt-tag,$(LLVM_TOOLCHAIN_ROOT))
LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/
TOOLCHAIN_VERSION := 4.8
TOOLCHAIN_NAME := arm-linux-androideabi-$(TOOLCHAIN_VERSION)
TOOLCHAIN_ROOT := $(NDK_ROOT)/toolchains/$(TOOLCHAIN_NAME)
TOOLCHAIN_PREBUILT_ROOT := $(call host-prebuilt-tag,$(TOOLCHAIN_ROOT))
TOOLCHAIN_PREFIX := $(TOOLCHAIN_PREBUILT_ROOT)/bin/arm-linux-androideabi-
LLVM_TOOLCHAIN_PATH := $(NDK_ROOT)/toolchains/ollvm4.0/prebuilt/windows-x86_64/bin/
TARGET_CC := $(LLVM_TOOLCHAIN_PATH)clang$(HOST_EXEEXT)
TARGET_CXX := $(LLVM_TOOLCHAIN_PATH)clang++$(HOST_EXEEXT)
通过以上操作 ollvm 环境就搭建好了 接下来就是 可以开始撸ollvm 了
四。开始使用
ollvm 混淆模式支持以下四模式
.-mllvm -fla:控制流扁平化
. -mllvm -sub:指令替换
. -mllvm -bcf:虚假控制流程
. -mllvm -sobf: 字符串加密
如果你在c++ 层 有aes xxrea 等加密 可以开启 -sobf
Android.mk 配置
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS :=-llog
LOCAL_MODULE := test
LOCAL_SRC_FILES := Test.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)
#开启三种混淆方式 -mllvm -sobf 字符串模糊处理 -mllvm -sub指令替换 -mllvm -bcf 虚假控制 -mllvm -fla 平坦控制流
#APP_CPPFLAGS += -mllvm -fla -mllvm -sobf -mllvm -sub -mllvm -sobf
LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla -mllvm -sobf
#APP_ABI := x86 armeabi-v7a
include $(BUILD_SHARED_LIBRARY)
#$(call import-module,mmp)
测试 cpp
// Created by Administrator on 2017/1/13.
//
#include "Test.h"
#include <string.h>
#include <stdio.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/inotify.h>
#include <unistd.h>
#include "Sgin.h"
#include <android/log.h>
#define LOG_TAG "test"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
void enstr(char * Text)
{
//printf("in enstr");
char cryptograph[128]={'\0'};
int count=strlen(Text);
for(int i = 0; i < count; i++)
{
cryptograph[i]=Text[i]+i+5;
}
printf("加密后:%s\n",cryptograph);
}
void dnstr(char * Text)
{
printf("in dnstr");
char cryptograph[128]={'\0'};
int count=strlen(Text);
for(int i = 0; i < count; i++)
{
cryptograph[i]=Text[i]-i-5;
}
printf("解密后:%s\n",cryptograph);
}
jint JNI_OnLoad(JavaVM* vm, void* reserved){
LOGD("in Jni_OnLoad ");
//anit_debug2(); #反调试
char Text[128]={'a','b','c','d'};
enstr(Text);
JNIEnv* env;
if ( vm->GetEnv( reinterpret_cast<void**>(&env), JNI_VERSION_1_6 ) != JNI_OK )
{
return -1;
}
//sub_0329(env);
return JNI_VERSION_1_6;
}
下面是开启ollvm 和 没有混淆代码对比
可以很明显的看到右边void enstr(char * Text) 函数多了很多分支
cfg对比
链接:https://pan.baidu.com/s/1viG0rZNlLBRgnifKXdavrg
提取码:oip3