关于android:将DEX反编译成Java源代码

decompiling DEX into Java sourcecode

如何将Android DEX(VM字节码)文件分解成相应的Java源代码?


这很容易

获取这些工具:

1)dex2jar将dex文件转换为jar文件

2)JD GUI查看JAR中的Java文件

由于dex2jar进行了一些优化,所以源代码非常可读。

程序:

下面是如何反编译的过程:

步骤1:

将test_apk-debug.apk中的classes.dex转换为test_apk-debug_dex2jar.jar

1
2
d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
d2j-dex2jar.sh -f -o output_jar.jar dex_to_decompile.dex

Note: In the Windows machines all the .sh scripts are replaced by .bat scripts

DEX2JAR文档

第2步:

在jd-gui中打开罐子

The decompiled source


为了稍微澄清一下,根据您想要完成的任务,这里有两条主要的路径:

将Dalvik bytecode(DEX)反编译成可读Java源代码。正如弗雷德提到的,使用dex2jar和jd gui可以很容易地做到这一点。结果源对于读取和理解应用程序的功能很有用,但可能不会生成100%可用的代码。换句话说,您可以阅读源代码,但不能真正修改和重新打包它。请注意,如果源代码被proguard混淆了,那么产生的源代码将更加难以解开。

另一个主要的选择是将字节码分解为smali,这是一种专门为此目的而设计的汇编语言。我发现最简单的方法是使用apktool。一旦安装了apktool,就可以将其指向apk文件,然后为应用程序中包含的每个类返回一个smali文件。您可以通过从新Java源生成SMALI来完全读取和修改SMALI或甚至替换类(这样做),您可以用Javac编译您的.java源到.class文件,然后用Android的DX编译器转换.class文件到.DEX文件,然后使用BasMali(SMALI反汇编程序)将.DEX转换成.SML文件,如描述的那样。在这个问题上。这里可能有捷径)。完成后,您可以轻松地用apktool再次打包apk备份。请注意,apktool不会对生成的apk进行签名,因此您需要像其他Android应用程序一样处理这一问题。

如果你选择Smali路线,你可能想试试apk studio,它是一个自动执行上述步骤的IDE,帮助你解压和重新编译apk并将其安装到设备上。

简而言之,您的选择几乎可以分解成Java,它更可读,但可能不可逆,或者分解为SMALI,它更难阅读,但更灵活地进行修改和重新打包修改后的应用程序。你选择哪种方法取决于你想要达到的目标。

最后,大胆的建议也是值得注意的。它是将DEX和.APK文件转换为Java.class文件的重定向工具,以便可以使用典型的Java静态分析工具进行分析。


我真的建议你到这里来:https://github.com/jesusfreke/smali

它提供了baksmali,这是一个最优秀的DEX文件逆向工程工具。它是由杰苏斯弗雷克制作的,他为Android制作了著名的ROM。


弗雷德答案的更完整版本:

手动方式

首先,您需要一个工具将dex上的所有(编译的)类提取到一个jar中。有一个叫dex2jar,是中国学生做的。

然后,您可以使用JDGUI将JAR上的类解压缩为源代码。结果源应该是可读的,因为dex2jar应用了一些优化。

自动方式

你可以使用apktool。它将自动提取所有类(.dex、资源(.asrc),然后将二进制XML转换为可读XML,还将为您分解类。反汇编总是比反编译更强大,尤其是贾斯被职业警卫搞糊涂了!

只需告诉apktool将apk解码到一个目录中,然后修改您想要的,最后把它编码回一个apk。这就是全部。

重要事项:apktool分解。它不能反编译。生成的代码不是Java源代码。但是如果你熟悉茉莉花,你应该能够阅读它,甚至编辑它。如果您想要Java源代码,请使用手动方式。


有时,当使用dex2jarapktool时,代码会被破坏,尤其是在循环中。为了避免这一点,使用JADX,它将Dalvik字节码分解成Java源代码,而不首先创建EDCOX1×5 /EDCOX1×6的文件作为EDCOX1×3(ApKooToE使用DEX2JAR I)。它也是开源的,正在积极开发中。它甚至还有一个图形用户界面,供图形用户界面爱好者使用。试试看!


我用过

  • dex2jar+jd图形用户界面
  • javadecompilers.com
  • 使变为异化
  • apktool工具
  • 但没有人能比得上谷歌自己的工具。

    1)安卓工作室2.x:构建>分析APKenter image description here

    2)Android Studio 3.0版:配置文件或调试APK氧化镁氧化镁


    因为没有人提到这个,所以还有一个工具:DED主页

    安装方法和一些说明:安装。

    它被用于一项非常有趣的顶级市场应用程序安全性研究中(如果你好奇的话,这并不真正相关):一项关于Android应用程序安全性的调查


    一旦下载了APK文件,就需要执行以下步骤来获得可编辑的Java代码/文档。

  • 将您的apk文件转换为zip(开始下载时,不要使用"save"选项,只需使用"save as"并将扩展名提到.zip),这样做可以避免apktool…
  • 提取zip文件,在那里可以找到somefilename.dex。所以现在我们需要转换dex->.class
  • 要做到这一点,您需要"dex2jar"(您可以从http://code.google.com/p/dex2jar/下载它,提取后,在命令提示中您必须提到,例如,[d:dex2jar-0.09>dex2jar somefilename.dex](请记住,somefilename.dex必须位于保存dex2jar的同一文件夹中。)
  • 从http://www.viralpatel.net/blogs/download/jad/jad.zip下载JAD并提取它。提取后,您可以看到两个文件,如"jad.exe"和"readme.txt"(有时可能会出现"jad.txt"而不是"jad.exe",因此只需将其扩展名重命名为.exe即可运行)
  • 最后,在命令提示符中,你必须提到[D:JAD> JAD-SjavaYouFiNeNe.class ],它将把你的类文件解析成可编辑的Java文档。

  • Android逆向工程是可能的. 按照以下步骤从APK文件中获取.java文件。

    第1步。使用dex2jar

    • 从.apk文件生成.jar文件
    • 指挥部:dex2jar sampleApp.apk

    第2步。使用jd-gui解压.jar

    • 它会对.class文件进行反编译,也就是说,我们会从APK中得到混淆。


    使用dedexer,可以将.dex文件分解为dalvik字节码(.ddx)。

    据我所知,对Java进行反编译是不可能的。你可以在这里读到达尔维克字节码。


    最近Debian有python包androguard

    1
    2
    3
    4
    5
    6
    7
    8
    Description-en: full Python tool to play with Android files
     Androguard is a full Python tool to play with Android files.
      * DEX, ODEX
      * APK
      * Android's binary xml
      * Android resources
      * Disassemble DEX/ODEX bytecodes
      * Decompiler for DEX/ODEX files

    安装相应的软件包:

    1
    sudo apt-get install androguard python-networkx

    反编译DEX文件:

    1
    $ androdd -i classes.dex -o ./dir-for-output

    从apk+反编译中提取classes.dex

    1
    $ androdd -i app.apk -o ./dir-for-output

    APK文件不再是Java存档(jar),您可以通过以下方式从存档中提取文件:

    1
    $ unzip app.apk -d ./dir-for-output


    自从这些答案中的大部分被公布以来,已经发生了很大的变化。现在,有很多使用GUI的简单工具,如:

    1
    2
    3
    APK Easy Tool for Windows (GUI tool, friendly)
    Bytecode Viewer - APK/Java Reverse Engineering Suite
    URET Android Reverser Toolkit

    找到它们的最佳位置是在xda开发人员论坛上。


    因为Dheeraj Bhaskar的答案和许多年前一样古老。

    以下是我最新的(2019年)答案:

    主逻辑

    dexjava sourcecode目前有两种解决方案:

    • One Step:直接将dex转换为java sourcecode
    • Two Step:先把dex转换成jar,再把jar转换成java sourcecode

    一步解决方案:dex直接到java sourcecode。工具

    • JADX

    过程

  • 下载jadx-0.9.0.zip,解压,在bin文件夹中可以看到命令行jadx或gui版本jadx-gui,双击运行gui版本:jadx-gui
  • 氧化镁

  • 打开dex文件
  • 氧化镁

    然后可以显示Java源代码:

    >。</P></p>
<li><wyn>File</wyn>-><wyn>save as gradle project</wyn>。</li>
<p><P><img src=

    1
    2
    3
    4
    5
    ?  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub8825612.dex
    dex2jar com.huili.readingclub8825612.dex -> ./com.huili.readingclub8825612-dex2jar.jar
    ?  v3.4.8 ll
    -rw-------  1 crifan  staff   9.5M  3 21 10:00 com.huili.readingclub8825612-dex2jar.jar
    -rw-------  1 crifan  staff   8.4M  3 19 14:04 com.huili.readingclub8825612.dex

    号步骤2:jarjava sourcecode。工具

    • JD-gui:最流行,但是many代码会反编译错误
    • CRF:很流行,minor代码会反编译错误
    • procyon:流行,no代码反编译错误
      • 基于Procyon的图形用户界面工具
        • 卢伊滕:
        • 字节码查看器
    • 其他
      • 克拉卡图
      • 蕨类植物
      • 老的:安德罗切夫
      • 等。

    过程

    在这里演示EDCOX1 34将JAR转换成Java源代码:

    下载procyon-decompiler-0.5.34.jar

    然后使用语法:

    埃多克斯1〔36〕

    例子:

    埃多克斯1〔37〕

    使用编辑器vscode打开导出的源代码,如下所示:

    >。</P>结论<P>转换正确性:<wyn>jadx</wyn>><wyn>Procyon</wyn>><wyn>CRF</wyn>><wyn>JD-GUI</wyn></P><P>推荐用途:(一步解决方案)<wyn>jadx</wyn>。</P><P>更详细的解释请参考我的在线中文电子书:安全应用的安全和破解</P></p>
<hr><P>您可以尝试JADX(http://bBask.org/MSTROBEL/PROYON/WIKI/JAVA %20RealPurror),这是DEX反编译的完美工具。</P><P>是的,它也可以在线(my:0))新网站:http://www.javaedcompilers.com/apk/</P></p>
<hr><P>这可以通过以下五个步骤完成:</P><P>这个gem会自动为您做这些事情,甚至安装所需的工具。</P></p>
<li>将APK文件转换为zip</li>
<li>解压缩文件</li>
<li>从中提取classes.dex</li>
<li>使用dex to jar将classes.dex转换为jar文件</li>
<li>使用JADX GUI打开JAR文件作为Java源代码</li>
<div class=


    对Android应用程序进行反编译的最简单方法是从PlayStore下载名为ShowJava的应用程序。只需从应用程序列表中选择需要反编译的应用程序。有三种不同的解压器可以用来解压应用程序,即-

    CFR 0.110, JaDX 0.6.1 or FernFlower (analytical decompiler) .


    如果您不想下载dex2jar,那么只需使用apk_grabberpython脚本将任何apk解压成jar文件即可。然后你用jd-gui阅读它们。