¿Cómo descompilar un archivo Jar completo? [cerrado]

283

¿Alguien sabe de un descompilador gratuito que pueda descompilar un archivo Jar completo en lugar de una sola clase? Tengo un problema con las subclases como name $ 1.class name $ 2.class name.class

Corazón de piedra
fuente
127
Recuerde dos cosas más: 1) La simple mención de un descompilador hará que salga el "más santo que usted" y emitirá juicios de valor sobre sus motivos a pesar de no tener idea de cuál es su uso planificado, así que tenga cuidado con quién habla. 2) El sofisticado JavaDecompiler le dará una excelente versión del código, bien diseñado y fácil de leer, solo faltan comentarios. Es asombrosamente bueno, recuperar un archivo JAR que durante mucho tiempo perdió la fuente completa con nombres de variables. Por supuesto, no ofuscamos nuestros archivos JAR internos.
Andrew
Véanse también las observaciones en la publicación Elija y pruebe el descompilador de Java .
dma_k
8
Me he detenido en este hilo tantas veces cuando necesitaba estudiar cómo alguien logró algo para un complemento de Bukkit ... Ese comentario siempre me deja con una sonrisa. Desearía poder votarlo cada vez que pase.
Jane Panda
SecureTeam Java Decompiler puede hacer eso.
Software SecureTeam el
Descompilador simple en línea si no desea descargar ningún software. javadecompilers.com
Nick Graham

Respuestas:

313

2009: JavaDecompiler puede hacer un buen trabajo con un jar: desde 0.2.5, se muestran todos los archivos, en archivos JAR.

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

Consulte también la pregunta "¿Cómo" descompilo "los archivos de clase Java? .

Sin embargo, el JD-Eclipse no parece haber cambiado desde finales de 2009 (ver Cambios ).
Por lo tanto, su integración con el último Eclipse (3.8, 4.2+) podría ser problemática.

JD-Core se mantiene activamente.

Ambos son el resultado del fantástico trabajo de (usuario SO) Emmanuel Dupuy .


2018: una opción más moderna, mencionada en los comentarios de David Kennedy Araujo :

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

Fernflower es el primer descompilador analítico realmente funcional para Java y probablemente para un lenguaje de programación de alto nivel en general.

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\

Consulte también Cómo descompilar en archivos java intellij idea para un comando que funciona con IntelliJ IDEA reciente.

VonC
fuente
55
para su información, el descompilador de Java funciona en Windows, Mac y Linux.
Yanokwa
44
@AlexS nice :) Siguiente paso: control de versiones ( stackoverflow.com/questions/59561/… ) Y luego integración continua ( stackoverflow.com/questions/130592/… )
VonC
3
Con Java Decompiler puede abrir el archivo JAR e ir a Archivo, Guardar todas las fuentes. Guarda todos los archivos de clase en archivos java = D
Akira Yamamoto
2
Recuerde que también comete errores. Tengo una clase con una variable Miembro y la movió al parámetro de una función, destruyendo el efecto del código. Cuidado, te atrapará.
CharlesW
1
JD es un buen punto de partida, pero no puede descompilar el código complejo. Una buena alternativa es usar github.com/JetBrains/intellij-community/tree/master/plugins/…
David Kennedy
37

En primer lugar, vale la pena recordar que todos los archivos de Java ( .jar/ .war/ etc ...) son básicamente .ziparchivos sofisticados , con algunos manifiestos y metadatos agregados.

En segundo lugar, para abordar este problema, personalmente uso varias herramientas que manejan este problema en todos los niveles:

  • Jad + Jadclipse mientras trabajaba en IDE para descompilar.classarchivos
  • WinRAR , mi herramienta de compresión favorita es compatible de forma nativa con archivos Java (nuevamente, vea el primer párrafo).
  • Más allá de Comparar , mi herramienta de diferencias favorita, cuando está configurada correctamente, puede hacer comparaciones sobre la marcha entre cualquier archivo, inclusojars. Vale la pena intentarlo.

La ventaja de todo lo mencionado anteriormente es que no necesito tener ninguna otra herramienta externa que satura mi entorno de trabajo. Todo lo que pueda necesitar de uno de esos archivos se puede manejar dentro de mi IDE o diferir con otros archivos de forma nativa.

Yuval Adam
fuente
lolz sigo descomprimiendo las extensiones de Chrome y Firefox y olvidé que .jar también son solo cremalleras :)
Carter Cole
36

Si tiene un bash shell y 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

Podría estar un poco, muy poco con eso, pero debería funcionar más o menos como se anuncia. Debería terminar $JAR.tmpconteniendo sus archivos descompilados.

Chris R
fuente
1
en ubuntu usar # / bin / bash en lugar de # / bin / sh becausw pushd no trabaja para el valor por defecto de Ubuntu concha ...!
mossplix
1
Estoy usando javapdentro de esta estructura básica de bucle, y está funcionando para mí.
Chris Prince
25

He tenido un éxito razonable con una herramienta llamada (frustrantemente) " JD: Java Decompiler ".

Lo he encontrado mejor que la mayoría de los descompiladores cuando se trata de clases compiladas para Java 5 y superior . Desafortunadamente, todavía puede tener algunos contratiempos donde JAD normalmente tendría éxito.

Adam Paynter
fuente
No pude descargar la versión para Windows o Linux de JD-GUI. ¿Este problema solo me parece a mí?
mmdemirbas
@JanusTroelsen Lo eliminé. Gracias por notificarlo. Vamos a mantener limpias las respuestas :)
pramodc84
@ Zero3: actualizado
Gowtham Gopalakrishnan
11

Algo como:

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

¿tal vez?

cybertoast
fuente
1
He usado jad por un tiempo y necesitaba una forma rápida de extraer y descompilar un frasco entero. Gracias, esto ayudó inmensamente.
Alper Akture
5

Inserte lo siguiente en 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 // ejecutable
  • ln -s ./decomplie.jar.s / usr / bin / dj

Listo para usar, solo escriba dj your.jary obtendrá una your.jar.srccarpeta con las fuentes. Use la -dopción para el modo de depuración.

merzod
fuente
Gracias, pero tuve que cambiar "jad" a "./jad" en la línea 23 y ejecutar "bash decompile.jar.sh foo.jar -d" ya que no quería contaminar mi carpeta bin
Sam
cualquier recompilador? recompila archivos jad en jar?
N Jay
2

Un archivo jar es solo un archivo zip con extensión jar. Debería poder descomprimir (winzip) un jar como un archivo zip.

Cadoo
fuente
1

Lo extrae y luego usa jad contra el directorio.

Yanchenko
fuente
No creo que puedas ejecutarlo contra el directorio. Tendrá que especificar {dir} / ** / *. Class
Vihung
Extraiga el frasco y use algo como jad {dir}, lo acabo de probar y no funciona en Windows
Jaime Hablutzel
1

Nota: Esta solución solo funciona para usuarios de Mac y * nix.

También intenté encontrar a Jad sin suerte. Mi solución rápida fue descargar MacJad que contiene jad. Una vez que lo haya descargado, puede encontrar jad en [where-you-download-macjad] / MacJAD / Contents / Resources / jad.

Joel S
fuente