Comment décompiler un fichier Jar entier? [fermé]


283

Quelqu'un connaît-il un décompilateur gratuit qui peut décompiler un fichier Jar entier au lieu d'une seule classe? J'ai un problème avec les sous-classes comme le nom $ 1.class name $ 2.class name.class


127
Rappelez-vous deux autres choses: 1) La simple mention d'un décompilateur fera ressortir le "plus saint que vous" et portera un jugement de valeur sur vos motivations, même s'il n'a aucune idée de votre utilisation prévue, alors faites attention à qui vous parlez. 2) Le fantaisie JavaDecompiler vous donnera un excellent rendu du code, bien présenté et facile à lire - ne manquant que des commentaires. Il est incroyablement bon, récupérant un fichier JAR qui avait perdu depuis longtemps la source complète avec les noms de variables. Bien sûr, nous n'obscurcissons pas nos fichiers JAR internes.
Andrew

Voir aussi les remarques dans le post Choisir et tester le décompilateur java .
dma_k

8
Je me suis arrêté tellement de fois sur ce sujet quand j'ai eu besoin d'étudier comment quelqu'un avait accompli quelque chose pour un plugin Bukkit ... Ce commentaire me laisse toujours le sourire. Je souhaite pouvoir le voter à chaque fois que je passe.
Jane Panda du


Décompilateur en ligne simple si vous ne souhaitez télécharger aucun logiciel. javadecompilers.com
Nick Graham

Réponses:


313

2009: JavaDecompiler peut faire du bon travail avec un pot: depuis 0.2.5, tous les fichiers, dans les fichiers JAR, sont affichés.

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

Voir aussi la question "Comment" décompiler "les fichiers de classe Java?" .

Le JD-Eclipse ne semble cependant pas avoir changé depuis fin 2009 (voir Modifications ).
Son intégration avec la dernière Eclipse (3.8, 4.2+) pourrait donc être problématique.

JD-Core est activement maintenu.

Les deux sont le résultat du travail fantastique d' Emmanuel Dupuy (utilisateur SO) .


2018: Une option plus moderne, mentionnée dans les commentaires de David Kennedy Araujo :

JetBrains / Intellij-Community / Plugins / Java-Decompiler / Engine

Fernflower est le premier décompilateur analytique réellement fonctionnel pour Java et probablement pour un langage de programmation de haut niveau en général.

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\

Voir aussi Comment décompiler en fichiers java intellij idea pour une commande fonctionnant avec IntelliJ IDEA récent.


5
fyi, java decompiler fonctionne sur windows, mac et linux.
yanokwa

4
@AlexS nice :) Étape suivante: contrôle de version ( stackoverflow.com/questions/59561/… ) Et ensuite intégration continue ( stackoverflow.com/questions/130592/… )
VonC

3
Avec Java Decompiler, vous pouvez ouvrir le fichier JAR et aller dans Fichier, Enregistrer toutes les sources. Il enregistre tous les fichiers de classe dans des fichiers java = D
Akira Yamamoto

2
N'oubliez pas que cela fait aussi des erreurs. J'ai une classe avec une variable Member et elle l'a déplacée vers le paramètre d'une fonction, détruisant l'effet du code. Attention, cela vous amènera.
CharlesW

1
JD est un bon point de départ mais ne parvient pas à décompiler du code complexe. Une bonne alternative est d'utiliser github.com/JetBrains/intellij-community/tree/master/plugins/…
David Kennedy

37

Tout d'abord, il convient de se rappeler que tous les fichiers d'archive Java ( .jar/ .war/ etc ...) sont tous essentiellement des .zipfichiers fantaisie , avec quelques manifestes et métadonnées ajoutés.

Deuxièmement, pour résoudre ce problème, j'utilise personnellement plusieurs outils qui traitent ce problème à tous les niveaux:

  • Jad + Jadclipse tout en travaillant dans IDE pour décompiler des.classfichiers
  • WinRAR , mon outil de compression préféré prend nativement en charge les archives Java (encore une fois, voir le premier paragraphe).
  • Au-delà de Compare , mon outil de diff préféré, lorsqu'il est correctement configuré, peut faire des comparaisons à la volée entre n'importe quel fichier d'archive, y comprisjars. Cela vaut bien un essai.

L'avantage de tout ce qui précède, c'est que je n'ai pas besoin de tenir d'autre outil externe qui encombre mon environnement de travail. Tout ce dont j'aurai besoin à partir de l'un de ces fichiers peut être géré dans mon IDE ou différent avec d'autres fichiers nativement.


lolz je continue de décompresser les extensions chrome et firefox et j'ai oublié que .jar ne sont que des zips aussi :)
Carter Cole

36

S'il vous arrive d'avoir à la fois un shell bash et un 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

Je pourrais être un tout petit peu, mais cela devrait fonctionner plus ou moins comme annoncé. Vous devriez finir par $JAR.tmpcontenir vos fichiers décompilés.


1
sur ubuntu, utilisez #! / bin / bash au lieu de #! / bin / sh parce que pushd ne fonctionne pas pour le shell ubuntu par défaut ...
mossplix

1
J'utilise javapdans cette structure de boucle de base, et cela fonctionne pour moi.
Chris Prince

25

J'ai eu un succès raisonnable avec un outil nommé (frustrant) " JD: Java Decompiler ".

Je l'ai trouvé meilleur que la plupart des décompilateurs lorsqu'il s'agit de classes compilées pour Java 5 et supérieur . Malheureusement, il peut encore y avoir quelques hoquets où JAD réussirait normalement.


Je n'ai pas pu télécharger la version Windows ou Linux de JD-GUI. Ce problème ne m'apparaît-il que?
mmdemirbas

@JanusTroelsen Je l'ai supprimé. Merci de l'avoir notifié. Permet de garder les réponses propres :)
pramodc84

@ Zero3: mise à jour
Gowtham Gopalakrishnan

11

Quelque chose comme:

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

peut être?


1
J'ai utilisé jad pendant un certain temps et j'avais besoin d'un moyen rapide d'extraire et de décompiler un pot entier. Merci, cela a énormément aidé.
Alper Akture

5

Insérez ce qui suit dans 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 // exécutable
  • ln -s ./decomplie.jar.s / usr / bin / dj

Prêt à l'emploi, tapez simplement dj your.jaret vous obtiendrez un your.jar.srcdossier avec les sources. Utilisez l' -doption pour le mode de débogage.


Merci, mais j'ai dû changer "jad" en "./jad" sur la ligne 23 et exécuter "bash decompile.jar.sh foo.jar -d" car je ne voulais pas polluer mon dossier bin
Sam

un recompilateur? recompile les fichiers jad dans un bocal?
N Jay

2

Un fichier jar est juste un fichier zip avec l'extension jar. Vous devriez pouvoir décompresser (winzip) un bocal comme un fichier zip.


1

Vous l'extrayez puis utilisez jad contre le dir.


Je ne pense pas que vous puissiez simplement l'exécuter contre le dir. Vous devrez spécifier {dir} / ** / *. Class
Vihung

Extraire le pot et utiliser quelque chose comme jad {dir}, je viens de le tester et ne fonctionne pas sur Windows
Jaime Hablutzel

1

Remarque: Cette solution ne fonctionne que pour les utilisateurs Mac et * nix.

J'ai aussi essayé de trouver Jad sans chance. Ma solution rapide a été de télécharger MacJad qui contient du jad. Une fois que vous l'avez téléchargé, vous pouvez trouver jad dans [où-vous-avez-téléchargé-macjad] / MacJAD / Contents / Resources / jad.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.