Android反编译工具 apktool 、dex2jar、jd

您所在的位置:网站首页 apktool打包 Android反编译工具 apktool 、dex2jar、jd

Android反编译工具 apktool 、dex2jar、jd

2023-03-12 02:41| 来源: 网络整理| 查看: 265

一、相关工具下载地址:

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

dex2jar最新下载地址 https://www.cnblogs.com/dg-blog/p/14486104.html

JD-GUI: http://java-decompiler.github.io/

jadx:https://github.com/skylot/jadx

二、使用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文件或classes-dex2jar.jar 拖入jd-gui.exe,就可以查看反编译的代码了。

注意的是,如果进行反编译的apk进行了混淆处理,那么我们反编译看到的基本就很难阅读了。

四、dex2jar反编译多个dex的apk方法

工作中常用到反编译apk,但是apk下面不仅仅只有一个dex文件,需求大的情况下会有很多个dex文件,一个个用dex2jar来反编译,再打开代码分析,很麻烦,所以把全部dex文件一次性反编译出来,很有必要。

1.分成多个dex文件的原因

dex文件,是将项目所需全部的class文件合并且压缩到里面,但是单个dex文件引用的方法总数不能超过65536,所以为了解决这个问题,谷歌推出了multidex技术,将一个apk文件中的dex拆分成多个分主次的dex文件来加载。

为什么是65536?因为一个dex文件中的方法个数采用原生类型short来索引,而short是4个字节,4个字节最大数据存储量是65536。

2.一次性反编译所有dex文件

例如一个app,改成zip解压缩之后,会发现它有很多dex文件:

那一个个反编译dex2jar很麻烦,这里有1个小技巧就是直接反编译全部apk,就会得到所有的代码,该apk文件放在dex2jar的文件夹下。

d2j-dex2jar.bat XXX.apk

五、常见错误

1.dex2jar在2.0版本问题

在实际操作中,不一定会把所有的dex文件都给反编译出来,第一次反编译的时候,时间很短,我就预感不太对,但是不是我的操作有误,百度了半天,也没找出来啥原因,最后还是google出来的,果然还是google强大。

dex2jar在2.0版本是不支持multidex的,如果你是2.0版本的(dex2jar-2.0),那么该版本不支持multidex,换新版本。

新版本(dex-tools-2.1-SNAPSHOT)是支持multidex的,直接运行2中的反编译代码即可出来所有代码。

2.Java heap space问题

不过,运气不好的情况下,会依然出错,依然出不来想要的代码,我就属于那个运气不好的,(/ □ )。

我下载了新版本,运行了代码,依然出错。Exception in thread “main” java.lang.OutOfMemoryError: Java heap space。

初步判断是jvm的原因,这里改一下jvm的运行大小,即可解决该错误。很多地方说是在d2j-dex2jar.bat中改jvm的大小,但是打开后发现改不了。

但是从这个代码里面我们可以看到从d2j_invoke.bat来设置java的环境,所以打开d2j_invoke.bat,修改该jvm大小,我这里改成2048,就不报错了。

六、更强大的逆向工具:jadx

相比之前使用过的反编译工具,功能更强大,使用也更简单,可以不用执行命令,直接拖拽就可以得到反编译后的Java原码,而且是可视化;还可以导出gradle项目;包括去混淆剂也是可以;还有就是菜单栏居然是中文的,你可敢想像;相对于dex2jar 和 jd-gui组合;

七、jadx的优缺点:

在使用过jadx之后觉得jadx相比上面的组合具有如下两个优点: * 可以直接反编译出.java文件 * 查看源码时直接显示资源名称,而不是像jd-gui里显示的资源ID,

Jadx的缺点:有些apk部分源码会对抗jadx,可能导致反编译的代码不完整

apktool+dex2jar+jd-gui一直是一个比较流行的Android反编译组合。代码还原度更高,一定程度上避开有些代码对抗jadx

八、总结

在jadx出现之前,我一般是使用apktool和dex2jar这两个Android反编译工具。

这两个工具也有不同的侧重点:

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3