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

Posted

技术标签:

【中文标题】如何在 Android 中以编程方式反编译 dex 文件?【英文标题】:How can I programmatically decompile dex files within Android? 【发布时间】:2015-08-05 02:48:53 【问题描述】:

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

第 1 步:重命名 .apk 文件

使用扩展名 .zip 重命名 .apk 文件(例如让文件 是“demofile.apk”然后重命名它成为“demofile.apk.zip”)

第 2 步:从 apk 获取 java 文件

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

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

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

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

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

解压那个 zip 文件 (classes_dex2jar.src.zip) 你会得到所有的 应用程序的 java 文件。

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

第 3 步:从 apk 获取 xml 文件

从链接下载 apktool 和 apktool install 并解压 文件并将其放在同一个文件夹中(例如“demoxmlfolder”)。

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

现在打开命令提示符并转到存储 apktool 的目录 (此处为“demoxmlfolder”)并键入命令“apktool if framework-res.apk”上面的命令应该导致“Framework installed ...”现在在命令提示符中键入命令“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);

【问题讨论】:

这将需要 root,因为您无法读取其他进程/应用程序的资源,更不用说将它们的二进制文件作为您自己的应用程序的 uid。只是我的两分钱。 PD:准备好重新实现几个类,Android 的 Java API 不会复制完整的桌面 API 集 @Machinarius,私有应用程序只需要 root。查看play.google.com/store/apps/details?id=com.njlabs.showjava。几个月前我自己搞定了,但 dex2jar 在 Android 上运行速度非常慢。 我完全确定 Android 的安全模型不会让你在没有 root 的情况下这样做。我站得更正。很好地实现了这一目标,恭喜。至于性能增强...这需要专门干预 dex2java 的代码以使其成为多线程等。 你看过这个***.com/questions/1249973/…> 【参考方案1】:

您可以浏览 ShowJava 应用程序here 的源代码。看起来他正在使用 Dex2Jar 工具。反编译从BackgroundService 开始,所有的魔法都发生在一些特殊的 Jar 类中。我不知道这段代码是来自图书馆还是所有这些代码都是由他创建的。看看ExtractJar 和DecompileJar 方法,应该不难理解发生了什么。

【讨论】:

【参考方案2】:

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

    转到dex2jar bitbucket site 并下载文件。将 jar 文件添加到您的项目中。 通过DexFileFactory,您可以加载apk,将其转换为dex(loadDexFile)并保存到文件(writeDexFile)。 使用另一个将 jar 转换为 java 文件的库,您终于可以读取内容了。我找到了Procyon,看起来很简单。使用InputTypeLoader 加载类文件,然后调用Decompiler.decompile()

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

【讨论】:

以上是关于如何在 Android 中以编程方式反编译 dex 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何反编译 android 中 /data/dalvik-cache/arm 下的文件

如何反编译android应用并重新打包

跪求android apk反编译详细教程,本人着实愚笨,看不懂网上滴步骤

Android APK+Dex文件反编译及回编译工具的使用说明

Android APK反编译

android反编译odex文件