对代码进行混淆能够增加反逆向的难度,即使被反逆向,也让破译者难以阅读源码,类似的Java中有proguard混淆工具,对于C/C++编译的代码也有混淆工具,比如OLLVM(它是基于LLVM,LLVM可以简单的理解成编译C/C++源码的编译器,而OLLVM就是基于LLVM的用于对编译之后的C/C++源码进行代码混淆的开源库)、Hikari(基于OLLVM,但是比OLLVM更加稳定,bug少,会了OLLVM,基本上也就会Hikari)。在多说一句,不要认为将一些密钥编译成so库就会很安全,不信可以拿IDA工具对so库进行反编译,大致的逻辑还是清晰可见。我个人觉得使用Hikari或者OLLVM我认为的难点在于编译,因为我们最终将其与NDK进行结合时,仅仅是用到其编译后的文件(不过在Hikari使用过程中,可能需要到Hikari中寻找缺失的头文件)。
1、环境准备
Hikari的作者暂时不支持在Windows环境编译Hikari,因此我们需要准备mac或者linux系统。下面是进行时使用的环境:
虚拟机(VMware workstation)、
ubuntu-18.04.3 镜像下载地址:
https://mirrors.tuna.tsinghua.edu.cn/
andkroid_ndk_r19c 下载地址:
https://developer.android.google.cn/ndk/downloads/index.html
环境目前大概就需要这些,下面开始。
2、安装Hikari需要的软件
在ubuntu安装软件时,可能会遇到特别慢的情况,建议更换一下ubuntu软件源地址,参考文章:
https://blog.csdn.net/shanpenghui/article/details/80433555
以下都是在命令行终端进行操作
1>首先安装cmake:
输入命令: sudo apt-get install cmake
安装成功后检查是否安装成功:”cmake --version”出现版本号则表示安装成功
2>安装g++
输入命令: sudoapt-get install g++
检查是否安装成功: g++ --version
3>安装python
输入命令: sudoapt-get install python python-dev -y
检查是否安装成功:python –version
4>安装ninja
输入命令: sudo apt-get install cmakeninja-build -y
检查是否安装成功:ninja –version
5>安装libxml2
输入命令: sudo apt-get install libxml2-devlibncurses5-dev swig libedit-dev doxygen -y
上面需要注意的是“libxml2“中的倒数第二个是字母”L“,不是数字1.
3、接下来就是克隆Hikari开源库
1>github地址:https://github.com/HikariObfuscator/Hikari.git
克隆命令:
git clone --recursive -b release_80 https://github.com/HikariObfuscator/Hikari.git Hikari
这里可能会遇到很慢很慢的情况,大家可以更换成以下命令(瞬间清爽):
git clone --recursive -b release_80 https://gitee.com/chenzimo/Hikari.git Hikari
到这里我们已经把Hikari开源库给克隆下来了,接下来都是一系列的命令
1> 进入Hikari目录: cd Hikari
2> 同步一下Hikari中使用到的第三方库: git submodule update --remote --recursive
3> 同步成功后返回上一级目录:cd ../
4> 在Hikari同级目录下创建build目录: mkdir build
5> 进入创建的build目录: cd build
6> 输入编译命令: cmake -G"Ninja" -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_APPEND_VC_REV=on ../Hikari 上述命令中最后跟的是你克隆下来的Hikari目录的路径
7> 输入ninja,这一步进行正真的编译,我大概编译了3个小时: ninja
到这里我们编译好的Hikari文件在刚刚创建的build目录中,等会我们需要用到build目录中的bin目录。
4、将NDK和Hikari结合
我使用的nkd版本: andkroid_ndk_r19c 进行解压并且将Android studio使用的ndk版本指定为上述版本。
重点来了,进入解压好的andkroid_ndk_r19c/ toolchains/llvm/prebuilt/linux-x86_64目录,将我们之前编译好的Hikari目录(也就是前面的build目录)下的bin目录拷贝出来,去替换掉andkroid_ndk_r19c/toolchains/llvm/prebuilt/linux-x86_64/下的bin文件,恭喜你你已经成功的将环境搭建好了,接下来就是利用Android Studio创建一个包含C/C++的Android项目,直接进行编译、安装之类的操作。但是这里可能会遇到头文件找不到的情况,不要慌,我们可以在克隆下的Hikari库中找到这些头文件(Hikari/tools/clang/lib/Headers/),找到头文件之后把它复制到如下目录:android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/
好了,接下来只需要在相应的模块下的build.gradle文件配置混淆指令(包括指令混淆、控制流混淆之类的,具体google).