Jak zdekompilować cały plik Jar? [Zamknięte]


283

Czy ktoś zna darmowy dekompilator, który może dekompilować cały plik Jar zamiast pojedynczej klasy? Mam problem z podklasami, takimi jak nazwa $ 1. klasa nazwa $ 2. klasa nazwa.klasa


127
Pamiętaj o dwóch innych rzeczach: 1) Samo wspomnienie o dekompilatorze sprawi, że wyjdzie „świętszy niż ty” i dokona oceny wartości twoich motywów, mimo że nie masz pojęcia, co planujesz, więc bądź ostrożny z kim rozmawiasz. 2) Fantazyjny JavaDecompiler zapewni doskonałe odwzorowanie kodu, dobrze zorganizowany i łatwy do odczytania - brakuje tylko komentarzy. Jest zdumiewająco dobry, odzyskując plik JAR, który od dawna utracił źródło wraz z nazwami zmiennych. Oczywiście nie zaciemniamy naszych wewnętrznych plików JAR.
Andrew,

Zobacz także uwagi w poście Wybierz i przetestuj dekompilator Java .
dma_k

8
Wielokrotnie zatrzymywałem się na tym wątku, gdy musiałem studiować, jak ktoś osiągnął coś dla wtyczki Bukkit ... Ten komentarz zawsze wywołuje u mnie uśmiech. Chciałbym móc głosować za każdym razem, gdy wpadnę.
Jane Panda,


Prosty internetowy dekompilator, jeśli nie chcesz pobierać żadnego oprogramowania. javadecompilers.com
Nick Graham

Odpowiedzi:


313

2009: JavaDecompiler może wykonać dobrą robotę ze słoikiem : od 0.2.5 Wyświetlane są wszystkie pliki w plikach JAR.

http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png

Zobacz także pytanie „Jak„ dekompilować ”pliki klas Java?” .

Wygląda na to, że JD-Eclipse nie zmieniło się od końca 2009 roku (patrz Zmiany ).
Dlatego jego integracja z najnowszym Eclipse (3.8, 4.2+) może być problematyczna.

JD-Core jest aktywnie utrzymywany.

Oba są wynikiem fantastycznej pracy Emmanuela Dupuya (użytkownika SO) .


2018: Bardziej nowoczesnym rozwiązaniem, o którym mowa w komentarzach przez Davida Kennedy'ego Araujo :

JetBrains / intellij-community / plugins / java-decompiler / engine

Fernflower jest pierwszym faktycznie działającym dekompilatorem analitycznym dla Javy i prawdopodobnie ogólnie dla języka programowania wysokiego poziomu.

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

Zobacz także Jak dekompilować do plików java intellij pomysł na komendę współpracującą z najnowszą IntelliJ IDEA.


5
fyi, dekompilator Java działa na systemach Windows, Mac i Linux.
yanokwa

4
@AlexS nice :) Następny krok: kontrola wersji ( stackoverflow.com/questions/59561/… ), a następnie ciągła integracja ( stackoverflow.com/questions/130592/... )
VonC

3
Za pomocą dekompilatora Java można otworzyć plik JAR i przejść do opcji Plik, Zapisz wszystkie źródła. Zapisuje wszystkie pliki klas w plikach Java = D
Akira Yamamoto,

2
Pamiętaj, że to także powoduje błędy. Mam klasę ze zmienną Member, która przeniosła ją do parametru funkcji, niszcząc efekt kodu. Uważaj, to cię dopadnie.
CharlesW

1
JD jest dobrym punktem wyjścia, ale nie dekompiluje złożonego kodu. Dobrą alternatywą jest użycie github.com/JetBrains/intellij-community/tree/master/plugins/…
David Kennedy

37

Przede wszystkim warto pamiętać, że wszystkie pliki archiwów Java ( .jar/ .war/ etc ...) są w zasadzie tylko fantazyjnymi .zipplikami z kilkoma dodanymi manifestami i metadanymi.

Po drugie, aby rozwiązać ten problem, osobiście korzystam z kilku narzędzi, które radzą sobie z tym problemem na wszystkich poziomach:

  • Jad + Jadclipse podczas pracy w IDE do dekompilacji.classplików
  • WinRAR , moje ulubione narzędzie do kompresji, natywnie obsługuje archiwa Java (ponownie, patrz pierwszy akapit).
  • Beyond Compare , moje ulubione narzędzie do porównywania, o ile jest poprawnie skonfigurowane, może dokonywać porównań w locie między dowolnym plikiem archiwum, w tymjars. Warto spróbować.

Zaletą wszystkich wyżej wymienionych jest to, że nie muszę trzymać żadnych innych narzędzi zewnętrznych, które zagracają moje środowisko pracy. Wszystko, czego kiedykolwiek będę potrzebować z jednego z tych plików, może być obsługiwane wewnątrz mojego IDE lub różnicowane z innymi plikami natywnie.


