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

时间:2015-05-23 00:11:14

标签: java android xml android-layout android-activity

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

  

第1步:重命名.apk文件

     

使用扩展名.zip重命名.apk文件(例如,让文件   be" demofile.apk"然后重命名后,它变为" demofile.apk.zip")

     

第2步:从apk获取java文件

     

现在在特定文件夹中提取重命名的zip文件,例如let   该文件夹是" demofolder"。现在从链接下载dex2jar   窗口并解压缩文件夹" demofolder"。

     

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

     

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

     

从jd-gui窗口浏览生成的" classes.dex.dex2jar"档案   demofolder,这将通过src名称给出所有类文件。

     

现在从文件菜单中选择"保存所有来源"这会产生一个   zip文件名为" classes_dex2jar.src.zip"包括所有包裹   和java文件。

     

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

     

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

     

第3步:从apk获取xml文件

     

从链接下载apktool和apktool安装并解压缩   文件并将其放在同一个文件夹中(例如" demoxmlfolder")。

     

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

     

现在打开命令提示符并转到存储apktool的目录   (这里" demoxmlfolder")并输入命令" apktool if   框架-res.apk"上面的命令应该导致安装" Framework   ..."现在在命令提示符下输入命令" apktool d filename.apk"   (其中filename是apk文件的名称)这将生成一个文件夹   当前目录中的name filename(此处为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);

2 个答案:

答案 0 :(得分:9)

您可以浏览ShowJava应用程序here的源代码。看起来他正在使用Dex2Jar工具。反编译从BackgroundService开始,所有魔法都发生在一些特殊的Jar类中。我不知道这段代码是来自一个库,还是所有这些代码都是由他创建的。查看ExtractJarDecompileJar方法,而不是很难理解正在发生的事情。

答案 1 :(得分:2)

您需要按照以下步骤操作才能使其正常运行:

  1. dex2jar bitbucket site并下载文件。将jar文件添加到项目中。
  2. 通过DexFileFactory,您可以加载apk,将其转换为dex(loadDexFile)并将其保存到文件(writeDexFile)。
  3. 使用另一个将jar转换为java文件的库,您最终可以阅读内容。我找到了Procyon,看起来很简单。使用InputTypeLoader加载类文件,然后调用Decompiler.decompile()
  4. 当然,您可以在步骤3中使用其他库,但对于第1步和第2步,我还没有找到任何替代方案。