*************************************************************************

记上一次对JNI接口函数的混淆有一段时间了,没看的网友可以看这里:点击打开链接;

今天我们分析最近在移动端比较火的源码级别的编译混淆OLLVM,除了各大论坛的压轴题用到了此技术,包括各移动加固厂商也相继用到了此技术,说明此技术的重要性,下面开搞。。

原理篇:

这里我们需要明白几个重要问题:

1.LLVM是什么?

2.OLLVM又是什么?

3.为什么这个可以用到Android的编译上?

对于第一个问题:

:LLVM是一个编译器框架,由于设计上的众多优点,被很多编译器所采用,比如知名的Clang,现在最大的支持方为苹果公司,至于它具体的优点,设计等等,网上很多,总之很牛掰。

对于第二个问题:

:LLVM-Obfuscator 是瑞士西北应用科技大学安全实验室针对LLVM编译组件开发的代

码混淆工具,该工具完全开源,目的是为了增加逆向工程的难度,保证代码的安全性。

我们可以把这个OLLVM这个结合到ndk中使我们产生编译产生混淆代码,后面会细讲。

对于第三个问题:

:对于android4.4以后引入ART机制,增加了llvm编译器的分量,我们来看一下这个图:

android view 混淆 android混淆打包so_混淆

实现篇:

环境:Ubuntu 14.04   64bit

步骤:

第一步:

先将ndkllvm.tar(附件会给出)解压到 /opt 目录中 命令如下
$ sudo tar -xv -f ndkllvm.tar -C /opt

第二步:

配置环境变量
$ vim ~/.profile //在文件末尾添加 
export LLVM=/opt/Android-ndk-r10b

如图:

android view 混淆 android混淆打包so_混淆_02

第三步:
加载环境变量
$ source ~/.profile

第四步:

然后可进入 llvm_project/hello 目录 通过
$ $LLVM/ndk-build // 进行编译项目了

注意:

这个可能会遇到点小问题,由于时间比较早了我记不太清了,好像是缺少一部分32位的库,百度一发网上有解决办法。

这里我们拿我之前写的一个反调试工程,进行操作,以便看的刚清楚,源码会放到后面。

我们在编译前:

注意:

第一:把对应的xxx.c或者xxx.cpp文件放在llvm_project/hello/jni目录下面;

第二:编写正确的与之对应的Android.mk文件(如果用Android studio要注意);

如图所示:

android view 混淆 android混淆打包so_android view 混淆_03

最后在AK下面重编译打包,OK,运行结果是:

android view 混淆 android混淆打包so_android view 混淆_04


混淆的效果:

使得IDA的空格键失效显示不了控制流图,这个不知道为什么会这样?以前混淆过后的控制流图变的异常的复杂。

在后面我会总结针对这两种较为流行混淆的反混淆以及逆向破解方法。

总结篇:

环境搭建的核心步骤:

第一步:
先将  ndkllvm.tar 解压到 /opt 目录中 命令如下
$ sudo tar -xv -f ndkllvm.tar -C /opt
第二步:
然后 配置环境变量
$ vim ~/.profile  //在文件末尾添加 
export LLVM=/opt/Android-ndk-r10b
第三步:
加载环境变量
$ source ~/.profile
第四步:
然后可进入 llvm_project/hello 目录 通过
$ $LLVM/ndk-build   

注意的问题:

第一:补充32位的依赖库;

第二:把对应的xxx.c或者xxx.cpp文件放在llvm_project/hello/jni目录下面;

第三:编写正确的与之对应的Android.mk文件(如果用Android studio要注意);