在实际应用中反编译有下面这几种用途:

1.测试应用的安全性。
这无疑是最重要的,不过难度很高需要专门做安全的人来做才有效果。
2.反编译别的的apk
可以获取别的资源文件。如果要破解代码,那难度就更高了。
3.混淆查看效果
还有一个就是混淆看有没有效果,或者混淆出问题了。

通常的用法是通过AS生成release版本的apk,然后通过apktool反编译获取到资源文件。通过dex2jar将classes.dex(可能存在多个)转化为classes.jar。再通过jd-gui打开jar文件查看反编译的源码。

不过这个过程还是比较麻烦的,有些步骤都是可以自动完成的。通过写自动脚本就可以将这些全部串联起来。

0.目的

这篇博客的主要目的是实战。在Android开发过程中有时候我们需要反编译并查看反编译后的源码。这篇博客的目的就是要实现这个过程的自动化。
我们先来做一下分析。
第一步:定位需要处理的apk文件
一般我们生成带签名的release apk,默认目录是app/release/app-release.apk。
一般路径不太会更改,但apk的名字可能会更改,一般会加上日期。
例如:app/release/app-release-1970-01-01.apk

第二步:生成反编译文件到build目录
为了查看方便,我们不希望我们生成的反编译文件到处乱放。
我们默认放到app/build/decompile/app-release-1970-01-01 这样的目录。
第三步:查看反编译的jar源码
调用jd-gui查看反编译的jar源码

下面我们将根据这个目的介绍这三个反编译工具的使用。其实这三个工具使用都非常简单。自动化执行节约时间才是关键。

1.下载

三个工具都是开源免费的。
apktool:主要的反编译工具,可以将apk包反编译,但不能反编译dex文件。
dex2jar:就是用来反编译dex
jd-gui:java源代码查看工具,用于查看直接查看jar包的java源码。

apktool:https://ibotpeaches.github.io/Apktool/
dex2jar:https://github.com/pxb1988/dex2jar
jd-gui:https://github.com/java-decompiler/jd-gui/releases

2.使用

2.1 apktool的使用

执行下面的命令就会反编译

java -jar apktool.jar d pathTo/app-release.apk -o pathTo/outputPath


生成的目录就是上面这个样子。这里我们主要关心两个目录
res目录:
一个是res目录,这里面有我们的资源文件,通常是盗用别人的图标。
smali目录:
还有一个是smali文件,里面全是.smali结尾的文件。这个其实就是我们的源码。但是是一种叫smali的字节码。当然我们是看不懂的,这时候可以通过dex2jar工具转化成jar。后面会介绍。

一键代码实现

