ollvm编译笔记

转载:https://blog.youkuaiyun.com/u011337769/article/details/86659566

1.下载llvm4.0

2.安装ndk,版本信息为 

添加环境变量 

export NDK_HOME=/opt/android/ndk/android-ndk-r10b

export PATH=$NDK_HOME:$PATH

 3.准备编译ollvm的环境

安装编译工具

apt-get install cmake

apt-get install g++

 

编译ollvm源码

git clone -b obfuscator-llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git

mkdir build

cd build

cmake -DCMAKE_BUILD_TYPE:String=Release ../

make -j7

在build目录下会生成编译后的程序,我们只会用到bin和lib目录下的文件

 

 执行cmake时报错

 

 修改为以下命令再尝试编译可顺利通过

cmake  -DCMAKE_BUILD_TYPE=Release  -DLLVM_INCLUDE_TESTS=OFF  ../

 

然后执行make  –j7,编译报错,可能是虚拟机配置低了,库与库之间存在依赖导致报错,将配置改为4核4G内存,再次make 不加-j参数,编译通过, 

 

 

4.将编译好的工具链整合到NDK中

将ndk中的toolchains下的llvm/prebuilt复制到toolchains/o-llvm-4.0中

 

 将编译好的ollvm4.0的bin和lib复制替换到ndk/toolchains/ollvm-4.0/下的bin和lib

 

 

 在android-ndk-r14b/build/core/toolchains目录下,新建目录 arm-linux-androideabi-clang-ollvm4.0,拷贝目录 arm-linux-androideabi-clang 下的文件 config.mk 与 setup.mk 到 arm-linux-androideabi-clang-ollvm4.0 中,修改setup.mk文件。

 

 

 

#change before

#LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,llvm)

#LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/

#change after

OLLVM_NAME := ollvm-4.0

LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,$(OLLVM_NAME))

LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/

 使用 ollvm 进行 ndk 的编译需要对 Application.mk 和 Android.mk 文件做相应的修改。Android.mk 中添加混淆编译参数:

 

LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla

 Application.mk 中配置 NDK_TOOLCHAIN_VERSION

 

APP_ABI := x86 armeabi-v7a x86_64 arm64-v8a armeabi mips64

  NDK_TOOLCHAIN_VERSION := clang-ollvm-4.0

 

5.使用ollvm生成混淆过的程序

命令介绍

-mllvm -fla 开启控制流平坦化

-mllvm -sub 开启指令替换

-mllvm -bcf 开启虚假控制流

-mllvm -sobf 开启字符串混淆

-mllvm -seed=0xdeadbeaf 指定随机数种子生成器

bcf可以配合下面参数使用

-mllvm -bcf_loop=3 设置函数混淆次数为3次 不加此选项默认为1次

-mllvm -bcf_prob=40 设置代码块被混淆的概率是40%,默认30%

 创建工程目录 此处为test,创建子目录jni,在jni目录下创建Android.mk并根据需求编写mk文件

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := test

LOCAL_SRC_FILES := test.c

LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla

LOCAL_ARM_MODE := arm

include $(BUILD_EXECUTABLE)

在jni目录下创建Application.mk并根据需求编写mk文件 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

APP_PLATFORM :=android-14

APP_ABI := armeabi-v7a

NDK_TOOLCHAIN_VERSION := clang-ollvm-4.0

include $(BUILD_EXECUTABLE)

 在jni目录下创建代码文件hello.c

 

#include <stdio.h>

int main(int argc, char** argv)

{

         int a=1;

         int b=0;

         if(a>b)

         {

                   printf("a:%d\n",a);

         }

         else{

                   printf("b:%d\n",b);

         }

         return 0;          

}

 在工程目录下执行ndk-build命令

 

 混淆后的效果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值