前言
现在市面上对APP的安全合规管控越来越严格了,也就要求了APP在上架之前一定要做合规检测和加固处理。对APP就是加固的好处,可以提高APP的安全性,提高APP被逆向分析破解的门槛,同时通过加固保护可以提高过安全合规的检测。
由于APP加固技术不断被攻破情况,因此加固技术也是不断在快速迭代的过程。现在市面上的加固产品的还是比较多的,并且各个加固技术产品都有其各自优缺点,但是加固产品的所采用技术去有很多共性的地方。下面就对加固和脱壳对抗方案做些梳理总结。
Android 反编译的威胁
- 逆向分析: 漏洞挖掘、协议分析
- 二次打包: 盗版、破解、广告
保护方案
- 代码混淆:Java代码、CC++带马甲、JSHTML代码
- 应用加固:DEX文件、SO文件、资源文件
APP构建过程中用到的工具

编译流程
- java源码编译:通过javac将源码编译为.class文件
- 多dex分包:脚本将类根据一定规则划分到主dex和从dex中,生成配置文件
- proguard优化/混淆:对.class文件进行压缩、优化、混淆处理
- 转化为dex文件:dxd8将.class文件转换为dex文件
DEX加固方案的演进

- 动态加载:从服务器动态加载业务的DEX
- DEX内存加载:模拟App启动的时候,将我们的壳、将业务DEX文件加载到内存中,然后通过一些处理方式,让DEX文件把Application启动起来,让应用认为和普通的启动方式是一样的 (缺点:DEX会暴露在内存中)
- DEX指令抽取:把DEX文件中的一些方法的指令抽取出来,然后在内存中开辟一段区域,然后将我们内存加载的DEX解析到相应的方法指令偏移的地方,方法指令的偏移指向我们开辟的一段内存里面。(缺点:不彻底)
- 虚拟机加固:我们通过自己实现一套虚拟机,将DEX方法的指令抽取出来,在运行的时候,我们的虚拟机里面就运行被抽取的一段指令。这样攻击者想要破解,首先必须要找到我们虚拟机的入口,将虚拟机整个逻辑还原出来,这样攻击成本相对比较高 (缺点:本身Android应用就运行在虚拟机里面,不论是Dalvik还是ART,增加个虚拟机,就会增加一层对应用运行时代码的解释执行操作,那么解释执行的效率会大大下降)
- JAVA2C