通过java调用shell命令或者cmd命令来执行apktool.jar,因为jar文件是跨平台的,所以命令代码是一样的。
下面的代码只是实现了apktool的最基本命令。

  /*** 调用apktool*/public static void doApkTool() {try {File file=new File("app/build/decompile");if (file.exists()){FileUtils.deleteDirectory(file);}String[] cmd = {"sh", "-c", "java -jar " + apktool + " d " + sourceApk + " -o "+outPath};Process p = Runtime.getRuntime().exec(cmd);//创建实例进程执行命令行代码p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}

用到的变量:

 /*** 反编译工具目录*/private static String toolsHome = "/home/xzh/Android/tools/";/*** apktool.jar 主要用于反编译生成smill文件*/private static String apktool = toolsHome + "apktool.jar";/*** 用于查看反编译的jar包的源码*/private static String jdGui = toolsHome + "jd-gui.jar";/*** dex2jar工具,用于将.dex转化为.jar文件,不过官网推荐是直接从apk生成成.jar*/private static String dex2jar=toolsHome+"dex2jar/d2j-dex2jar.sh";/*** ----------------------------------下面的三个变量需要配置-----------------------------------------------------*//***  一般这个名字是加上日期的,可以当作解压包名*/private static String apkName = "app-release.apk";/*** 需要反编译的Apk包*/private static String sourceApk = "app/release/" + apkName;/*** 反编译文件生成位置*/private static String outPath = "app/build/decompile/"+ apkName.replace(".apk","");


不出意外就会生成这些文件。当然apktool还有打包文件的作用,不过这不主要,我们以实现开头的目的为主。其它功能–help查看一下就知道了,非常的简单。我们的目的是要生成jar文件。可以通过dex2jar工具将smali转成jar。或者将classes.dex转化为jar。不过这里我们没有发现classes.dex文件。因为只有通过直接解压apk才会得到classes.dex文件。

通过直接解压居然可以得到一个和通过apktool反编译差不多的目录。而且有一个classes.dex文件。网上很多的教程都是讲这种直接解压的。 不过,如果我们只是想查看反编译的jar文件。根本就用不着这个apktool工具,也不需要解压。 dex2jar是有办法直接生成反编译的jar的。

2.dex2jar

这个工具才是反编译的工具,因为他提供了非常多的工具。

我们可以看到他提供了非常多的.sh文件,在windows版本下就是.bat文件。可以实现各种转化。不过最有用的还是官网提供的命令:

sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk

通过这个代码就可以直接从apk提取反编译的jar文件。

java代码实现:

    /*** 调用dex2jar*/public static void doDex2Jar() {//  unzipApk();long start = System.currentTimeMillis();System.out.println("开始装换");try {File file=new File(outPath+"/classes.jar");if (file.exists()){FileUtils.deleteQuietly(file);}String[] cmd = {"sh", "-c", " sh " + dex2jar + " -f "+ sourceApk +" -o "+outPath+"/classes.jar >> /dev/null  2>&1  "};Process p = Runtime.getRuntime().exec(cmd);//创建实例进程执行命令行代码p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}long end = System.currentTimeMillis();System.out.println("耗时:"+(end-start)/1000+"秒");}

我们可以通过-o知道输出的文件路径,这里我们设置成app/build/decompile/app-release。

不出意外就会生成classes.jar这个文件。名字是我们自己设定的。
得到了jar文件,就可以通过我们的jd-gui来查看了。

3.jd-gui

使用也非常简单。

java -jar jd-gui.jar pathTo/classes.jar

Java代码实现

/*** 调用jd-gui解析jar包内容*/public static void doJdGui() {try {String[] cmd = {"sh", "-c", "java -jar " + jdGui +" "+outPath+"/classes.jar >> /dev/null  2>&1"};Process p = Runtime.getRuntime().exec(cmd);//创建实例进程执行命令行代码p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}


不出意外的话,就会自动弹出jd-gui的窗口。可以查看反编译的源码,这里我开启了混淆,如果不开启混淆的话,源码差不多都是可以直接看到的,所以说不混淆是非常危险的。
最后贴出完整的代码:

package com.xzh.utils;import org.apache.commons.io.FileUtils;import java.io.File;/*** 反编译工具类*/
public class ReverseUtil {/*** 反编译工具目录*/private static String toolsHome = "/home/xzh/Android/tools/";/*** apktool.jar 主要用于反编译生成smill文件*/private static String apktool = toolsHome + "apktool.jar";/*** 用于查看反编译的jar包的源码*/private static String jdGui = toolsHome + "jd-gui.jar";/*** dex2jar工具,用于将.dex转化为.jar文件,不过官网推荐是直接从apk生成成.jar*/private static String dex2jar=toolsHome+"dex2jar/d2j-dex2jar.sh";/*** ----------------------------------下面的三个变量需要配置-----------------------------------------------------*//***  一般这个名字是加上日期的,可以当作解压包名*/private static String apkName = "app-release.apk";/*** 需要反编译的Apk包*/private static String sourceApk = "app/release/" + apkName;/*** 反编译文件生成位置*/private static String outPath = "app/build/decompile/"+ apkName.replace(".apk","");/*** 解压Apk*/public static void unzipApk() {try {//必须添加>> /dev/null  2>&1不然卡死//覆盖也会卡死 需要删除File file = new File(outPath);if (file.exists()) {FileUtils.deleteDirectory(file);}String[] cmd = {"sh", "-c", "unzip -d " + outPath + " " + sourceApk + " >> /dev/null  2>&1"};Process p = Runtime.getRuntime().exec(cmd);//创建实例进程执行命令行代码p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}System.out.println("解压完成");}/*** 调用apktool*/public static void doApkTool() {try {File file=new File("app/build/decompile");if (file.exists()){FileUtils.deleteDirectory(file);}String[] cmd = {"sh", "-c", "java -jar " + apktool + " d " + sourceApk + " -o "+outPath};Process p = Runtime.getRuntime().exec(cmd);//创建实例进程执行命令行代码p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}/*** 调用dex2jar*/public static void doDex2Jar() {//  unzipApk();long start = System.currentTimeMillis();System.out.println("开始装换");try {File file=new File(outPath+"/classes.jar");if (file.exists()){FileUtils.deleteQuietly(file);}String[] cmd = {"sh", "-c", " sh " + dex2jar + " -f "+ sourceApk +" -o "+outPath+"/classes.jar >> /dev/null  2>&1  "};Process p = Runtime.getRuntime().exec(cmd);//创建实例进程执行命令行代码p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}long end = System.currentTimeMillis();System.out.println("耗时:"+(end-start)/1000+"秒");}/*** 调用jd-gui解析jar包内容*/public static void doJdGui() {try {String[] cmd = {"sh", "-c", "java -jar " + jdGui +" "+outPath+"/classes.jar >> /dev/null  2>&1"};Process p = Runtime.getRuntime().exec(cmd);//创建实例进程执行命令行代码p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {//通过dex2jar直接获取apk的classes.jar文件//ReverseUtil.doApkTool();// ReverseUtil.doDex2Jar();//查看源码ReverseUtil.doJdGui();}
}

Android反编译apktool,dex2jar和jd-gui的使用和一键反编译查看apk相关推荐

  1. Android 反编译 apktool+dex2jar+jd-gui

    前言 ApkTool 下载 使用 dex2jar 下载 使用 jd-gui 前言 反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平. 该 ...

  2. 【Android 安全】DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar | enjarify | jd-gui | jadx )

    文章目录 一.apktool 1.apktool 简介 2.直接解压 3.使用 apktool 反编译 4.使用 apktool 重新打包 二.dex2jar 1.dex2jar 简介 2.dex2j ...

  3. Android APK反编译 apktool使用教程

    下载apktool:https://ibotpeaches.github.io/Apktool/install/ 根据文档操作下载,命名等 工具介绍: apktool 作用:主要查看res文件下xml ...

  4. 2021 Android APK反编译 apktool使用教程

    欢迎交流.微信公众号:一休日记. 目录 前言: 工具介绍: 新版本apktool用法: Smali2JavaUI 前言: 最近我在使用Android Studio混淆打包release版本,打包是否成 ...

  5. 如何查看apk安装包源代码??Android反编译apk,解包,打包,签名一体化实测 ,修改图片音频软件名称版本号等入门

    首先下载反编译工具包 下载地址 链接:  https://zly520.lanzoui.com/ibtuxhf7rab 一.反编译工具介绍 首先 如果你想改动图片音频之类的,见末尾! 1.apktoo ...

  6. 反编译工具 dex2jar

    dex文件反编译工具dex2jar,下载dex2jar工具 下载地址:官网: https://sourceforge.net/projects/dex2jar/?source=typ_redirect ...

  7. 超详细!apk安装包快速反编译,多种反编译及失败的解决方案(包含classes.dex的反编译,新增加快速反编译)

    如要转载,请贴出原地址:https://blog.csdn.net/Nobody_else_/article/details/83996441 众所周知,我们开发所用的手机App安装包都是apk文件, ...

  8. 【Android 逆向】Android 逆向工具 ( Apktool | IDA | Python )

    文章目录 一.Apktool 二.IDA 三.Python 一.Apktool 参考 [Android 安全]DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar ...

  9. Mac安装apktool/dex2jar/jd-gui逆向工具

    1.下载地址       Apktool:http://ibotpeaches.github.io/Apktool/install/       dex2jar: https://github.com ...

  10. 一键反编译安卓apk文件

    说明 自己集成了市面上几个常用android反编译工具.方便大家研究app的代码,仅用于学习目的. 使用方式: 使用 一键反编译: apkfull <apk_file> <app_n ...

最新文章

  1. Linux USB 驱动开发(一)—— USB设备基础概念
  2. Crawler:基于urllib+requests库+伪装浏览器实现爬取国内知名招聘网站,上海地区与机器学习有关的招聘信息(2018.4.30之前)并保存在csv文件内
  3. html按钮控制播放暂停,外部按钮控制video视频的播放暂停
  4. eclipse启动不了并报错Java was started but exit with code 13 问题解决
  5. FFmpeg Maintainer赵军:FFmpeg关键组件与硬件加速
  6. 操作系统 --- 使用套接字进行网络通信
  7. 有这样的开发,产品经理跪着帮你擦汗!
  8. 团队的远程管理_不管理远程团队的7种方法
  9. SAP License:特殊采购类型-寄售及其结算
  10. 一年多的远程办公带给我的感悟
  11. linux之loop设备
  12. 主动FTP vs. 被动FTP 权威解释
  13. Exchange Server 2013文档系列之四: Exchange Server 2013在Windows 2008 R2下部署
  14. python爬虫毕业论文大纲参考模板_毕业论文提纲参考模板
  15. CMMB 全国各地市频率规划表
  16. 计算机管理模块无法初始化单元,win7组策略提示MMC无法初始化管理单元怎么办...
  17. yum clean all 是什么意思
  18. upset图形如何理解
  19. c语言 查看系统内存,C/C++获取系统物理内存大小
  20. 2018-2019赛季的前一半

热门文章

  1. 【教程】Edraw Max(亿图图示):使用免费模板和示例快速制作发票
  2. 51单片机中外部中断使用示例(Protues仿真)
  3. vlfeat工具包的MATLAB安装
  4. 使用软件或Python编程时EIS拟合的底层逻辑(EIS拟合的原理/过程)
  5. 物联网LoRa系列-25:LoRa终端--LoRaWAN协议简介与LoRa WAN终端软件选择
  6. 软件测试思维导图大全
  7. Web大学生网页作业成品~美食餐饮网站设计与实现(HTML+CSS+JavaScript)
  8. Da黄蜂vep云课堂6.05录屏截屏提取为mp4教程
  9. Charles使用详解(For macOS)
  10. CSDN账号注销的问题:手机号注册的CSDN号是可以注销的