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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM