Jak „dekompilować” pliki klas Java? [Zamknięte]

556

Jakiego programu mogę użyć do dekompilacji pliku klasy? Czy rzeczywiście otrzymam kod Java, czy to tylko kod asemblera JVM?

Na pytania dotyczące wydajności Java na tej stronie często widzę odpowiedzi osób, które „zdekompilowały” plik klasy Java, aby zobaczyć, w jaki sposób kompilator optymalizuje pewne rzeczy.

Wyrko
źródło
4
Sztukę „dekompilacji” można również traktować jako inżynierię odwrotną. Chociaż czasami, gdy inżynieria odwrotna coś nie zawsze masz dostęp do plików binarnych.
Makach
Nikt nie wspominał bytecodeviewer.com , który może dekompilować do źródła java i kodu bajtowego (dla źródła Java jest oparty na JAD).
Fernando Gonzalez Sanchez

Odpowiedzi:

588

Aktualizacja z lutego 2016 r .:

www.javadecompilers.com wymienia JAD jako:

najpopularniejszy dekompilator Java, ale przede wszystkim w tym wieku. Napisane w C ++, więc bardzo szybko.
Nieaktualne, nieobsługiwane i nie dekompilują poprawnie Java 5 i nowszych

Twój przebieg może się różnić w zależności od najnowszego jdk (7, 8).

Ta sama witryna zawiera listę innych narzędzi.

A javadecompiler, jak zauważył Salvador Valencia w komentarzach (wrzesień 2017 r.), Oferuje SaaS, w którym przesyłasz .classplik do chmury i zwraca on zdekompilowany kod.


Oryginalna odpowiedź: październik 2008 r

  • Ostateczne wydanie JSR 176, określające główne funkcje J2SE 5.0 (Java SE 5), zostało opublikowane 30 września 2004 r.
  • Ostatnia wersja Java obsługiwana przez JAD, słynny dekompilator Java napisany przez pana Pavla Kouznetsova, to JDK 1.3 .
  • Większość dekompilatorów Java, które można dziś pobrać z Internetu, takich jak „DJ Java Decompiler” lub „Cavaj Java Decompiler”, jest obsługiwanych przez JAD: nie mogą wyświetlać źródeł Java 5.

Dekompilator Java (jeszcze inny szybki dekompilator Java) ma:

  • Jawna obsługa dekompilacji i analizy plików „.class” Java 5+ .
  • Miły GUI:

zrzut ekranu

Działa z kompilatorami od JDK 1.1.8 do JDK 1.7.0 i innymi ( Jikes , JRockit itp.).

Zawiera on wersję demonstracyjną online na żywo, która jest w pełni funkcjonalna! Możesz po prostu upuścić plik jar na stronę i zobaczyć zdekompilowany kod źródłowy bez instalowania czegokolwiek.

VonC
źródło
5
+1 Warto wspomnieć, że jest on również modułowy, więc rdzeń (zaimplementowany w C ++) może być wykorzystany w innym miejscu.
Quinn Taylor
1
jd-gui-0.3.3 również dostępne tutaj
płatność
1
W przypadku, gdy jeden zainstalował wtyczkę dekompilatora Eclipse java w Eclipse Juno, a Eclipse zaczął się zawieszać na Marketplace DND Inicjalizacja zmusiła do zabicia całego procesu: usunięcie pliku jd. *. Jar z katalogu wtyczek Eclipse właśnie to naprawiło.
LSerni
4
@Rishi w ten sam sposób, w jaki chronisz swoje IP w dowolnym języku lub na dowolnej platformie - dobrzy prawnicy. DRM to tylko bandaid.
Antimony
1
Teraz oferuje SaaS, w którym przesyłasz plik .class do chmury, i zwraca Ci zdekompilowany kod. Pracowałem dla prostego POJO.
Salvador Valencia,
101

Istnieje kilka dekompilatorów ... Szybkie wyszukiwanie daje:

  1. Procyon : open-source (Apache 2) i aktywnie rozwijany
  2. Krakatau : open-source (GPLv3) i aktywnie rozwijany
  3. CFR : open-source (MIT) i aktywnie rozwijany
  4. JAD
  5. DJ Java Decompiler
  6. Mokka

I wiele więcej.

Tworzą one kod Java. Java zawiera coś, co pozwala zobaczyć kod bajtowy JVM ( javap ).