lolz, wciąż rozpakowuję rozszerzenia chrome i firefox i zapomniałem, że .jar też są tylko zamkami :)
Carter Cole

36

Jeśli zdarzy ci się mieć zarówno powłokę bash, jak i jad:

JAR=(your jar file name)
unzip -d $JAR.tmp $JAR
pushd $JAR.tmp
for f in `find . -name '*.class'`; do
    jad -d $(dirname $f) -s java -lnc $f
done
popd

Mogę być z tym trochę, ale powinno to działać mniej więcej tak, jak reklamowano. Powinieneś skończyć z $JAR.tmpzawieraniem zdekompilowanych plików.


1
na Ubuntu użyj #! / bin / bash zamiast #! / bin / sh, ponieważ pushd nie działa dla domyślnej powłoki Ubuntu ...
mossplix

1
Korzystam z javaptej podstawowej struktury pętli i działa ona dla mnie.
Chris Prince

25

Miałem spory sukces z narzędziem o nazwie (frustrująco) „ JD: Java Decompiler ”.

Znalazłem to lepiej niż większość dekompilatorów w przypadku klas skompilowanych dla Java 5 i wyższych . Niestety, nadal może mieć pewne czkawki, w przypadku których JAD zwykle by odniósł sukces.


Nie mogłem pobrać wersji JD-GUI dla systemu Windows lub Linux. Czy ten problem wydaje mi się tylko?
mmdemirbas

@JanusTroelsen Usunąłem go. Dziękujemy za powiadomienie. Utrzymujmy odpowiedzi w czystości :)
pramodc84,

@ Zero3: zaktualizowano
Gowtham Gopalakrishnan

11

Coś jak:

jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r

może?


1
Od jakiegoś czasu używałem jad i potrzebowałem szybkiego sposobu na wyodrębnienie i dekompilację całego słoika. Dzięki, to ogromnie pomogło.
Alper Akture

5

Wstaw następujące polecenie do pliku decompile.jar.sh

# Usage: decompile.jar.sh some.jar [-d]

# clean target folders
function clean_target {
  rm -rf $unjar $src $jad_log
}

# clean all debug stuff
function clean_stuff {
  rm -rf $unjar $jad_log
}

# the main function
function work {
  jar=$1
  unjar=`basename $jar.unjar`
  src=`basename $jar.src`
  jad_log=jad.log

  clean_target

  unzip -q $jar -d $unjar
  jad -d $src -ff -r -lnc -o -s java $unjar/**/*.class > $jad_log 2>&1

  if [ ! $debug ]; then
    clean_stuff
  fi

  if [ -d $src ] 
    then
      echo "$jar has been decompiled to $src"
    else
      echo "Got some problems check output or run in debug mode"
  fi
}

function usage {
  echo "This script extract and decompile JAR file"
  echo "Usage: $0 some.jar [-d]"
  echo "    where: some.jar is the target to decompile"
  echo "    use -d for debug mode"
}

# check params
if [ -n "$1" ]
  then
    if [ "$2" == "-d" ]; then
      debug=true
      set -x
    fi
    work $1
  else
    usage
fi
  • chmod + x decomplie.jar.sh // plik wykonywalny
  • ln -s ./decomplie.jar.s / usr / bin / dj

Gotowy do użycia, po prostu wpisz, dj your.jara otrzymasz your.jar.srcfolder ze źródłami. Użyj -dopcji dla trybu debugowania.


Dzięki, ale musiałem zmienić „jad” na „./jad” w linii 23 i uruchomić „bash decompile.jar.sh foo.jar -d”, ponieważ nie chciałem zanieczyszczać folderu bin
Sam

jakiś rekompilator? przekompiluje pliki jad do słoika?
N Jay

2

Plik jar to po prostu plik zip z rozszerzeniem jar. Powinieneś być w stanie rozpakować (winzip) słoik tak jak plik zip.


1

Wydobądź go, a następnie użyj jad przeciwko reż.


Nie sądzę, że możesz po prostu rzucić to na reż. Będziesz musiał podać {dir} / ** / *. Class
Vihung

Wyodrębnij słoik i użyj czegoś takiego jak jad {dir}, właśnie go przetestowałem i nie działa w systemie Windows
systemie

1

Uwaga: to rozwiązanie działa tylko dla użytkowników komputerów Mac i * nix.

Próbowałem też znaleźć Jad bez powodzenia. Moim szybkim rozwiązaniem było pobranie MacJada zawierającego jad. Po pobraniu możesz znaleźć jad w [where-you-download-macjad] / MacJAD / Contents / Resources / jad.

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.