記錄下用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
