如何在 Android 中以编程方式反编译 dex 文件?

我知道如何使用基于Windows的系统将apk文件提取到类中,如下所示:

步骤 1:重命名.apk文件

重命名扩展名为 .zip 的.apk文件(例如,让文件为“demofile.apk”,然后在重命名后将其变为“demofile.apk.zip”)

步骤2:从apk获取java文件

现在将重命名的zip文件提取到特定文件夹中,例如,让该文件夹成为“demofolder”。现在从Windows链接下载dex2jar,并将该zip文件解压缩到文件夹“demofolder”中。

现在打开命令提示符并转到在上一步中创建的文件夹,然后键入命令“dex2jar classes.dex”,然后按Enter键。这将在同一文件夹中生成“classes.dex.dex2jar”文件。

现在从链接下载java反编译器并解压缩它并启动(双击)jd-gui.exe

从jd-gui窗口中浏览demofolder中生成的“classes.dex.dex2jar”文件,这将按src名称提供所有类文件。

现在,从“文件”菜单中选择“保存所有源”,这将生成一个名为“classes_dex2jar.src.zip”的zip文件,其中包含所有包和java文件。

提取该zip文件(classes_dex2jar.src.zip),您将获得该应用程序的所有java文件。

上述步骤将生成java文件,但要获取xml文件,请执行以下步骤。

步骤3:从apk获取xml文件

从链接下载apktool和apktool安装,并提取两个文件并将其放在同一个文件夹中(例如“demoxmlfolder”)。

将.apk文件放在同一个文件夹中(即 demoxmlfolder)

现在打开命令提示符并转到存储apktool的目录(此处为“demoxmlfolder”),然后键入命令“apktool if framework-res.apk”上面的命令应该导致“框架已安装...”现在在命令提示符下键入命令“apktool d filename.apk”(其中文件名是apk文件的名称),这将在当前目录(此处为demoxmlfolder)中生成一个名称文件名的文件夹,其中所有xml文件都将存储在res\layout文件夹中。

但是我想知道如何在Android中以编程方式完成上述操作。因此,我的Android应用程序可以简单地提取另一个应用程序的dex文件。我不介意dex文件是否被复制到手机上的其他位置,然后反编译(这只是我卡住的反编译)

原则如下,我可以访问每个应用程序的dex,只是不知道如何在Android中反编译它。

任何帮助都会太棒了。

final PackageManager pm = getPackageManager();
                PackageInfo packageInfo = null;
                try {
                    packageInfo = pm.getPackageInfo("PACKAGE NAME HERE", PackageManager.GET_META_DATA);
                } catch (NameNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                File file = new File(packageInfo.applicationInfo.sourceDir);
                Uri uri = Uri.fromFile(file);

答案 1

您可以在此处浏览ShowJava应用程序的源代码。看起来他正在使用Dex2Jar工具。反编译从后台服务开始,所有的魔术都发生在一些特殊的Jar类中。我不知道这些代码是否来自库,或者所有这些代码是否都是由他创建的。看看 ExtractJarDecompileJar 方法,就不应该很难理解发生了什么。


答案 2

您需要遵循一些步骤才能使其正常工作:

  1. 到达dex2jar bitbucket网站并下载文件。将 jar 文件添加到项目中。
  2. 通过DexFileFactory,您可以加载apk,将其转换为dex()并将其保存到文件()。loadDexFilewriteDexFile
  3. 使用另一个将jars转换为java文件的库,您最终可以读取内容。我发现了Procyon,这似乎很简单。使用 一个加载类文件,然后调用 。InputTypeLoaderDecompiler.decompile()

当然,您可以在步骤3中使用其他库,但对于步骤1和2,我还没有找到任何替代方法。


推荐