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