使用OLLVM对Android NDK混淆完整流程

最近在研究Android Ndk加固的技术,涉及到大名鼎鼎的OLLVM,虽说不是什么新技术,确切说使用已经晚了很多年,但是目前不得不说它还是比较优秀的混淆方案,但是在使用过程中所经历的坑确实不少,折腾了3天时间才算弄懂,其中参考了很多大神的帖子,然后将所有的步骤以及过程详细的整合性的记录下来,仅供大家参考,如有错误请指正。

一、安装环境以及所需物料

       Windows 7(如果能在Ubuntu下最好,因为Windows需要配置的环境太多)

      android-ndk-r10e-windows-x86_64(强烈建议使用10e的版本,为什么必须使用这个,稍后会说)

      cmake-3.20.0-rc3-windows-x86_64

      mingw64

      obfuscator-llvm-4.0https://github.com/obfuscator-llvm/obfuscator)自行下载

      已上工具包已经上传,确定是可以编译成功的:https://download.csdn.net/download/linglinggg/15743100

二、开始编译ollvm

下载好ollvm4.0之后,开始准备编译工作,编译之前先确保一下工作已经完成:

1、成功安装cmake并且配置好环境变量

2、成功安装好mingw64并且配置好环境变量

3、ndk已经配置好环境变量

如果确保已上几项工作已经完成,接下来开始编译

cd ollvm4.0 #打开源码
mkdir build #创建build目录
cd build    #打开build
cmake.exe -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..  #开始编译

注意:如果build目录在源码目录下,则CMake最后的参数为 ..,即cmake.exe -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..,否则请根据自己的实际情况修改

接下来就开始进入编译过程,编译完成后会出现如下界面:

然后再次执行:mingw32-make -j16(注意,-j16表示开启的线程数,如果你的电脑多核,可以根据实际CPU数量,修改后面的参数,一般是 CPU数量的2倍即可,如果太大就会卡死,异常退出,所以最好不好太大,我电脑执行的是mingw32-make -j4)

编译需要大概30分钟左右...........

30分钟后编译成功,出现如下界面

三、集成NDK

1、打开android-ndk-r10e->toolchains:

(1)找到arm-linux-androideabi-clang3.5,然后拷贝一份重命名为arm-linux-androideabi-clang3.4-obfuscator

(2)打开刚刚复制的文件夹“arm-linux-androideabi-clang3.4-obfuscator”,找到setup.mk开始进行修改,只修改圈起来的部分,抹去的部分为刚刚编译好的ollvm目录,配置好自己的路径后保存即可

修改的作用是为了在接下来的编译中使用我们刚刚编译好的ollvm下的clang

完成上述步骤后,基本就算完成了,接下来就是进入使用阶段,创建jni目录,并编写对应的代码,并且创建配置文件,主要配置文件有以下两个:

Android.mk 关于该文件的编写格式参见:https://blog.csdn.net/niuba123456/article/details/80948186

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_LDLIBS := -lm -llog 
LOCAL_SRC_FILES := hello.c   #自己的.c文件
LOCAL_CFLAGS := -mllvm -sub -mllvm -bcf -mllvm -bcf_loop=3  -mllvm -bcf_prob=40 -mllvm -fla -mllvm -split_num=10

include $(BUILD_SHARED_LIBRARY)

关于上述代码中LOCAL_CFLAGS后面的参数,解释如下:

平流展开-fla

-mllvm -fla:激活控制流扁平化
-mllvm -split:激活基本块分割。在一起使用时改善展平。
-mllvm -split_num=3:如果激活了传递,则在每个基本块上应用3次。默认值:1

指令替换-sub

-mllvm -sub:激活指令替换
-mllvm -sub_loop=3:如果激活了传递,则在函数上应用3次。默认值:1。

虚假控制-bcf

-mllvm -bcf:激活虚假控制流程
-mllvm -bcf_loop=3:如果激活了传递,则在函数上应用3次。默认值:1
-mllvm -bcf_prob=40:如果激活了传递,基本块将以40%的概率进行模糊处理。默认值:30

 

Application.mk

Application.mk


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
APP_ABI := armeabi-v7a
NDK_TOOLCHAIN_VERSION :=  clang3.4-obfuscator  #指定成自己刚刚修改好的编译器
APP_PLATFORM=android-14
include $(BUILD_EXECUTABLE)

然后开始进入到项目文件下进行编译

cd jni
ndk-build

如果一切ok,会出现如下结果,表示已经编译完成,可以打开IDA反编译.so看看是否已经混淆完成

至此完成!

扩展:如果需要进行字符串的混淆,请参考https://www.anquanke.com/post/id/86384

踩坑:刚开始使用ndk-r10b版本,最后编译c文件一直出现如下错误

查了好半天发现是ndk版本问题,然后根据大神的帖子提示(https://blog.csdn.net/u014476720/article/details/85232108),准备更换ndk-10b版本为10版本,打开google后,果断发现了如下提示:

这个问题确实存在于10e以前的版本中,在10e之后已经不存在了。

参考链接:

https://www.jianshu.com/p/4a43ca8a9b13

https://blog.csdn.net/hzhdy/article/details/94737931

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值