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.


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.


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 ).


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


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.


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.

1
Zauważ, że IGNORE_EXCEPTIONSrzecz została teraz zmieniona na flagę wiersza poleceń -skip.
Antymon



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.


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.


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/


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


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+.


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

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


5
  • JAD to taki, który działa i jest prosty.

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


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.



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


@ 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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.