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
__________________________________________________________ shoobie do lang lang ^^
原文地址:https://www.cnblogs.com/annaivsu/p/5268837.html