转载自公众号“嵌入式Linux技术分享 ”
今天主要结合记账软件App,对Android APK反编译之ARSC进行分析。
如果APK被加固导致无法使用apktool进行反编译,这时我们只能利用unzip解压APK,对解压的文件进行分析,如下图所示。
解压后的AndroidMainfest.xml和resource.arsc都是二进制文件,下面主要分析resource.arsc文件,该ARSC格式文件内容对应Android App软件工程res目下相关内容,存放了资源相关的信息。
首先我们看下记账软件res目录下两个xml文件,public.xml和strings.xml。描述一个属性特征需要type、key和value三个值,type可以是mipmap、layout、menu、strings等类型。如下是public.xml部分代码,光亮处type为mipmap,key为ic_launcher。
下图是strings.xml部分代码,光亮处type为string,key为abc_action_bar_home_description,value为Navigate home。
重点来了,下面利用010Editor工具分析resource.arsc文件,查询上面public.xml和strings.xml中ic_launcher和abc_action_bar_home_description两个属性值。
先贴一个ARSC文件格式核心部分,如下图所示,分别指出了Type、Key和Value的Pool,以及实际的Type、Key和Value。
下图是Type Pools的信息,我们可以找到关心的类型mipmap的数组下标为12,类型string的数组下标为13。
第一个实例,我们定位ic_launcher的属性值。首先我们需要知道ic_launcher的type为mipmap,查Type Pools,对应的type数组下标为12,查找结果如下图所示,其中ResTable_typeSpec结构体header中id就是Type id,另外struct ResTable_entry entry[0]显示的ic_launcher就是Key值,Value值是404,dataType为Type_STRING。
根据属性Value值是404,查询Value Pool,如下所示,得到ic_launcher属性值为res/mipmap-mdpi-v4/ic_launcher.png
第二个实例,我们定位abc_action_bar_home_description的属性值。首先我们需要知道abc_action_bar_home_description的type为string,查Type Pools,对应的数组下标为13,查找结果如下图所示,abc_action_bar_home_description属性的Value值是1951。
根据属性Value值是1951,查询Value Pool,如下所示,得到abc_action_bar_home_description属性值为Navigate home。
综上,上面对ARSC文件的分析结果与实际res目录下文件内容一致。