Android反编译工具 apktool 、dex2jar、jd |
您所在的位置:网站首页 › apktool打包 › Android反编译工具 apktool 、dex2jar、jd |
一、相关工具下载地址: 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 |