使用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.bat中,可以修改使用的apktool.jar的版本。
2.使用ApkTool对apk进行反编译
在cmd命令行中进入ApkTool的文件夹,反编译命令:apktool.bat d [apk文件] [输出文件夹]
测试如下图,成功后,会在指定的输出文件夹下生成反编译后的文件。
3.使用ApkTool对apk进行打包
在cmd命令行中进入ApkTool的文件夹,打包命令:apktool.bat b [资源文件夹] [打包生成的apk文件]
测试如下图,成功后,会在指定的输出文件夹下生成打包好的apk文件。
注意,这里打包的apk文件是未经过签名的,可以看到在安装的时候会提示如下错误,如果需要安装,解决方法是需要进行重新签名。
使用Dex2Jar以及JD-GUI反编译apk
使用dex2jar可以将apk文件中的dex文件转换成jar文件,然后就可以通过JD-GUI打开得到的jar文件来查看相应的Java代码。
1.下载Dex2Jar以及JD-GUI
工具的下载地址见文章上方
2.使用dex2jar.bat得到jar文件
将需要反编译apk的后缀格式改成zip,然后使用解压出来,其中的classes.dex就是我们需要进行反编译的部分。
在cmd命令行中进入Dex2Ja文件夹,反编译命令:d2j-dex2jar.bat [classes.dex文件]
成功后,会在Dex2Ja文件夹下生成classes-dex2jar.jar文件,这个jar文件就是反编译后的文件。
3.使用JD-GUI打开jar文件
使用JD-GUI软件打开classes-dex2jar.jar文件,就可以查看反编译的代码了。
注意的是,如果进行反编译的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
这种问题是在2.1.0中,反编译的指令与1.5.3不同了,如果需要指定反编译输出文件夹,需要在前面加 -o 表示输出文件夹。
成功如下:
Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x00000000
这种问题一般是apktool的版本不匹配导致的,解决方案:
- 第一种是修改当前项目的sdk的buildtools版本,在当前项目中的project.properties文件中修改。
- 第二种是使用新版的apktool进行反编译,但是切换apktool版本可能会遇到下一个问题,具体解决方案见下文。
Exception in thread “main” java.lang.NullPointerException
这个问题一般是切换apktool的jar包版本问题导致的,可以在命令行中看到错误提示:I: Loading resource table from file: C:\Users\用户名\apktool\framework\1.apk。
解决方法,只要把命令行提示中的framework文件夹中的1.apk文件删掉,重新进行反编译即可解决问题。