如何在 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 apk反编译详细教程,本人着实愚笨,看不懂网上滴步骤