前言
经过上篇文章mac ollvm环境编译已经把ollvm编译好了,现在将ollvm集成到ndk中。
这里的ollvm是说的goron:https://github.com/amimo/goron
步骤
将ollvm中的clang
, clang++
, clang-format
三个文件复制到ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin
中,使用替换
方式。
这里看一下ollvm
编译完的结构:
复制到ndk那边目录结构:
测试
创建工程
随便创建一个ndk项目,就像这样。
配置NDK
在app\build.gradle
中增加下面配置:
android {
// ......
// 声明使用NDK的版本
ndkVersion "21.1.6352462"
// ......
}
编译APK
出现下面错误
/sysroot/usr/include/jni.h:27:10: fatal error: 'stdarg.h' file not found
复制头文件
上面的提示缺少stdarg.h
文件,此文件在ollvm编译
的文件夹lib/clang/9.0.0/include/
中可以找到,然后复制到/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include
的目录下。
以此类推的复制头文件,我这里一共复制了下面这些文件:
stdarg.h
stddef.h
__stddef_max_align_t.h
float.h
构建成功
开启混淆
上面的构建是一个常规的c++项目,并没有开启ollvm的混淆,把混淆开启一下,goron支持的配置如下:
说明 | 配置 |
---|---|
间接跳转 | -mllvm -irobf-indbr |
间接函数调用 | -mllvm -irobf-icall |
间接全局变量引用 | -mllvm -irobf-indgv |
字符串(c string)加密功能 | -mllvm -irobf-cse |
过程相关控制流平坦混淆 | -mllvm -irobf-cff |
externalNativeBuild {
cmake {
cppFlags "-mllvm -irobf-indbr -mllvm -irobf-icall -mllvm -irobf-indgv -mllvm -irobf-cse"
}
}
对比
因为mac上没有安装ida,我用Windows截图对比了一下:
源码
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_sollyu_android_ollvmsimple_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
未混淆
开混淆
下载
知道你们懒,这是我编译好的goron,直接替换到你们的ndk就可以了,下载去吧:腾讯云
考虑时间的流逝,替换的时请注意您的ndk里的llvm的版本,我当前的版本:21.1.6352462