使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案

时间:2022-04-11 15:21:22

使用ApkTool以及dex2jar对apk进行反编译


相关工具下载地址:

ApkTool: https://ibotpeaches.github.io/Apktool/

Dex2Jar: https://sourceforge.net/projects/dex2jar/

JD-GUI: http://jd.benow.ca/jd-eclipse/update/#jd-gui-download

使用ApkTool对apk进行反编译以及打包

1.下载并解压ApkTool

在cmd命令行中进入ApkTool的文件夹(win7系统以上快捷键为shift+鼠标右键),输入apktool,出现如下图片中的提示信息,表示成功。
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案
注意的是,在apktool.bat中,可以修改使用的apktool.jar的版本。

2.使用ApkTool对apk进行反编译

在cmd命令行中进入ApkTool的文件夹,反编译命令:apktool.bat d [apk文件] [输出文件夹]
测试如下图,成功后,会在指定的输出文件夹下生成反编译后的文件。
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案

3.使用ApkTool对apk进行打包

在cmd命令行中进入ApkTool的文件夹,打包命令:apktool.bat b [资源文件夹] [打包生成的apk文件]
测试如下图,成功后,会在指定的输出文件夹下生成打包好的apk文件。
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案
注意,这里打包的apk文件是未经过签名的,可以看到在安装的时候会提示如下错误,如果需要安装,解决方法是需要进行重新签名。
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案

使用Dex2Jar以及JD-GUI反编译apk

使用dex2jar可以将apk文件中的dex文件转换成jar文件,然后就可以通过JD-GUI打开得到的jar文件来查看相应的Java代码。

1.下载Dex2Jar以及JD-GUI

工具的下载地址见文章上方
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案

2.使用dex2jar.bat得到jar文件

将需要反编译apk的后缀格式改成zip,然后使用解压出来,其中的classes.dex就是我们需要进行反编译的部分。
在cmd命令行中进入Dex2Ja文件夹,反编译命令:d2j-dex2jar.bat [classes.dex文件]
成功后,会在Dex2Ja文件夹下生成classes-dex2jar.jar文件,这个jar文件就是反编译后的文件。
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案

3.使用JD-GUI打开jar文件

使用JD-GUI软件打开classes-dex2jar.jar文件,就可以查看反编译的代码了。
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案
注意的是,如果进行反编译的apk进行了混淆处理,那么我们反编译看到的基本就很难阅读了。

总结

使用ApkTool对apk文件进行反编译,将dex文件转成了smali文件,更适合提取apk中的资源文件,比如布局文件以及图片等资源。

使用Dex2Jar对apk进行反编译,最终将dex文件转化成了jar文件,通过JD-GUI打开,对于未混淆的apk来说,更适合通过反编译来看相应得Java源码。

更新异常以及解决方案

在使用ApkTool进行反编译的时候,有时候我们会遇到如下的异常,下面我来贴出一下我的解决方法,希望可以给遇到问题的同学们帮助。
错误类型:
- Input file xxx was not found or was not readable.
- Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000
- Exception in thread “main” java.lang.NullPointerException I: Loading resource table from file: C:\Users\用户名\apktool\framework\1.apk

Input file xxx was not found or was not readable

使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案
这种问题是在2.1.0中,反编译的指令与1.5.3不同了,如果需要指定反编译输出文件夹,需要在前面加 -o 表示输出文件夹。
成功如下:
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案

Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000

这种问题一般是apktool的版本不匹配导致的,解决方案:

  1. 第一种是修改当前项目的sdk的buildtools版本,在当前项目中的project.properties文件中修改。
  2. 第二种是使用新版的apktool进行反编译,但是切换apktool版本可能会遇到下一个问题,具体解决方案见下文。
    使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案

Exception in thread “main” java.lang.NullPointerException

这个问题一般是切换apktool的jar包版本问题导致的,可以在命令行中看到错误提示:I: Loading resource table from file: C:\Users\用户名\apktool\framework\1.apk。
使用ApkTool以及dex2jar对apk进行反编译-更新异常以及解决方案
解决方法,只要把命令行提示中的framework文件夹中的1.apk文件删掉,重新进行反编译即可解决问题。