背景
Android App的资源文件中存放了大量的应用UI界面图片、UI布局文件、隐私数据文件等,如何保障这些资源文件的安全性一直是,和应用安全人员,关注的问题。
在Android App中,资源主要分为assets资源和res资源两类。
1.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译,可以存放一些图片、html、js、css、证书等文件。
2.res资源则存放在App的res目录下,该类资源在App打包时大多会被编译,变成二进制文件,应用层代码通过resource id对该类资源进行访问。
常见方案及问题
目前市场上常见的资源文件保护方案主要有以下两种思路:
资源文件混淆保护,对资源文件的路径进行混淆,缩短文件夹和文件名,以及替换/删除某个资源的名称。
此方式会增加破解者在破解时阅读难度,但是安全强度有限,仅对资源文件进行重命名并不能有效的保护资源文件,破解者依然能可查看并修改资源文件内容,只是破解的时间成本增加了。
资源文件加密保护,通过加密手段,将Android资源的assets和res等目录的内容进行加密、隐藏及压缩,使用时再将文件解压并对文件解密。
此方式安全强度相对较高,破解者不能轻易查看和修改资源文件。但是一般只是实现了对assets资源文件的部分加密,且运行时Android依旧需要读取本地解密后的资源文件,依然存在很大的安全隐患和安全漏洞。
通付盾创新方案-简介
通付盾移动加固团队在面向Android资源文件加密问题时,实践出一套更加,的Android资源文件加密方案,不但能完成对assets和res文件进行更高标准的全部加密保护,同时能在Android加载资源文件的过程中实现资源文件的不落地解密,以此来避免资源文件被再次还原到本地目录带来的风险,从而对资源文件的保护得到质的提升。
图1Android资源文件加密方式
如图1所示,在资源文件加密的过程中,程序首先对App安装包进行分析,获取其中res和assets目录的地址,并对这两个资源文件夹下的内容进行抽取。
抽取完成之后,压缩成一个新的zip文件。再对这个zip文件进行整体加密,存放在App安装包的assets目录下,并且会删除安装包中原有的assets和res资源文件夹。
这样攻击者在拿到App安装包的时候就无法从res和assets目录下获取到原始资源文件,也无法进行重打包等恶意行为。对于被加密处理过的压缩资源文件,在调用加载的时候也做了安全保护处理,核心流程如图2所示。
图2Android资源文件加载方式
一般市面上对于加密后的资源包,在调用加载的时候都会进行解密,然后形成一份本地解密后的资源包文件,再由系统直接调用本地的资源目录进行读取或加载。这种方式还是会产生本地的资源目录和文件,代表着攻击者从本地目录中还是能够获取到所有的资源文件,无疑产生了极大的安全风险隐患。
对于此问题,我们创新性的采用不落地加载资源文件的方式来解决。即在Android加载资源文件的过程中,将加密后的资源包进行不落地解密等操作,并让系统能够读取到资源文件,以此来避免产生本地的文件目录,更有效的保护资源文件的安全。
在Android加载资源文件的过程中,系统最终是依靠一些关键的读写方法进行工作,我们对这些关键方法进行拦截操作,拦截到系统调用读写等动作之后,我们会开始执行对应目标资源文件的解密操作,并直接将解密后的资源文件加载到内存当中。加载到内存后,让系统去内存中直接读取到资源文件,App内就能正常使用到资源文件的内容。
通付盾创新方案-加密效果
加密前后资源文件目录对比如图3所示:
图3Android资源文件加固效果
加密后的资源文件内容如图4所示:
图4Android资源文件加密数据
若想体验资源加密功能,可以到通付盾云平台进行加固体验。
图5通付盾云平台展示