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

article/2025/9/10 2:00:14

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

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();}
}

http://chatgpt.dhexx.cn/article/h4dSaxEP.shtml

相关文章

dex2jar反编译工具2.1版本(下载,使用)

概述: dex2jar是一个反编译apk的工具,可以将dex文件转换成jar文件,去查看源代码(混淆),反之也能将jar文件转换成dex文件 文章诞生原因: 之前使用的是dex2jar2.0版本,当apk的dex文件为…

dex2jar和jd-GUI的下载安装与使用

1、dex2jar 1)dex2jar 描述: dex2jar 是 Android 中的一个反编译工具,它可以将 Android 程序安装包 Apk 文件中的 .dex 文件反编译成一个 .jar 文件,也可以将反编译后的 .jar 文件重新编译成 .dex 文件。 2)下载地址…

dex2jar 和 jd-gui 的安装与使用

将APK直接解压(修改后缀名为.zip,然后解压)后,可以看到目录下包含一个classes.dex文件。如下图所示,是一个APK文件解压后的到的: 若想要阅读该文件的内容,可以使用 dex2jar 和 jd-gui 工具。下面…

新手搭建自己的网站(1)

这里简单介绍一下,新手如何快速搭建起一个简易的网站,老鸟们请忽视; 1.注册域名: 我是在腾讯云注册的,这个在哪注册倒是无所谓,不过我们要的是“域名服务器”,一般推荐你买同一家的。 腾讯云…

自己如何建立网站?

随着互联网的发展,许多人期待着建立自己的网站来创造和推广自己的品牌。但是很多人搁置了网站制作计划,因为他们如何自己如何建立网站、不懂编程。事实上,0基础仍然可以做自己的网站。让我们看看自己如何建立网站! 自己如何建立网…

怎么搭建自己的网站赚钱,个人网站怎么操作

大家好,我是蝶衣王的小编 接触过互联网的应该很多都想过能不能搭建自己的网站赚钱,无论是用来带货,引流,还是做广告都会是一笔不错的收入,而且网站做好之后打理起来简单,后期工作量也是比较小的&#xff0c…

如何搭建自己的网站(二)

一、ubuntu安装数据库 1.安装 安装:sudo apt-get install mysql-server 查看版本:mysql -V 查看运行状态:sudo netstat -tap | grep mysql 2.寻找初始密码 cd /etc/mysqlsudo vim debian.cnf 3.登录 mysql -u debian-sys-maint -pEnter pass…

如何搭建自己的网站别人可以直接访问

前言 最近因为想研究如何让别人访问我的网站信息,通过研究发现有1简便方法,方法1以自己的电脑为本地服务器(这种方式需要保持自己的电脑式中开机状态,对于我个人不划算),方法2租用一个云服务器&#xff08…

从零开始部署到上线:手把手教你搭建属于自己的个人博客网站!

博客:其实博客的正式名称是网络日记,见名知意,是使用特定软件在网络上出版发表和张贴个人文章的人,或者是一种由个人管理不定期更新文章的网站。 现在是互联网逐渐发展,已经出现了很多可以供自己写博客的网站&#xff…

从零开始搭建自己的网站一:整体步骤

之前我的博客内容都是写在CSDN上(博客地址),后来玩过GitHub(博客地址)。今天我们从零开始搭建一个属于自己的博客网站,包括服务器,数据库等。 步骤分别为: 1、购买一台云服务器&…

有了域名,怎么搭建自己的网站?

假设我们拥有域名 某某.com,怎么搭建一个网站,访问 www.某某.com 就可以呈现出内容呢? 你首先要知道的是,网站包括了很多东西,具体如下: 域名(例如 : 某某.com); 服务器…

在自己的电脑上搭建服务器,发布自己的网站(学习之用)

我们平常学习时经常会写一下javaweb程序,我们为了更能逼近现实,就想着自己的javaweb程序发布后,外网的同学能够访问我们的网站,难道我们去买空间,去买域名嘛,其实也没必要,我们只是学习&#xf…

如何搭建一个属于自己的网站?

这几天正巧在搭建一个属于自己的专属网站,在搭建网站的过程中遇见了很多有趣的问题,于是想把这些问题记录下来,分享给大家。服务器,域名以及域名备案我都是在阿里云这个平台完成的,所以接下来都是以阿里云这个平台来操作的。 目录…

如何搭建一个网站

过几年再看,当时写的内容非常幼稚,后面看到这篇文章的童鞋,其实只需要关注这篇文章写的一些流程性内容即可,技术性的东西写的辣眼睛,不少问题的理解是有问题的。文章中的分享的资源链接我也全删了,没啥用—…

如何搭建一个自己的网站-服务器篇

咪哥杂谈 本篇阅读时间约为 5 分钟。 1 前言 上周我们讲了域名篇,当时我在评论区留言,说域名这个东西,注册的好也是能赚钱的。 结果周五下班的时候,阿里云域名公众号发了这么一条信息: 这意味着什么?以明星…

初学者如何快速搭建一个属于自己的网站

对于小白建站而言,没有一个人手把手教你搭建网站,光靠在网上找帖子建站实在是太困难了(比如我),直到有一位学长对我指点一二之后,我才豁然开朗。以下则是我个人最近建站总结出来的一些建议。 现在网站建设主…

如何搭建一个属于自己的网站

想搭建一个属于自己的网站,不知道怎么办?现在都0202年了,任何人都可以在不了解Web开发,设计或编码的情况下建立和设计网站。无论您是想为自己还是为企业创建网站,都可以使用正确的工具和资源轻松地做到这一点。 建设网…

手把手教你搭建一个属于自己的网站-适合零基础小白,文末附网站模板

纯小白向网站搭建教程 写在前面搭建网址基本需求搭建网站主体流程1 域名注册2 租赁并连接服务器2.1 租赁服务器2.2 连接服务器3 配置服务器4 上传网页写在前面 前段时间休息,想着搭一个属于自己的网站,几经尝试终于成功了,希望这篇文章能够帮助到那些编程基础不强,但对搭建…

Form表单提交与Validform验证的那些事

不管是做登录、注册还是实体的添加、修改&#xff0c;我们都会用到表单&#xff0c;并且也会同时用到验证&#xff0c;这里结合Validform验证来详细说明form表单提交的内情。。 1. 引入文件 <link href"css/validate.css" rel"stylesheet" /> <…

来说说validform吧

开始自己写表单验证的时候真的是头疼死了&#xff0c;即使现在有了html5&#xff0c;他可以自动的在表单中写上类似placeholder这样的属性&#xff0c;但是html5的这些属性还具有兼容性。总之还是得自己写一堆js代码来验证的。但是自从发现了这个validform插件以后省去了所有的…