Resource.arsc文件解析

前言

我们知道一个APK文件结构为:mete-INF存放签名文件的目录。res 存放了二进制编译XML及图片资源文件的目录,AndroidManifest.xml文件,classes.dexDalvik字节码和resources.arsc编译后的二进制资源文件。本文主要介绍应用资源文件的格式和目前基于对arsc文件处理的应用技术。

arsc文件结构

Resources.arsc文件的整体可以用以下的这张图来概述


Resource.arsc文件解析_第1张图片

首先注意Resources.arsc文件采用小端编码方式(x的值为0x1122,那么0x11为高字节,0x22为低字节。对于小端模式,就将0x11放在高地址中,0x22放在低地址)
下面我们简要分析一下其中几个模块

ResTable_header(资源索引表头)

image.png

ResTable_header的chunk(02 00 0C 00 6895 01 00 01 000000)
02 00 位置0~ 1,共2字节,表示该chunk的类型,值为0x0002表示类型为RES_TABLE_TYPE.
0C 00 位置2 ~ 3 ,共2字节,表示该chunk类型的头长度,
值为0x000C表示该类型的头长度为12字节长度。
6895 01 00位置4~7,共4字节,表示该chunk的总长度
,值为0x00019568表示该chunk的总长度(这里为整个文件的大小)为103784字节长度。
01 000000 被编译的资源包的个数,这里只有一个。

ResStringPool_header(全局字符串资源)

紧跟着资源索引表头部的是资源项的全局字符串资源,这个字符串资源池包含了所有的在资源包里面所定义的资源项的全局字符串,包括android工程中部分资源文件名(如res/drawable-hdpi/ic_launcher.png,res/layout/activity_main.xml等)及res/values/strings.xml中的字符串值

image.png

01 00 位置0~ 1,共2字节,表示该chunk的类型,值为0x0001 表示类型为RES_STRING_POOL_TYPE.
1C 00 位置2 ~ 3 ,共2字节,表示该chunk类型的头长度,值为0x001C表示该类型的头长度为28字节长度。
A491 0000 位置4~7,共4字节,表示该chunk的总长度,值
为0x000091A4表示该chunk的总长度为37284字节长度。
E1 03 00 00 位置0x08 ~ 0x0B,共4字节,表示字符串数量,
值为0x000003E1表示字符串数量为993个。
00000000 位置 0x0C ~0x0F,共4字节,表示字符串样式数量,值
为0x00000000表示字符串样式数量为0个。
00 01 00 00位置 0x10 ~ 0x13字符串的属性,共4字节,值
为0x00000100表示字符串采用utf-8编码。
A00F 00 00 0x14 ~ 0x17共4字节,值为0x00000FA0表示字符串内容相对于RES_STRING_POOL头部的偏移为4000。实际的文件偏移地址为0x00000FA0+0x0C=0x0FAC。
000000000x18 ~ 0x1B共4字节,值为0表示字符串样式内容相对于RES_STRING_POOL头部的偏移为0。

下图是简单的理解方式

Resource.arsc文件解析_第2张图片
arsc.png

基于对arsc文件处理的应用技术

利用arsc文件提高apk安全

目前一些apk通过向arsc文件中插入冗余数据,使得安卓虚拟机及aapt对于这些异常的格式可以正常处理,而apktool工具处理分析时会出现异常。来提高apk反编译难度。

原理解析

首先我们看一下aapt获取头部的方式
通过搜索RES_TABLE_TYPE一步一步跳转我们找到了aapt解析头部的c++代码如下


Resource.arsc文件解析_第3张图片

http://androidxref.com/7.0.0_r1/xref/frameworks/base/tools/aapt2/unflatten/BinaryResourceParser.cpp
循环解析header

Resource.arsc文件解析_第4张图片

http://androidxref.com/7.0.0_r1/xref/frameworks/base/tools/aapt2/unflatten/ResChunkPullParser.cpp#27
可以看出头部的获取是上一个头部的位置加上一个头部的大小得到当前的头部大小

再看一下apktool解析文件的方式

Resource.arsc文件解析_第5张图片

https://github.com/iBotPeaches/Apktool/blob/master/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java
按照文件的格式解析头在解析StringBlock

Resource.arsc文件解析_第6张图片

同时有个头部校验的过程如果不是期望的的就报错
知道以上两点下面我们看一看在arsc加入什么内容就可以导致apktool反编译失败而aapt却可以正常通过
如下图所示 在头部header后面加入冗余字节的数据 就可以了同时还要改写头部header的大小信息

当然随着apktool代码的升级该方法也许会失效

基于arsc文件混淆资源文件路径和文件名称

微信的资源文件混淆就是通过修改arsc文件内容达到资源文件路径混淆的。改写value字符串资源池中的文件路径为我们混淆后的文件路径,从而提高apk安全性与较少apk大小

参考资料

https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=208135658&idx=1&sn=ac9bd6b4927e9e82f9fa14e396183a8f#rd
https://github.com/shwenzhang/AndResGuard
https://www.jianshu.com/p/3cc131db2002)
http://blog.csdn.net/luoshengyang/article/details/8806798
http://blog.csdn.net/luoshengyang/article/details/8744683
https://www.jianshu.com/p/655051281aeb

https://github.com/iBotPeaches/Apktool

你可能感兴趣的:(Resource.arsc文件解析)