首页
社区
课程
招聘
[下载][原创]resources.arsc解析工具C++源码
发表于: 2017-1-23 17:16 6257

[下载][原创]resources.arsc解析工具C++源码

2017-1-23 17:16
6257
这是本人花了一周多时间学习android资源文件格式的成果,一边看一边写的;因为是学习作品,代码比较混乱,也懒得整理啦。
APKTOOL源码其实已经足够用,只是为了方便各C++程序员学习资源文件格式,所以个人以为还是有点用处的。

资源文件格式粗略地看可以分成两块,一块头一块是详细内容:
(1)头部分包含了整个文件描述信息和字符串池,字符串池内容分为三块,分别为值、类型和KEY字符串;这些字符串内容在解析时先保存下来,然后后面解析详细内容的时候需要用到字符串时会需要引用它们。

(2)详细内容中,各种资源类别(id、String、Style...等)都是以RES_TABLE_TYPE_TYPE的格式存储的.RES_TABLE_TYPE_TYPE结构之前一般会跟一个RES_TABLE_TYPE_SPEC_TYPE存储一些信息,具体内容还是在RES_TABLE_TYPE_TYPE结构里。

(3)RES_TABLE_TYPE_TYPE结构又分为ResMap(复杂型)和ResValue(简单型)两类结构,ResMap里又包含了多个ResValue,所以称为复杂型。像Style.xml这样具有多层节点的一般使用ResMap存储,而ids.xml和string.xml这样只有一层节点的xml文件则使用ResValue存储。
每个ResValue对应xml文件中的一行。

关于资源文件格式详细内容可参考这里:
点我点我

项目简介:
工程文件是一个控制台程序,用VS2013开发,参数格式为"-f 资源路径/*.arsc"。
执行成功后,会在程序的当前目录下生成value文件夹,所有反编译出的东西都统一放在这里。
代码主要流程分两块:
(1)解析头部和各类字符串池(值字符串列表、KEY字符串列表、类型字符串列表)
(2)接下来是一个while循环,遍历各个RES_TABLE_TYPE_TYPE获取资源详细信息

程序源码地址:3d8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4m8S2L8W2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9J5c8U0q4A6y4q4u0X3y4i4m8J5

目前存在的问题:
(1)当各资源条目的类别属性是引用类型的时候,没有加上具体的引用路径,而是直接用类似于"@android:1000056"这样的形式显示的,有待解决。
(2)生成的资源文件名称没有做详细的分类,比如styles.xml文件在values文件夹和values-land文件夹下都有一份,目前都存在了values文件夹下,为了防止重名把本应放在values-land文件夹下的styles.xml名字改成了styles_land.xml。

另外分享一下有的资源混淆把资源文件放在一个叫r的文件夹中,不放在Res文件夹中,导致apktool工具反编译失败的源码改法:
(1)在Apktool-master\brut.apktool\apktool-lib\src\main\java\brut\androlib\res\AndrolibResources.java文件的decode函数中,看看是否有这段代码
if (in == null && inApk.containsDir("r")) {
                in = inApk.getDir("r");
            }
如果没有就加上,有的话让要这行发挥作用(有的混淆后的资源有个空的res文件夹,这行就不发生作用了)。
(2)有的混淆会把资源名称变成空字符,用apktool反编译会智能地设成类似于_APKTOOL_XXXX_0x7f060001这样的名字。在Apktool-master\brut.apktool\apktool-lib\src\main\java\brut\androlib\res\decoder\ResFileDecoder.java文件的decode函数中,把输出路径的文件名也会变成这种格式的,这样的名字会导致出错,把它换成和输入文件一致即可。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 7146
活跃值: (9979)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
2
支持一个................
2017-1-29 14:35
0
游客
登录 | 注册 方可回帖
返回