共计 2225 个字符,预计需要花费 6 分钟才能阅读完成。
导语:几个月前,网易易盾正式推出 Java2c 加固。它以独有的“静态保护”技术,使得应用程序中的代码出现“下沉”,达到不可逆的效果,兼顾“冷热启动时间”、“CPU”、“内存占用率”、“体积”等重要指标,保障用户加固的灵活性。这种类型的加固是在什么契机下推出?它到底具备哪些优势?在实际测试和应用中,它的表现是什么样的?网易易盾两位技术专家为此撰写本文做出解读。
网易易盾为什么会推出 Java2c 加固?其实灵感是来自于谷歌的 DEX2OAT 的理念:
移动应用包可以在安装期间从 Dex 包转化为可执行的 ELF 格式的包,相当于从 Java 代码转换成了二进制代码,极大地提高了移动应用的运行速度。基于这个理念延伸,我们思考:何不把这个转换过程在加固期间就做掉呢?这样加固后的移动应用包就是二进制代码的形式,无论是安装还是运行速度都可以有极大地提升。
而且 Android 开发天然就支持 NDK(简单来说就是底层提供 C ++ 代表编译成的 SO),加固时把 Java 代码转换成 NDK 层的二进制代码,这样就解决了性能和兼容性问题。由于二进制转换是在加固期间做的,加固后的移动应用包是转换后的二进制结果,它是不可逆的,也因此大大地提高了安全强度。
下面我们就来看看具体的测试数据
一、特性说明:
易盾加固 Java2c 方案作为最新一代 Android 移动应用 Dex 文件保护方案:
1. 强度上:以“代码下沉”的方式把 java 层代码完全下沉到本地层,大大增大了攻击者的分析难度,高于以往的加壳以及 dexVmp 保护。
应用程序经过易盾加固 java2c 方案加固以后,在运行的过程中不存在像如下图 1 所示的一代和二代“壳”保护完以后会在内存中出现整体或者部分数据还原,因此强度上远远高于早先的代码抽取的各种壳。于当下比较流行的三代 dex VMP 相比,在 dex VMP 中攻击者可以在内存中对虚拟解释器中的指令进行监控,通过映射表进行还原,对于经过 java2c 加固以后,Java 层代码完全的下沉到本地层面, 攻击者的攻击目标由 Java 层转为 Native 层面,这个时候对于攻击者而言,从 Native 层面还原为 Java 层面的这个过程是不可逆的,不存在还原,难度会大大的增加。
性能上:以独有的“静态保护”技术,没有运行时的内存劫持改变,加固后的运行性能上面优于以往的加壳以及当下流行的 dexVmp 保护;以下通过加固前后 CPU、内存占用率对比、启动时间对比、测试通过率对比、体积增加对比来说明。
2.1 加固前后 CPU、内存占用率对比
以下是魅拍 APP 对其中的四大组件下面所有的类进行 java2c 加固以后的性能数据对比图,从以下图 2、3 可以看出,加固前后的应用的 CPU 占用率、以及内存占比影响不大,并且在实际的加固中会根据每个应用类的特色进行甄选,加固产生的性能影响可以忽略不计。
2.2 加固前后启动时间对比:
如图 4 所示为市面上各个类型的应用程序经过加固以后的启动时间对比图,从图中可以看到经过加固以后的程序的启动时间增加非常小,对于用户的影响可以忽略不计。
2.3 加固前后测试通过率对比:
如图 5 所示为同样类型的应用程序加固以后通过百台测试机测试的通过率与加固前的对比图,从图中可以看出通过率基本上与加固前是一致的。
2.4 加固前后体积增加对比:
由于在易盾加固 java2c 方案中应用加固体积的增加与自身应用的类和方法的复杂性是息息相关的,在某些应用上还会出现加固以后变小的可能。如图 6 所示加固处理的默认规则为四大组件下面的所有的类和方法,方法数量在几百至几千个,整体大小的增加均在可接受范围内,由于某些 APP 本身的方法比较复杂,因此体积增加可能比较明显,可以通过黑白名单对于一些不重要的类和方法进行过滤处理,达到用户的需求。
3. 兼容性上:易盾加固 java2c 方案不仅加固上支持 dex 的全指令级以及函数级的细粒度化,从图 7 可以看到通过中间状态的介入再生成各个目标平台代码,兼容性上与保护前一样。
由于易盾加固 java2c 方案是把待保护 APK 中的 dex 文件中间状态变换为一个另一种的中间状态,这个时候还没有生成底层的各个目标平台的状态。如下图 5 所示,因此兼容性上与保护前的状态是一样的。
灵活性上:默认加固当前 APK 四大组件下面的所有的类和方法,同时通过黑白名单和注解的方式来满足用户对于不同类和方法粒度化的加固需求配置。既可以通过黑白名单对默认处理规则以外的类进行控制,同时如下图 8 左所示可以通过注解“NEJ2CProtect”对待加固的类和方法进行标记处理;在加固的时候就会只对 sub 方法进行处理,反编译的结果如图 8 右所示。
二、效果展示:
接下来通过一个简单的 Demo 展示加固前后的比较。
加固前:
加固后:
反编译 java 层代码
生成的本地层代码
图 11、保护后的本地层代码
从上面的效果图可以看到保护前的 java 层代码完全下沉到本地层,为了观察前后的效果没有增加混淆和 so 的加壳处理,即便如此也有力的增大了攻击者的分析难度。
易盾最新一代的 Java2C 加固方案,以独有的“静态保护”技术,使得应用程序中的代码出现“下沉”,达到不可逆的效果,兼顾“冷热启动时间”、“CPU”、“内存占用率”、“体积”等重要指标,同时保障用户加固的灵活性,可以免费试用。
作者介绍:
赵贝贝,网易易盾高级客户端安全工程师。2018 年 7 月加入网易,主要负责安卓移动应用安全加固。
朱星星,网易易盾客户端安全开发。2011 年加入网易,主要负责游戏反外挂、安卓移动应用安全。
文章来源:网易云社区