在我们使用 dex2jar来反编译我们的APK的时候,我们可能会遇到下面这些的情况
1. 占位符的问题 (placeholder issue)
如果我们使用 dex2jar 出现了下面这个问题
2>COMPILETODALVIK : PARSE error :
2> unknown tag byte: 13
2> ...while preparsing cst 0005 at offset 00000036
2> ...while parsing module-info.class
2> 1 error; aborting
在这里可能会遇到一些 Android的Library Compatibility的问题,也就是(兼容性)的问题
有一些原因如下
Placeholder issue to track the status of Android compatibility
within this library. Right now, rooting is required, and there
appear to be a number of issues with including the library in Android Studio.
Investigation forthcoming.
占位符的问题(placeholder issue)
其实Java 对Android的支持只到了Java 8, 现在Java已经到了 14了,那么Java的一些新的特性Android其实是不支持的,有的APP可能是在 maven, eclipse 上编译的这个时候可能通过了,开发者自己可能也会有经验,如果在Android studio 上编译不通过。
Android的一些第三方库可能就是纯的Java编写的,比如说Java 9 +, 这个时候可能有一些新的功能是 dex2jar 不能识别的,这个时候就会报错
比如这个第三方库是在Android的某个SDK上开发的,可能当时这个SDK允许这个功能,但是现在考虑到某个安全因素,这个功能已经不再支持了,在吧这个引入到APP里面的时候,可能反编译的时候就出现了问题
https://github.com/Fazecast/jSerialComm/issues/128
2. Java的 heap size 错误
C:\~dex2jar>d2j-dex2jar --force
classes.dex
dex2jar classes.dex -> classes-dex2jar.jar
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.objectweb.asm.Type.getInternalName(Unknown Source)
at com.googlecode.dex2jar.v3.V3ClassAdapter.searchEnclosing(V3ClassAdapt
er.java:179)
at com.googlecode.dex2jar.v3.V3ClassAdapter.build(V3ClassAdapter.java:13
0)
at com.googlecode.dex2jar.v3.V3ClassAdapter.visitField(V3ClassAdapter.ja
va:303)
at com.googlecode.dex2jar.reader.DexFileReader.acceptField(DexFileReader
.java:603)
at com.googlecode.dex2jar.reader.DexFileReader.acceptClass(DexFileReader
.java:439)
at com.googlecode.dex2jar.reader.DexFileReader.accept(DexFileReader.java
:330)
at com.googlecode.dex2jar.v3.Dex2jar.doTranslate(Dex2jar.java:84)
at com.googlecode.dex2jar.v3.Dex2jar.to(Dex2jar.java:239)
at com.googlecode.dex2jar.v3.Dex2jar.to(Dex2jar.java:230)
at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java
:109)
at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:168)
at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:34)
解决办法
用记事本打开 dex2jar.bat 文件, 最后一行内容如下:
@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.Dex2jarCmd %*
看来真正执行方是 d2j_invoke.bat 文件, 其文件末尾内容如下:
java -Xms512m -Xmx1024m -cp "%CP%" %*
这里我将 -Xmx1024m 改为: -Xmx2048m 就不会再内存溢出错误了。
java.lang.RuntimeException: can not merge I and Z
dex2jar 设置了严格的类型检查,这个也使得很容易阻止其反编译, 只要我们给一些变量设置一些类型,这个时候dex2jar反编译的时候就会报错。
the problem is caused by strict type calculation, because in java syntaxt, a boolean can not assign to an inteager. so dex2jar forbid merge type Z and I. It is simple to fix
modify the dex by hand and add the following code after move-result v1
if-eqz v1, :LZERO
const v1, 1
goto :Lend
:LZERO
const v1, 0
:Lend
OR modify the dex2jar code. return Type I when merge I and Z at com.googlecode.dex2jar.ir.TypeClass.merge(TypeClass.java:100)