0%

Mac反编译apk

今天反编译工具突然不能用了,搜索了下解决方案,记录一下。(主要是将 apk 反编译成 jar)

enjarify

官网地址:https://github.com/google/enjarify

使用方法

  1. 将代码 clone 到本地

  2. cd 到 enjarify 的目录

  3. 添加软链

    ln -s "$PWD/enjarify.sh" /usr/local/bin
  4. 开始反编译

    enjarify.sh xxx.apk

enjarify 使用起来感觉比较稳,但是可能是 apk 大了,出奇的慢 ,可以作为备选方案。

而且 enjarify 反编译出来的 jar ,内部类都是单独的文件,dex2jar 则都在一个文件

dex2jar

这个安装方式就不说了,教程很多,主要是遇到了下面这个问题

java.lang.StringIndexOutOfBoundsException: String index out of range: -2
at java.lang.String.substring(String.java:1967)
at org.objectweb.asm.signature.SignatureReader.parseType(SignatureReader.java:169)
at org.objectweb.asm.signature.SignatureReader.acceptType(SignatureReader.java:130)
at org.objectweb.asm.commons.Remapper.mapSignature(Remapper.java:162)
at org.objectweb.asm.commons.RemappingClassAdapter.visitField(RemappingClassAdapter.java:90)
at org.objectweb.asm.ClassVisitor.visitField(ClassVisitor.java:272)
at com.googlecode.d2j.dex.Dex2Asm.convertField(Dex2Asm.java:478)
at com.googlecode.d2j.dex.Dex2Asm.convertClass(Dex2Asm.java:429)
at com.googlecode.d2j.dex.Dex2Asm.convertDex(Dex2Asm.java:450)
at com.googlecode.d2j.dex.Dex2jar.doTranslate(Dex2jar.java:175)
at com.googlecode.d2j.dex.Dex2jar.to(Dex2jar.java:275)
at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:112)
at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:290)
at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:33)

https://github.com/ThexXTURBOXx/dex2jar/releases

使用这个人的分支可以解决

直接使用也遇到了问题:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at com.googlecode.d2j.reader.DexFileReader.readEncodedAnnotation(DexFileReader.java:976)
at com.googlecode.d2j.reader.DexFileReader.readAnnotationItem(DexFileReader.java:962)
at com.googlecode.d2j.reader.DexFileReader.readAnnotationSetItem(DexFileReader.java:954)
at com.googlecode.d2j.reader.DexFileReader.acceptClass(DexFileReader.java:874)
at com.googlecode.d2j.reader.DexFileReader.accept(DexFileReader.java:725)
at com.googlecode.d2j.reader.MultiDexFileReader.accept(MultiDexFileReader.java:122)
at com.googlecode.d2j.reader.MultiDexFileReader.accept(MultiDexFileReader.java:115)
at com.googlecode.d2j.dex.Dex2jar.doTranslate(Dex2jar.java:48)
at com.googlecode.d2j.dex.Dex2jar.to(Dex2jar.java:235)
at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:103)
at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:297)
at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:16)

修改 d2j-dex2jar.sh 文件中的最后一行, 修改点是 -Xmx4096m

java -Xms512m -Xmx4096m -classpath "${_classpath}" "com.googlecode.dex2jar.tools.Dex2jarCmd" "$@"

apktool

apktool d -s xxx.apk

-s 表示不把 dex 解码成 smali 文件

apktool 可以把 apk 反编译成 dex ,但是 dex 是分离的,上面两种都是合并成一个 jar ,有多个 dex 的 apk 不适合用 apktool