使用dex2jar反编译APK时出现的问题

在我们使用 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)

https://sourceforge.net/p/dex2jar/tickets/238/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值