apktool 反编译打包失败,字节码解析失败

本文探讨了在遇到Android应用被加密的39285EFA.dex文件导致apktool反编译失败的情况,通过升级apktool版本并理解问题原因,作者分享了解决方案及如何跳过解析加密文件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以做一个热身,先看这篇文章,了解基础知识:
Android 反编译修改包名、重新签名、更换app名称

1、完整错误日志

B:\fhct\2>apktool d AAA.apk I: Using Apktool 2.3.1 on AAA.apk I: Loading resource table... I: Decoding AndroidManifest.xml with resources... I: Loading resource table from file: C:\Users\10544\AppData\Local\apktool\framework\1.apk I: Regular manifest package... I: Decoding file-resources... I: Decoding values */* XMLs... I: Baksmaling classes.dex... I: Baksmaling classes2.dex... I: Baksmaling assets/39285EFA.dex... Exception in thread "main" org.jf.util.ExceptionWithContext: Encountered small uint that is out of range at offset 0x38 at org.jf.dexlib2.dexbacked.BaseDexBuffer.readSmallUint(BaseDexBuffer.java:58) at org.jf.dexlib2.dexbacked.DexBackedDexFile.<init>(DexBackedDexFile.java:81) at org.jf.dexlib2.dexbacked.DexBackedDexFile.<init>(DexBackedDexFile.java:100) at org.jf.dexlib2.dexbacked.ZipDexContainer$ZipDexFile.<init>(ZipDexContainer.java:151) at org.jf.dexlib2.dexbacked.ZipDexContainer.loadEntry(ZipDexContainer.java:193) at org.jf.dexlib2.dexbacked.ZipDexContainer.getEntry(ZipDexContainer.java:120) at org.jf.dexlib2.dexbacked.ZipDexContainer.getEntry(ZipDexContainer.java:58) at org.jf.dexlib2.DexFileFactory$DexEntryFinder.findEntry(DexFileFactory.java:382) at org.jf.dexlib2.DexFileFactory.loadDexEntry(DexFileFactory.java:186) at brut.androlib.src.SmaliDecoder.decode(SmaliDecoder.java:72) at brut.androlib.src.SmaliDecoder.decode(SmaliDecoder.java:38) at brut.androlib.Androlib.decodeSourcesSmali(Androlib.java:98) at brut.androlib.ApkDecoder.decode(ApkDecoder.java:163) at brut.apktool.Main.cmdDecode(Main.java:163) at brut.apktool.Main.main(Main.java:72)

2、日志提炼

I: Baksmaling assets/39285EFA.dex... Exception in thread "main" org.jf.util.ExceptionWithContext: Encountered small uint that is out of range at offset 0x38
注意字节码文件 assets/39285EFA.dex
直接使用压缩工具打开 apk 发现该文件
在这里插入图片描述

39285EFA.dex 是什么?经查阅资料说是 OAID 的东西。
OAID 官方文档

3、看看 39285EFA.dex 和 classes.dex 有什么不同

39285EFA.dex 混杂这中文乱码(也就是不同格式的编码)
在这里插入图片描述
classes.dex
在这里插入图片描述
我们发现: 39285EFA.dex 是被加密过的字节码文件!!!

apktool 工具是根据 Android 官方定义的标准规则来解析 apk 中的字节码文件的,只有在内容对应上规则才能正常解析,显然,存在被加密的字节码文件,内容发生了改变自然不被标准规则正常解析,所以解析抛出异常!!!

标准字节码文件解析状态: 能够看到包名以及具体的类名(有些包或者类是被混淆过的)
在这里插入图片描述
异常(被加密)字节码文件解析状态:官方工具都不能解析,岂不是说明该字节码的格式发生了改变(若要正确解析被加密的字节码,那就要破解,这个就触及到我的盲区了)
在这里插入图片描述

所以,是否可以在解析过程中跳过 39285EFA.dex 字节码文件的解析,程序仍然正常,重新打包不影响程序???

4、对比之前能正常解析的 apk 目录

发现 assets 目录中没有被加密过的字节码文件
在这里插入图片描述

5、解决

设想,如果跳过对加密字节码文件的解析可以使 apktool 反编译过程正常,那么…

问题来了:如何跳过 39285EFA.dex 字节码文件的解析???

尝试一:

网上很多说使用 apktool d **.apk -only-main-classes 【我很是遗憾,对我无效,我的 apktool 版本是 2.3.1
在这里插入图片描述

尝试二:

升级 apktool 版本 + -only-main-classes【果然成功了

如何执行一个 jar 文件:java -jar apktool_2.5.0.jar

下载最新 apktool
在这里插入图片描述
注意这两个接入的区别:

尝试一:Baksmaling assets/39285EFA.dex…

尝试二:Copying raw assets/39285EFA.dex file…

总结

1、定位关键日志
2、分析或理解错误可能原因
3、寻找解决方法(升级 apktool 版本 + 熟悉打包/签名命令)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值