Android resources.arsc资源文件防护原理分析

原创 2015年11月20日 12:25:10

主要防止apktool反编译resources.acrs资源文件,从而对资源文件进行保护
resources.acrs资源文件格式主要引用老罗的博客内容

Resources.arsc文件格式是由一系列的chunk构成,每一个chunk均包含如下结构的ResChunk_header,用来描述这个chunk的基本信息。
struct ResChunk_header
 {
     enum 
     {
         RES_NULL_TYPE               = 0x0000,
         RES_STRING_POOL_TYPE        = 0x0001,
         RES_TABLE_TYPE              = 0x0002,
         RES_XML_TYPE                = 0x0003,
         RES_XML_FIRST_CHUNK_TYPE    = 0x0100,
         RES_XML_START_NAMESPACE_TYPE= 0x0100,
         RES_XML_END_NAMESPACE_TYPE  = 0x0101,
         RES_XML_START_ELEMENT_TYPE  = 0x0102,
         RES_XML_END_ELEMENT_TYPE    = 0x0103,
         RES_XML_CDATA_TYPE          = 0x0104,
         RES_XML_LAST_CHUNK_TYPE     = 0x017f,
         RES_XML_RESOURCE_MAP_TYPE   = 0x0180,
         RES_TABLE_PACKAGE_TYPE      = 0x0200,
         RES_TABLE_TYPE_TYPE         = 0x0201,
         RES_TABLE_TYPE_SPEC_TYPE    = 0x0202
     };
     //当前这个chunk的类型
     uint16_t type;
     //当前这个chunk的头部大小
     uint16_t headerSize;
     //当前这个chunk的大小
     uint32_t size;
 };

我们先看反编译错误信息,后面再说如何实现
apktool错误日志:

Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec: 0x7f000005
  at brut.androlib.res.data.ResPackage.getResSpec(ResPackage.java:59)
  at brut.androlib.res.data.ResTable.getResSpec(ResTable.java:65)
  at brut.androlib.res.data.ResTable.getResSpec(ResTable.java:61)
  at brut.androlib.res.data.value.ResReferenceValue.getReferent(ResReferenceValue.java:57)
  at brut.androlib.res.data.value.ResReferenceValue.encodeAsResXml(ResReferenceValue.java:47)
  at brut.androlib.res.data.value.ResScalarValue.encodeAsResXmlValue(ResScalarValue.java:58)
  at brut.androlib.res.data.value.ResScalarValue.serializeToResValuesXml(ResScalarValue.java:75)
  at brut.androlib.res.AndrolibResources.generateValuesFile(AndrolibResources.java:502)
  at brut.androlib.res.AndrolibResources.decode(AndrolibResources.java:252)
  at brut.androlib.Androlib.decodeResourcesFull(Androlib.java:136)
  at brut.androlib.ApkDecoder.decode(ApkDecoder.java:102)
  at brut.apktool.Main.cmdDecode(Main.java:165)
  at brut.apktool.Main.main(Main.java:81)

错误提示是resource spec: 0x7f000005,下面就来看看使用aapt d resources test.apk 查看资源信息
appt d resources的基本格式如下:

resource <Resource ID> <Package Name>:<Type>/<Name>: t=<DataType> d=<Data> (s=<Size> r=<Res0>)
Resource ID R.java中的资源ID 
Package Name 资源所在的的包 
Type 资源的类型 
Name 资源名称 
DataType 数据类型,按照以下枚举类型取值 
Data 资源的值,根据dataType进行解释 
Size 一直为0x0008
Res0 固定为0x00
aapt d resources test.apk
Package Groups (1)
Package Group 0 id=0x7f packageCount=1 name=com.example.myapp
  Package 0 id=0x7f name=com.example.myapp
    type 1 configCount=4 entryCount=1
      spec resource 0x7f020000 com.example.myapp:drawable/ic_launcher: flags=0x00000100
      config ldpi-v4:
        resource 0x7f020000 com.example.myapp:drawable/ic_launcher: t=0x03 d=0x00000001 (s=0x0008 r=0x00)
      config mdpi-v4:
        resource 0x7f020000 com.example.myapp:drawable/ic_launcher: t=0x03 d=0x00000002 (s=0x0008 r=0x00)
      config hdpi-v4:
        resource 0x7f020000 com.example.myapp:drawable/ic_launcher: t=0x03 d=0x00000003 (s=0x0008 r=0x00)
      config xhdpi-v4:
        resource 0x7f020000 com.example.myapp:drawable/ic_launcher: t=0x03 d=0x00000004 (s=0x0008 r=0x00)
    type 2 configCount=1 entryCount=1
      spec resource 0x7f030000 com.example.myapp:layout/main: flags=0x00000000
      config (default):
        resource 0x7f030000 com.example.myapp:layout/main: t=0x03 d=0x00000000 (s=0x0008 r=0x00)
    type 3 configCount=1 entryCount=1
      spec resource 0x7f040000 com.example.myapp:string/app_name: flags=0x00000000
      config (default):
        resource 0x7f040000 com.example.myapp:string/app_name: t=0x02 d=0x00000005 (s=0x0008 r=0x00)

图片描述

我随便弄了一个com.example.myapp进行测试,通过上面信息可以看到app_name: t=0x02 已经改变,也就是DataType 数据类型。
直接使用010 Editor或其他HEX工具打开resources.arsc搜索对应的d=0x00000005(十六进制搜索需要反过来)
直接搜索HEX值:05000000然后将前面对应的08 00 00 02改成08 00 00 03然后保存打包,再反编译测试
经过测试drawable或string对应的DataType 数据类型值t=0x03修改为0x01或0x02都可以导致apktool反编译失败

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android逆向之旅---解析编译之后的Resource.arsc文件格式

一、前言快过年了,先提前祝贺大家新年快乐,这篇文章也是今年最后一篇了。今天我们继续来看逆向的相关知识,前篇文章中我们介绍了如何解析Android中编译之后的AndroidManifest.xml文件格...

手把手教你解析Resources.arsc

对于APK里面的Resources.arsc文件大家应该都知道是干什么的(不知道的请看我的另一篇文章Android应用程序资源文件的编译和打包原理),它实际上就是App的资源索引表。下面我会结合实例对...

Android应用程序资源的查找过程分析

我们知道,在Android系统中,每一个应用程序一般都会配置很多资源,用来适配不同密度、大小和方向的屏幕,以及适配不同的国家、地区和语言等等。这些资源是在应用程序运行时自动根据设备的当前配置信息进行适...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android逆向之旅---解析编译之后的Resource.arsc文件格式

一、前言 快过年了,先提前祝贺大家新年快乐,这篇文章也是今年最后一篇了。今天我们继续来看逆向的相关知识,前篇文章中我们介绍了如何解析Android中编译之后的AndroidManifest.xml文...

反编译APK

Android程序的反编译 APK是Android Package的简称,是Android平台安装包的标准封装格式,实际上是标准的zip压缩文件,里面包含清单文件,数字签名文件,压缩后的资源文件,以...

解析framework-res.apk中resources.arsc, 更改值实现修改屏幕最低亮度

解析framework-res.apk中resources.arsc, 更改二进制值实现修改屏幕最低亮度

保护Android resources文件不被反编译原理分析

保护Android resources文件不被反编译原理分析 0x00前言 本人新手,文章写的如果有不正确的地方烦请各路大神指点 0x01工具 010 Editor apktool aap...
  • pwelyn
  • pwelyn
  • 2016年02月01日 18:53
  • 2234

记一次resources.arsc文件hex修改原理分析

需要用到的工具 aapt ShakaApktool或apktool Hex编辑器 文本编辑器 作者:越狱(pwelyn) 样本就不提供了,自己随便找个apk联手吧 感谢@随意 提供样...
  • pwelyn
  • pwelyn
  • 2015年09月01日 16:19
  • 810

解析framework-res.apk中resources.arsc, 更改值实现修改屏幕最低亮度

解析framework-res.apk中resources.arsc, 更改二进制值实现修改屏幕最低亮度
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android resources.arsc资源文件防护原理分析
举报原因:
原因补充:

(最多只允许输入30个字)