java反编译工具_Android的APK文件如何反编译成Java文件

5876ee3cf2740a6c1e71625c11255b3c.png

师兄最近交给了我一任务,就是将Android的APK文件反编译成Java文件,并且还要用python命令给写出来。之前一直卡在了Python命令行这一步了,后来得到一高人指点才爬出了坑。为了整理知识点,故将这些步骤给分享出来,希望对大家也有所帮助!

  1. 将APK文件反编译成Java文件

Android的APK文件其实就相当于是一个zip类型的压缩包,我们一般是先将它解压,然后只需提取出其中的classes.dex即可,其余的一大堆文件我们不管。对了,说到这儿有一点要着重吐槽:网上基本上没有现成的APK文件供你下载。我当时是在手机浏览器里才找到一些APK文件的,我把其中两个APK文件的百度云盘链接也贴出来,大家可以自取。

链接:https://pan.baidu.com/s/1MmABJq7nDgd-cHodau6ECA

提取码:jv27

下图就是其中一个APK文件解压缩后的内部文件示意图:

8adefd14d0315ca4337422d550435c91.png

按照步骤,我们要做的有两步。先将classes.dex文件编译成classes.jar文件,再将classes.jar文件反编译成classes.javasrc,zip文件,即相应java文件的压缩包。这两步手动编译均对应着两个工具包,第一步是需要dex2jar,第二步是需要jd-gui。这两个工具网上好像也挺难找到免费的,我当时也是花钱在CSDN上面下载的,谁让我这人老实心好呢,免费的送给大家。

链接:https://pan.baidu.com/s/1yhHSA7Z8OjCa1RrUZvg6bA

提取码:ozjt

这儿还有一点需要提醒大家:就是我上传的是dex2jar-2.0.zip压缩包文件,大家下载之后记得将dex2jar-2.0.zip改成dex2jar.zip文件然后解压。请不要问:为什么我不直接上传dex2jar.zip文件?我记性这么好肯定是不会说我忘了改这种话的。

解压完之后的dex2jar文件示意图大致如下:

c1eb456d19e17cef497545c70a6b1f4d.png

这个工具包里面发挥作用的就是我圈住的d2j-dex2jar.bat文件,正如图所示:我们得先将上面提到的APK压缩包里面的classes.dex文件放到dex2jar文件里面中来,然后就是在DOS命令窗口下用cmd命令编译了。步骤很简单,就两步,我直接上图:

fd11de5615dde8c0c4e74cacc3553f5f.png

编译速度也很快,最终将会得到classes-dex2jar.jar文件。

接下来就是要将这个classes-dex2jar.jar文件反编译成java文件了。此时就该轮到我们的jd-gui(俗称:京东贵)登场了,该工具包内部文件如下图所示:

a0bb799c592137725ac8f8bbf15c8e0b.png

我打红圈的就是我们要用到的工具,其实就是运行这个exe文件,然后就可以很easy的将classes-dex2jar.jar反编译了。

de78e6019281b6185d7d9e48aa99b7a3.png

如图就是在"File"里打开“open file”,勾选classes-dex2jar.jar即可,得到的java文件的内部类如下图所示:

94d62bcff5577c11368294c326276161.png

当然了你也可以保存成新文件,到这儿就大功告成了。

接下来要解决的就是如何用python语句将这些手动操作给编译出来了。目前解决的是第一步,即:将APK压缩包里面的classes.dex文件提取至dex2jar-2.0目录下面,然后用d2j-dex2jar.bat编译。具体的python语句如下:

import zipfile, os

new_dir_path = "F:dex2jar-2.0"
# 读取压缩文件
azip = zipfile.ZipFile("G:/xinge.zip")
# 返回所有文件夹和文件
zip_list = azip.namelist()
# 新dex文件添加的后缀
suffix = 1
for item in zip_list:
    # 获取当前item文件的前缀名。如aa.txt的前缀名为aa,后缀名为.txt
    item_name = os.path.splitext(item)[0]
    # 获取当前item文件的后缀名
    item_suffix = os.path.splitext(item)[1]
    if item_suffix == ".dex":
        # 将当前文件复制粘贴至new_dir_path目录下面
        azip.extract(item, path=new_dir_path)
        # 如果是要批量处理classes.dex文件,那么下面的os.rename()就有意义了
        # 因为每个APK压缩包里面的dex文件均是classes.dex文件
        old_file_path = os.path.join(new_dir_path, item)
        new_item = item_name + "_"+str(suffix)+item_suffix
        new_file_path = os.path.join(new_dir_path, new_item)
        os.renames(old_file_path, new_file_path)
        # 用python语句执行cmd命令
        command = r"F:Android反编译dex2jar-2.0d2j-jar2dex.bat -f F:Android反编译dex2jar-2.0classes.dex"
        os.system(command)

在这儿有一点需要提醒大家。使用下列cmd命令执行后得到的jar文件的位置不是和手动在DOS窗口编译得到的jar文件的位置一样的。

command = r"F:Android反编译dex2jar-2.0d2j-jar2dex.bat -f F:Android反编译dex2jar-2.0classes.dex"
os.system(command)

我当时就是在这儿陷住了,当时问了一圈人,终于是知道了,用python语句执行cmd命令后得到的jar文件是存放在该py文件的目录那儿,真的是吐血了,希望大家要是碰到此类情况就注意了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值