zoukankan      html  css  js  c++  java
  • 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 ^^
  • 相关阅读:
    基于mAppWidget实现手绘地图--索引&DEMO
    C语言数据结构----栈的定义及实现
    libvirt命令行文档
    清理系统方法
    Linux 经典电子书共享下载
    使用数组实现队列----《数据结构与算法分析---C语言描述》
    清理系统垃圾
    epoll的内部实现 & 百万级别句柄监听 & lt和et模式非常好的解释
    进程、线程、socket套接字-资源大小 & 切换代价
    网络编程学习-面向工资编程
  • 原文地址:https://www.cnblogs.com/annaivsu/p/5268837.html
Copyright © 2011-2022 走看看