可以做一个热身,先看这篇文章,了解基础知识:
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 版本 + 熟悉打包/签名命令)