Hi大家好,前阵子和MT的作者一起搞了个东西——Java层代码混淆方案。
目前的加固主要是在so层做研究,针对Java层代码的保护非常少。
虽然加固会隐藏dex,但是可以很容易地把它脱出来,脱出来的dex除了一部分方法被Native化了,其它代码都完全暴露在外。
另外加固也会影响APP的性能和兼容性,比如一些壳会废掉了安卓原生的oat执行模式,导致性能下降。
考虑到目前加固存在的一些缺点,我们决定做一套针对Java层的高强度代码混淆方案。目前已经实现了这几个功能:
名称混淆:使用特殊符号对类名、方法名、字段名混淆,使用支持四大组件和View。
常量加密:对字符串和资源ID进行加密
资源混淆:比开源的那个混淆得更彻底
控制流混淆:控制流平坦化和控制流伪造
功能上其实已经实现了ollvm的-fla、-bcf、-sobf,不过-sub指令替换没有做,但做起来倒也不难。
实现原理主要是通过dexlib2进行代码修改,控制扁平化稍微复杂点,通过dex2ir2dex实现。
使用我们的方案进行混淆不需要源代码,输入apk,混淆完输出apk,可以一键完成,只对哪些代码进行混淆也是完全可以控制的。
目前该方案已经在MT管理器上投入使用了几个月,兼容性和稳定性基本没有问题。
之前 一直没放出来 直到朋友用 说效果还不错 寻思放出来 看看
混淆效果如下图 (jadx1.0版本)
IDA效果图
混淆前的控制流程图
混淆后的控制流程图
先说一下优点:
1,保证了 安卓原有的特性 ,支持 Oat,Jit包括 动态编译等 ,原来的壳子 大多数都是基于解释执行的 废掉了 安卓原生的 oat执行模式 (二进制执行模式) 速度会慢很多 这也是各个大厂不喜欢用加固的主要原因
2,Google 对 android 虚拟机的限制越来越严,可能针对java语言本身的混淆,会重视起来
3,可以配合一些特殊字符串 让App 混淆难度提升 ,就算你得到Dex 分析也很困难
4,支持Xposed模块等 加固 因为不需要 初始化Application等
缺点:
1,Dex 的 大小会变大 , 混淆强度可控 用户自行决定 混淆强度
如果有感兴趣的话 也可以私聊我一下
附件是一个加密以后的样本 hook 加密算法的 Xp模块