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

Serce z kamienia
źródło
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,
SecureTeam Java Decompiler może to zrobić.
SecureTeam Software,
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.

VonC
źródło
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.

Yuval Adam
źródło
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.

Chris R.
źródło
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.

Adam Paynter
źródło
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?

cybertoast
źródło
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.

merzod
źródło
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.

Cadoo
źródło
1

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

Janchenko
źródło
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.

Joel S.
źródło