billjamesdev
źródło
2
Dodam też, że Procyon, CFR, JAD i DJ są dostępne jako usługa internetowa: javadecompilers.com
Andrew Rukin,
javadecompilers.com - bracie ratownika!
MarcoZen
kpdus.com/jad.html to link AD
marcinj
Dzięki @marcinj, znalazłem inny link z linkami do pobrania.
billjamesdev,
51

Aby zobaczyć kod źródłowy Java, sprawdź jakiś dekompilator. Idź szukaj jad .

Jeśli chcesz zobaczyć kody bajtowe , po prostu użyj javap dostarczonego z JDK.

Marko
źródło
5
Zamiast tego poleciłbym jeden z dekompilatorów open source, ponieważ są one aktywnie rozwijane. Zamiast tego użyj Procyon , dekompilatora CFR lub Krakatau (Python).
Janus Troelsen
29

Próbowałem kilku, a Procyon wydawał mi się najlepszy. Jest w trakcie aktywnego rozwoju i obsługuje wiele funkcji najnowszych wersji Java.

Oto inne, których próbowałem:

  • CFR
    • Obiecująca, ale często nieudana dekompilacja metod. Będę miał na to oko. Aktywnie rozwijany również ze wsparciem dla najnowszych funkcji Java.
  • Krakatau
    • Przybiera inne podejście, ponieważ próbuje wyprowadzić równoważny kod Java zamiast próbować zrekonstruować oryginalne źródło, co może poprawić go w przypadku zaciemnionego kodu. Z moich testów było mniej więcej na równi z Procyonem, ale nadal miło było mieć coś innego. Musiałem użyć -skipflagi wiersza polecenia, aby nie poprzestała na błędach. Aktywnie opracowany i, co ciekawe, napisany w języku Python.
  • JD-GUI
  • JAD
    • Działał, ale obsługuje tylko Javę 1.4 i nowsze wersje. Dostępny również jako wtyczka Eclipse . Nie jest już w fazie rozwoju.
bmaupin
źródło
1
Zauważ, że IGNORE_EXCEPTIONSrzecz została teraz zmieniona na flagę wiersza poleceń -skip.
Antymon
14

Procyon zawiera dekompilator. To jest FOSS.

Janus Troelsen
źródło
13

Soot to opcja dla nowszego kodu Java. Przynajmniej ma tę zaletę, że wciąż jest ostatnio utrzymywany ...

Ponadto, Java Decompiler to dekompilator posiadający zarówno samodzielny interfejs GUI, jak i integrację z Eclipse.

Wreszcie, Jdec nie został wspomniany, chociaż nie jest tak dopracowany, jak inne opcje.

Quinn Taylor
źródło
Czy wiesz, jak dekompilować konkretny plik klasy za pomocą Soot? Nie jestem pewien, czy to możliwe ...
Janus Troelsen,
12

JD-GUI jest naprawdę dobry. Możesz po prostu otworzyć plik JAR i przeglądać kod tak, jakbyś pracował na IDE. Dobry towar.

G Kumar
źródło
11

Oto lista dekompilatorów z lutego 2015:

Procyon , open-source, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR , bezpłatny, brak kodu źródłowego, http://www.benf.org/other/cfr/

JD , bezpłatny tylko do użytku niekomercyjnego, http://jd.benow.ca/

Fernflower , open-source, https://github.com/fesh0r/fernflower ,

JAD - podany tutaj tylko z powodów historycznych. Darmowy, brak kodu źródłowego, http://varaneckas.com/jad/ Nieaktualny, nieobsługiwany i nie dekompiluje poprawnie Java 5 i nowszych.

Możesz testować wyżej wymienione dekompilatory online, nie wymaga instalacji i dokonać własnego, wykształconego wyboru.

Dekompilatory Java w chmurze: http://www.javadecompilers.com/

Andrew Rukin
źródło
1
Procyon działa najlepiej !!!!
MarcoZen
10

Istnieje kilka programów, których możesz użyć. Otrzymasz rzeczywisty kod Java, ale czasami kod został zaciemniony, więc metody są nazywane jedną literą lub cyfrą lub losową kombinacją liter i cyfr.

DJ Dekompilator Mocha

Mike Pone
źródło
9

Większość dekompilatorów Java jest oparta na JAD . To świetne narzędzie, ale niestety nie było od dłuższego czasu aktualizowane i nie radzi sobie zbyt dobrze z klasami Java 1.5+. Nie widziałem żadnych narzędzi, które poprawnie obsługiwałyby klasy 1.5+.

