Heim >Java >JavaBase >So dekompilieren Sie Java

So dekompilieren Sie Java

尚
Original
2019-12-07 15:06:078897Durchsuche

So dekompilieren Sie Java

Der Prozess der Dekompilierung ist genau das Gegenteil der Kompilierung, bei der die kompilierte Programmiersprache in ihren unkompilierten Zustand zurückversetzt wird, also der Quellcode der Programmiersprache ermittelt wird. Es geht darum, die Sprache, die die Maschine verstehen kann, in die Sprache umzuwandeln, die der Programmierer verstehen kann. Dekompilierung in der Java-Sprache bezieht sich im Allgemeinen auf die Konvertierung von Klassendateien in Java-Dateien.

Häufig verwendete Java-Dekompilierungstools

In diesem Artikel werden hauptsächlich vier Java-Dekompilierungstools vorgestellt: javap, jad und cfr sowie das visuelle Dekompilierungstool JD-GUI

JAVAP

Javap ist ein Tool, das mit JDK geliefert wird. Es kann den Code dekompilieren und den vom Java-Compiler generierten Bytecode anzeigen. Der größte Unterschied zwischen Javap und den beiden anderen Dekompilierungstools besteht darin, dass die von ihm generierten Dateien keine Java-Dateien sind und nicht so leicht zu verstehen sind wie die von den beiden anderen Tools generierten Codes. Nehmen wir als Beispiel einen einfachen Code. Wenn wir beispielsweise analysieren möchten, wie Switch in Java 7 String unterstützt, können wir zunächst den folgenden Quellcode kompilieren und übergeben:

public class switchDemoString {
    public static void main(String[] args) {
        String str = "world";
        switch (str) {
            case "hello":
                System.out.println("hello");
                break;
            case "world":
                System.out.println("world");
                break;
            default:
                break;
        }
    }
}

Führen Sie Folgendes aus zwei Befehle:

javac Decompilation.java
javap -c Decompilation.class

Der generierte Code lautet wie folgt:

Compiled from "Decompilation.java"
public class Decompilation {
  public Decompilation();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #16                 // String world
       2: astore_1
       3: aload_1
       4: dup
       5: astore_2
       6: invokevirtual #18                 // Method java/lang/String.hashCode:()I
       9: lookupswitch  { // 2
              99162322: 36
             113318802: 48
               default: 82
          }
      36: aload_2
      37: ldc           #24                 // String hello
      39: invokevirtual #26                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      42: ifne          60
      45: goto          82
      48: aload_2
      49: ldc           #16                 // String world
      51: invokevirtual #26                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      54: ifne          71
      57: goto          82
      60: getstatic     #30                 // Field java/lang/System.out:Ljava/io/PrintStream;
      63: ldc           #24                 // String hello
      65: invokevirtual #36                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      68: goto          82
      71: getstatic     #30                 // Field java/lang/System.out:Ljava/io/PrintStream;
      74: ldc           #16                 // String world
      76: invokevirtual #36                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      79: goto          82
      82: return
}

javap dekompiliert den Bytecode nicht in eine Java-Datei, sondern generiert einen Bytecode, den wir verstehen können. Tatsächlich sind die von Javap generierten Dateien immer noch Bytecodes, aber Programmierer können sie etwas besser verstehen. Wenn Sie über Bytecode-Kenntnisse verfügen, können Sie den obigen Code trotzdem verstehen. Tatsächlich geht es darum, String in Hashcode umzuwandeln und dann zu vergleichen.

JAD

JAD ist ein relativ gutes Dekompilierungstool. Solange Sie ein Ausführungstool herunterladen, können Sie Klassendateien dekompilieren. Immer noch der obige Quellcode, der Inhalt nach der Dekompilierung mit Jad ist wie folgt:

Befehl: jad.exe Decompilation.class generiert eine Decompilation.jad-Datei

Das Ergebnis der JAD-Dekompilierung ist wie folgt folgt:

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Decompilation.java

package com.yveshe;

import java.io.PrintStream;

public class Decompilation
{

    public Decompilation()
    {
    }

    public static void main(String args[])
    {
        String str = "world";
        String s;
        switch((s = str).hashCode())
        {
        default:
            break;

        case 99162322: 
            if(s.equals("hello"))
                System.out.println("hello");
            break;

        case 113318802: 
            if(s.equals("world"))
                System.out.println("world");
            break;
        }
    }
}

Sehen Sie sich den obigen Code an. Ist das nicht der Standard-Java-Quellcode? Dies zeigt deutlich, dass der ursprüngliche String-Schalter über die Methoden equal() und hashCode() implementiert wird.

CFR

