导语:几个月前,网易易盾正式推出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层面的这个过程是不可逆的,不存在还原,难度会大大的增加。
图1、Android Dex文件保护
2. 性能上:以独有的“静态保护”技术,没有运行时的内存劫持改变,加固后的运行性能上面优于以往的加壳以及当下流行的dexVmp保护;以下通过加固前后CPU、内存占用率对比、启动时间对比、测试通过率对比、体积增加对比来说明。
2.1加固前后CPU、内存占用率对比
以下是魅拍APP对其中的四大组件下面所有的类进行java2c加固以后的性能数据对比图,从以下图2、3可以看出,加固前后的应用的CPU占用率、以及内存占比影响不大,并且在实际的加固中会根据每个应用类的特色进行甄选,加固产生的性能影响可以忽略不计。
图2、加固前后CPU占用率
图3、加固前后内存占用比
2.2加固前后启动时间对比:
如图4所示为市面上各个类型的应用程序经过加固以后的启动时间对比图,从图中可以看到经过加固以后的程序的启动时间增加非常小,对于用户的影响可以忽略不计。
图4、加固前后启动时间对比图
2.3加固前后测试通过率对比:
如图5所示为同样类型的应用程序加固以后通过百台测试机测试的通过率与加固前的对比图,从图中可以看出通过率基本上与加固前是一致的。
图5、加固前后兼容测试通过率对比图
2.4加固前后体积增加对比:
由于在易盾加固java2c方案中应用加固体积的增加与自身应用的类和方法的复杂性是息息相关的,在某些应用上还会出现加固以后变小的可能。如图6所示加固处理的默认规则为四大组件下面的所有的类和方法,方法数量在几百至几千个,整体大小的增加均在可接受范围内,由于某些APP本身的方法比较复杂,因此体积增加可能比较明显,可以通过黑白名单对于一些不重要的类和方法进行过滤处理,达到用户的需求。
图6、加固前后体积增加的对比图
3.兼容性上:易盾加固java2c方案不仅加固上支持dex的全指令级以及函数级的细粒度化,从图7可以看到通过中间状态的介入再生成各个目标平台代码,兼容性上与保护前一样。
由于易盾加固java2c方案是把待保护APK中的dex文件中间状态变换为一个另一种的中间状态,这个时候还没有生成底层的各个目标平台的状态。如下图5所示,因此兼容性上与保护前的状态是一样的。
图7、状态转换图
4. 灵活性上:默认加固当前APK四大组件下面的所有的类和方法,同时通过黑白名单和注解的方式来满足用户对于不同类和方法粒度化的加固需求配置。既可以通过黑白名单对默认处理规则以外的类进行控制,同时如下图8左所示可以通过注解“NEJ2CProtect”对待加固的类和方法进行标记处理;在加固的时候就会只对sub方法进行处理,反编译的结果如图8右所示。
图8、加固注解图
二、效果展示:
接下来通过一个简单的Demo展示加固前后的比较
加固前:
图9、保护前反编译代码
加固后:
反编译java层代码
图10、保护后的反编译代码
生成的本地层代码
图11、保护后的本地层代码
从上面的效果图可以看到保护前的java层代码完全下沉到本地层,为了观察前后的效果没有增加混淆和so的加壳处理,即便如此也有力的增大了攻击者的分析难度。
易盾最新一代的Java2C加固方案,以独有的“静态保护”技术,使得应用程序中的代码出现“下沉”,达到不可逆的效果,兼顾“冷热启动时间”、“CPU”、 “内存占用率”、“体积”等重要指标,同时保障用户加固的灵活性。
作者介绍:
赵贝贝,网易易盾高级客户端安全工程师。2018年7月加入网易,主要负责安卓移动应用安全加固。
朱星星,网易易盾客户端安全专家。2011年加入网易,主要负责游戏反外挂、安卓移动应用安全。