John Meagher
źródło
3
proszę bardzo: Właśnie opublikowałem odpowiedź na twoją odpowiedź;) JDK1.5 i więcej obsługiwane!
VonC
„Nie widziałem żadnych narzędzi, które poprawnie obsługiwałyby klasy 1.5+” - Procion, Fernflower, JDCore i CFR (ten obsługuje Java 8!)
Andrew Rukin
6

Spójrz na Cavaj .

Paulo Guedes
źródło
3
To również stosuje się jadpod spodem.
Quinn Taylor,
6

Wszystkie wymienione do tej pory linki JAD wydają się być uszkodzone, więc znalazłem tę stronę. Działa świetnie (przynajmniej dla Linuksa)! Na Ubuntu 11.10 musiałem pobrać wersję statyczną z dowolnego powodu.

http://www.varaneckas.com/jad

kdazzle
źródło
5
  • JAD to taki, który działa i jest prosty.

  • Ponadto, jeśli chcesz zobaczyć metody, użyj javap.

Berlin Brown
źródło
5

Jeśli chcesz zobaczyć, jak kompilator Java robi pewne rzeczy, nie chcesz dekompilacji, potrzebujesz dezasemblacji. Dekompilacja obejmuje przekształcenie kodu bajtowego w źródło Java, co oznacza, że ​​utracono wiele informacji niskiego poziomu, a jeśli zastanawiasz się nad optymalizacją kompilatora, prawdopodobnie są to informacje, którymi jesteś zainteresowany.

W każdym razie zdarzyło mi się napisać dezasembler Java typu open source . W przeciwieństwie do Javap działa to nawet na wysoce patologicznych klasach, więc możesz zobaczyć, co narzędzia zaciemniające robią również na twoich klasach. Może także przeprowadzać dekompilację, choć nie poleciłbym tego.

Antymon
źródło
4

JAD nie działa dla mnie (problem z Ubuntu 11.10), więc posunąłem się naprzód i sopedowałem na JODO . Przynajmniej ma kod źródłowy Open Java i był w stanie poprawnie zdekompilować moją klasę .

Polecam najpierw sprawdzić gałąź „oddziały / ogólny” . Pnie nie są stabilne.

alexander.box
źródło
1
JODO jest sporadycznie utrzymywane, podczas gdy CFR i Procyon są aktywnie rozwijane i mają wsparcie dla JDK 8.
Janus Troelsen,
4

Na platformie IntelliJ IDEA można użyć wtyczki IntelliJ Java Decompiler . Pozwala wyświetlić wszystkie źródła Java podczas procesu debugowania, nawet jeśli nie masz ich wszystkich. Opiera się na słynnych narzędziach JD-GUI .

wprowadź opis zdjęcia tutaj

naXa
źródło
@ NoOP's Czy jesteś robotem? A może po prostu nie zwracasz uwagi na temat recenzji?
naXa
Przepraszam za to, na pierwszy rzut oka wydaje się, że tylko odpowiedź na link. Może powinieneś dodać więcej szczegółów, a Twoja odpowiedź jest zgodna tylko z tytułem pytania, a nie z treścią pytania.
ashiquzzaman33
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem.
Kristijan Iliev
@Chris wypróbowałeś sugerowane rozwiązanie? Czy w ogóle przeczytałeś pytanie ?
naXa
1
@ NoOP przeprasza za bycie niegrzecznym = (Jestem przytłoczony liczbą recenzentów, którzy nie zwracają uwagi.
naXa
1

Za pomocą AndroChef Java Decompiler można dekompilować pliki klas apk, dex, jar i java. To proste i łatwe. AndroChef JD oparty jest na FernFlower . Możesz to ocenić w 10 darmowych zastosowaniach.

AndroChef obsługuje funkcje języka Java, takie jak generyczne, wyliczenia i adnotacje. Według niektórych badań AndroChef Java Decompiler jest w stanie dekompilować 98,04% aplikacji Java wygenerowanych za pomocą tradycyjnych kompilatorów Java - bardzo wysoki wskaźnik odzyskiwania. Jest to proste, ale potężne narzędzie, które umożliwia dekompilację kodu bajtowego Java i Dalvik (DEX, APK) na czytelne źródło Java.

naXa
źródło
1
@Dimitrius, przeczytaj uważnie odpowiedzi podczas przeglądu. Jak wyobrażasz sobie włączenie FernFlower lub AndroChef?
naXa