JAD ist sehr nützlich, aber leider wurde es schon lange nicht mehr aktualisiert, sodass ich nur ein neues Tool verwenden kann, um es zu ersetzen Eine gute Wahl, im Vergleich zu JAD ist seine Syntax vielleicht etwas komplizierter, aber glücklicherweise kann er verwendet werden.

CFR wird moderne Java-Funktionen dekompilieren – Java 8 Lambdas (Java in Java und frühere Versionen Beta 103) , Java 7 String wurde dekompiliert, aber CFR ist vollständig in Java 6 geschrieben.

Es wird empfohlen, die Datei Decompilation.class manuell über den Befehl javac Decompilation.java zu kompilieren und zu generieren und sie dann zu testen.

Das Ergebnis der erfolgreichen Dekompilierung ist wie folgt:

/*
 * Decompiled with CFR 0_125.
 */
package com.yveshe;

import java.io.PrintStream;

public class Decompilation {
    public static void main(String[] args) {
        String str;
        String s = str = "world";
        switch (s.hashCode()) {
            default: {
                break;
            }
            case 99162322: {
                if (!s.equals("hello")) break;
                System.out.println("hello");
                break;
            }
            case 113318802: {
                if (!s.equals("world")) break;
                System.out.println("world");
            }
        }
    }
}

Im Vergleich zu Jad hat CFR viele Parameter und es ist immer noch derselbe Code. Wenn wir den folgenden Befehl verwenden, lautet das Ausgabeergebnis different:
E :CRF>java -jar cfr_0_125.jar Decompilation.class

/*
 * Decompiled with CFR 0_125.
 */
package com.yveshe;

import java.io.PrintStream;

public class Decompilation {
    public static void main(String[] args) {
        String str;
        String s = str = "world";
        switch (s.hashCode()) {
            default: {
                break;
            }
            case 99162322: {
                if (!s.equals("hello")) break;
                System.out.println("hello");
                break;
            }
            case 113318802: {
                if (!s.equals("world")) break;
                System.out.println("world");
            }
        }
    }
}

--decodestringswitch bedeutet, die Details der Switch-Unterstützungszeichenfolge zu dekodieren.

Ähnliche sind --decodeenumswitch, --decodefinally, --decodelambdas usw.

--decodelambdas kann Lambda-Ausdrücke dekompilieren.

JD-GUI

JD-GUI ist ein in C++ entwickeltes Java-Dekompilierungstool, das von Pavel Kouznetsov entwickelt wurde und die Plattformen Windows, Linux und Apple Mac OS unterstützt. Und stellt das Plug-in JD-Eclipse unter der Eclipse-Plattform bereit. JD-GUI basiert auf der Open-Source-Lizenz GPLv3 und ist für den persönlichen Gebrauch völlig kostenlos. Die Hauptaufgabe von JD-GUI besteht darin, visuelle Operationen bereitzustellen. Sie können Dateien direkt in das Fenster ziehen. Das Rendering erfolgt wie folgt:

So dekompilieren Sie Java

JadClipse

Installieren Sie das Jad-Plugin in Eclipse. Beachten Sie, dass hier das Jad-Plugin installiert wird, nicht das Jd-Plugin~

Erforderliche Ressourcen: net.sf.jadclipse_3.3.0 .jar-Plug-in-JAR und JAD.exe-Dekompilierungssoftware (am Ende des Artikels finden Sie eine Download-Adresse)

Die Download-Adresse von JadClipse dient zum Herunterladen des JAR-Pakets des Plug-ins von der offiziellen Website , und platzieren Sie dann das JAR-Paket im Plugins-Verzeichnis von Eclipse; öffnen Sie Eclipse->Window->Preferences->. Zu diesem Zeitpunkt werden Sie feststellen, dass es eine weitere JadClipse-Option als zuvor gibt wie unten gezeigt:

So dekompilieren Sie Java

So dekompilieren Sie JavaNachdem die Grundkonfiguration abgeschlossen ist, können wir die Standardöffnungsmethode für Klassendateien festlegen:

Eclipse->Fenster->Einstellungen->Allgemein->Editoren->Dateizuordnungen Wir können sehen, dass es zwei Möglichkeiten gibt, Klassendateien zu öffnen. Stellen Sie zunächst den Klassendatei-Viewer ein, der mit JadClipse und Eclipse geliefert wird hier, und JadClipse ist die Standardeinstellung.

Alle Konfigurationen sind abgeschlossen. Wählen Sie die Klasse aus, die Sie anzeigen möchten, und drücken Sie F3, um den Quellcode anzuzeigen. Setzen Sie ihn einfach auf die Standardeinstellung .

Mehr Weitere Java-Kenntnisse finden Sie in der Spalte

Java Basic Tutorial

.

Das obige ist der detaillierte Inhalt vonSo dekompilieren Sie Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn