OLLVM移植到NDK

一、前言

一开始是直接将ollvm4源码编译后移植到ndk上,按照跟着铁头干混淆2 ubuntu20.04编译ollvm - 简书 (jianshu.com)上的步骤走,结果仍然报错:

1
Android Studio fatal error: 'stdarg.h' file not found

而且如果直接将OLLVM的bin,lib,include目录覆盖到NDK中的对应的目录,居然会出现jni.h、string库识别不出来的错误(可是它可以在NDK目录中搜索出来):

1
Android Studio fatal error: 'string' file not found

之后看了Whitebird的博客,猜测可能是版本不匹配的问题。

所以有必要提醒各位,本文章中所涉及到的NDK是Android Studio自带的,以及LLVM是抑制了OLLVM的,且NDK版本和LLVM版本一致,均为14.0.6。

二、移植

2.1 OLLVM移植到LLVM14.x

OLLVM移植到LLVM14.x参考https://gal2xy.github.io/2024/04/17/LLVM%20and%20OLLVM/OLLVM%E7%A7%BB%E6%A4%8D%E5%88%B0LLVM14/

2.2 目录复制

  1. 将2.1步骤中编译出的LLVM中的bin、lib、include目录复制到NDK的toolchains/llvm/prebuilt/linux-86_64/目录下,进行覆盖。

  2. 在NDK目录下,将toolchains/llvm/prebuilt/linux-86_64/lib64目录下的clang文件夹复制到toolchains/llvm/prebuilt/linux-86_64/lib目录下,进行覆盖。

    没有操作此步骤会报如下错误:

    查询发现根本就没有这个目录。

三、项目混淆配置与测试

3.1 项目混淆配置

想要对项目中的.c/.cpp代码进行混淆,需要在cpp目录下的CMakeLists.txt中添加混淆配置,例如:

1
2
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mllvm -bcf -mllvm -bcf_loop=3 -mllvm -fla -mllvm -split -mllvm -split_num=3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -bcf -mllvm -bcf_loop=3 -mllvm -fla -mllvm -split -mllvm -split_num=3")

3.2 测试

测试代码:

分析apk中的so文件,该函数对应控制流图如下:

可见是非常的成功!


参考:

从LLVM到OLLVM学习笔记 | Whitebird’s Home (whitebird0.github.io)


OLLVM移植到NDK
http://example.com/2024/04/17/LLVM and OLLVM/OLLVM移植到NDK/
作者
gla2xy
发布于
2024年4月17日
许可协议