apk资源文件解析异常导致无法发编译的几种情况及解决方案
记录下用apktoolkit反编译时报的几个错误:
1、resource.arsc文件
错误内容:Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file
用010editor打开从apk中拖出来的resource.arsc文件,使用这里给出的模板
进行分析,如下所示:
只解析出了部分结构,初步判断是插入了干扰字节影响模板解析和正常解码。
在模板的下载页面,还给了resource.arsc格式的说明和一个破解实例的文档,阅读之后发现
在两个结构体之间确实插入了额外的4个00。删除之后重新加载模板,便可正常解析:
随后将修改好的resource.arsc拖进apk,再次反编译,开始报AndroidManifest.xml相关的错误了。
2、AndroidManifest文件
2.1 java.io.IOException: Expected: 0x00080003, got: 0x00080000
具体的报错内容为:
I: Decoding AndroidManifest.xml with resources...
Exception in thread "main" brut.androlib.AndrolibException: Could not decode XML
...
at brut.apktool.Main.main(Main.java:77)
Caused by: java.io.IOException: Expected: 0x00080003, got: 0x00080000
at brut.util.ExtDataInput.skipCheckInt(ExtDataInput.java:48)
...
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:129)
... 7 more
是期望读取的值与实际不符。在这里下载到AndroidManifest文件的010模板后,加载后发现,magicnumber值
正与报错的内容一致:
因此将其改为:
拖进apk后继续反编译,依然报错。
2.2 java.io.EOFException
I: Decoding AndroidManifest.xml with resources...
Exception in thread "main" brut.androlib.AndrolibException: Could not decode XML
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:136)
...
at brut.apktool.Main.main(Main.java:77)
Caused by: java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
...
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:129)
... 7 more
这个问题困扰了一两天。在各种群里问也没有人回答,所以只能自己找线索。
因此下载了AXMLparser的源码加日志打印后发现,正常的AndroidManifest文件读取到某个字段
结束就会停止,而报错的文件会一直执行到文件末尾然后报错。所以猜测可能是哪里的偏移值写多了或者是
故意写错。
还好看雪上的大牛们对文件格式已经进行了详尽的分析和绘图。主要参考的是该链接对AndroidManifest
文件格式分析的内容,对比010editor里的实际数据进行分析。文章中提到scStylePoolOffset字段在很多apk
中都是0,并且作用不明,加上自己打印日志产生的猜想,把这一字段设置成和其它apk一样的0:
修改后再次反编译apk,发现AndroidManifest文件不报错了,可以正常执行反编译。【猜对了^^】
I: Baksmaling...
...
I: Regular manifest package...
I: Decoding file-resources...
S: Could not decode file, replacing by FALSE value: layout/activity_aa.xml
S: Could not decode file, replacing by FALSE value: layout/activity_main.xml
S: Could not decode file, replacing by FALSE value: xml/devicepolicymanager_permission.xml
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...
->反编译.apk成功!
【BUT!】还是发现有几个xml文件无法解码,虽然对程序反编译和分析没有大的影响,但既然在探索这方面
的异常处理方法,还是去看看比较好。
3、其它xml文件:java.lang.ArrayIndexOutOfBoundsException
打开成功反编译后的apk目录下的res目录,发现其中layout和xml目录下的xml文件都是空的:
单独提这些xml文件出来,使用AXmlParser2反编译,首先报了2.1和2.2中的错误,修改方式
与之前一样:
修改后之后反编译,报错:java.lang.ArrayIndexOutOfBoundsException
百度错误信息之后,发现有网友提供修复该异常了的AXmlParser2.s,下载地址。用这个版本的AXmlParser反编译
xml文件之后,可正常阅读:
自此,修复这个apk中的资源文件,基本完毕。
4、相关链接:
- AndroidManifest二进制格式分析链接:http://www.kanxue.com/bbs/showthread.php?t=194206&highlight=mindmac
- AndroidManifest.xml模板链接:http://bbs.pediy.com/showthread.php?p=1329824
- resource.arsc模板链接:http://www.kanxue.com/bbs/showthread.php?p=1415579
- AxmlParser2.s下载地址:http://download.csdn.net/detail/simbaba/8625893