¿Cómo “descompilo” los archivos de clase de Java? [cerrado]

556

¿Qué programa puedo usar para descompilar un archivo de clase? ¿Obtendré realmente el código Java, o es solo el código de ensamblaje JVM?

En las preguntas de rendimiento de Java en este sitio, a menudo veo respuestas de personas que han "descompilado" el archivo de clase de Java para ver cómo el compilador optimiza ciertas cosas.

Dormir
fuente
44
El arte de "descompilar" también puede considerarse como ingeniería inversa. Aunque a veces, cuando realizas ingeniería inversa, no siempre tienes acceso a los archivos binarios.
Makach
Nadie mencionó bytecodeviewer.com , que puede descompilarse en fuente java y en código byte (porque la fuente java se basa en JAD).
Fernando González Sánchez

Respuestas:

588

Actualización de febrero de 2016:

www.javadecompilers.com enumera a JAD como:

el descompilador de Java más popular, pero principalmente solo de esta época. Escrito en C ++, muy rápido.
Desactualizado, no compatible y no se descompila correctamente Java 5 y versiones posteriores

Por lo tanto, su kilometraje puede variar con jdk reciente (7, 8).

El mismo sitio enumera otras herramientas.

Y javadecompiler, como señaló Salvador Valencia en los comentarios (septiembre de 2017), ofrece un SaaS donde carga el .classarchivo en la nube y le devuelve el código descompilado.


Respuesta original: octubre de 2008

  • El lanzamiento final de JSR 176, que define las características principales de J2SE 5.0 (Java SE 5), se publicó el 30 de septiembre de 2004.
  • La última versión de Java compatible con JAD, el famoso descompilador de Java escrito por el Sr. Pavel Kouznetsov, es JDK 1.3 .
  • La mayoría de los descompiladores de Java que se pueden descargar hoy desde Internet, como "DJ Java Decompiler" o "Cavaj Java Decompiler", funcionan con JAD: no pueden mostrar fuentes Java 5.

Java Decompiler (Sin embargo, otro descompilador Fast Java) tiene:

  • Soporte explícito para descompilar y analizar archivos Java 5+ ".class".
  • Una buena GUI:

captura de pantalla

Funciona con compiladores desde JDK 1.1.8 hasta JDK 1.7.0, y otros ( Jikes , JRockit , etc.).

Cuenta con una versión de demostración en vivo en línea que es realmente totalmente funcional. Simplemente puede soltar un archivo jar en la página y ver el código fuente descompilado sin instalar nada.

VonC
fuente
55
+1 Vale la pena mencionar que también está modularizado, por lo que el núcleo (implementado en C ++) se puede aprovechar en otro lugar.
Quinn Taylor,
1
jd-gui-0.3.3 también disponible aquí
entretenimiento el
1
En caso de que uno instaló el complemento de descompilador Java Eclipse en Eclipse Juno, y Eclipse comenzó a colgar en Marketplace DND Initialization forzando a matar todo el proceso: eliminar el jd. *. Jar del directorio de complementos de Eclipse lo arregló por mí.
LSerni
44
@Rishi de la misma manera que protege su IP en cualquier idioma o plataforma: buenos abogados. DRM es solo una curita.
Antimonio
1
Ahora ofrece SaaS donde carga el archivo .class a la nube y le devuelve el código descompilado. Trabajó para un POJO simple.
Salvador Valencia
101

Hay algunos descompiladores por ahí ... Una búsqueda rápida produce:

  1. Procyon : código abierto (Apache 2) y desarrollado activamente
  2. Krakatau : código abierto (GPLv3) y desarrollado activamente
  3. CFR : código abierto (MIT) y desarrollado activamente
  4. JAD
  5. DJ Java Decompiler
  6. Moca

Y muchos más.

Estos producen código Java. Java viene con algo que le permite ver el código de bytes JVM ( javap ).

billjamesdev
fuente
2
También puedo agregar que Procyon, CFR, JAD y DJ están disponibles como un servicio web: javadecompilers.com
Andrew Rukin
javadecompilers.com - hermano salvavidas!
MarcoZen
kpdus.com/jad.html es un enlace AD
marcinj
Gracias @marcinj, encontré otro enlace que tiene enlaces para descargarlo.
billjamesdev
51

Para ver el código fuente de Java, consulte algún descompilador. Ir a buscar a jad .

Si desea ver los códigos de bytes, simplemente use javap que viene con el JDK.

Marko
fuente
55
En su lugar, recomendaría uno de los descompiladores de código abierto, ya que se desarrollan activamente. Utilice Procyon , el descompilador CFR o Krakatau (Python) en su lugar.
Janus Troelsen
29

Probé varios, y Procyon parecía funcionar mejor para mí. Está en desarrollo activo y admite muchas características de las últimas versiones de Java.

Estos son los otros que probé:

  • CFR
    • Método de descompilación prometedor, pero a menudo fallido. Estaré pendiente de esto. También desarrollado activamente con soporte para las últimas características de Java.
  • Krakatau
    • Adopta un enfoque diferente en el sentido de que intenta generar un código Java equivalente en lugar de intentar reconstruir la fuente original, lo que tiene el potencial de mejorarlo para el código ofuscado. Según mis pruebas, estuvo aproximadamente a la par con Procyon, pero aún así es bueno tener algo diferente. Tuve que usar el -skipindicador de línea de comandos para que no se detuviera en los errores. Desarrollado activamente, y curiosamente está escrito en Python.
  • JD-GUI
  • JAD
    • Funcionó, pero solo es compatible con Java 1.4 y versiones inferiores. También disponible como complemento de Eclipse . Ya no está en desarrollo.
bmaupin
fuente
1
Tenga en cuenta que la IGNORE_EXCEPTIONScosa ahora se ha cambiado a la bandera de línea de comando -skip.
Antimonio
14

Procyon incluye un descompilador. Es FOSS.

Janus Troelsen
fuente
13

Hollín es una opción para el código Java más nuevo. Al menos tiene la ventaja de que aún se mantiene recientemente ...

Además, Java Decompiler es un descompilador con una GUI independiente y una integración de Eclipse.

Por último, no se ha mencionado a Jdec , aunque no está tan pulido como otras opciones.

Quinn Taylor
fuente
¿Sabes cómo descompilar un archivo de clase concreto con Soot? No estoy seguro de que sea posible ...
Janus Troelsen
12

JD-GUI es realmente bueno. Simplemente puede abrir un archivo JAR y examinar el código como si estuviera trabajando en un IDE. Buen material.

G Kumar
fuente
11

Aquí hay una lista de descompiladores a partir de febrero de 2015:

Procyon , de código abierto, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR , gratis, sin código fuente disponible, http://www.benf.org/other/cfr/

JD , gratis solo para uso no comercial, http://jd.benow.ca/

Fernflower , de código abierto, https://github.com/fesh0r/fernflower ,

JAD : dado aquí solo por razones históricas. Gratis, sin código fuente disponible, http://varaneckas.com/jad/ Desactualizado, no compatible y no descompila correctamente Java 5 y versiones posteriores.

Puede probar los descompiladores mencionados anteriormente en línea, no requiere instalación y hacer su propia elección informada.

Descompiladores de Java en la nube: http://www.javadecompilers.com/

Andrew Rukin
fuente
1
Procyon funciona mejor !!!!
MarcoZen
10

Hay algunos programas que puedes usar. Obtendrá el código Java real, pero a veces el código se habrá ofuscado, por lo que los métodos se nombran con una letra o número o una combinación aleatoria de letras y números.

DJ Decompiler Mocha

Mike Pone
fuente
9

La mayoría de los descompiladores para Java se basan en JAD . Es una gran herramienta, pero desafortunadamente no se ha actualizado por un tiempo y no maneja muy bien las clases de Java 1.5+. No he visto ninguna herramienta que maneje adecuadamente 1.5+ clases.

John Meagher
fuente
3
Aquí tienes: acabo de publicar una respuesta a tu respuesta;) JDK1.5 y más compatible!
VonC
"No he visto ninguna herramienta que maneje adecuadamente 1.5+ clases" - Procion, Fernflower, JDCore y CFR (¡esta maneja Java 8!)
Andrew Rukin
6

Echa un vistazo a cavaj .

Paulo Guedes
fuente
3
Eso también se usa jaddebajo.
Quinn Taylor
6

Todos los enlaces JAD enumerados hasta ahora parecen estar rotos, así que encontré este sitio. ¡Funciona muy bien (al menos para Linux)! En Ubuntu 11.10 tuve que descargar el estático por cualquier razón.

http://www.varaneckas.com/jad

kdazzle
fuente
5
  • JAD es uno que funciona y es simple.

  • Además, si solo desea ver los métodos, use javap.

Berlin Brown
fuente
5

Si desea ver cómo el compilador de Java hace ciertas cosas, no desea la descompilación, desea el desmontaje. La descompilación implica transformar el bytecode en fuente Java, lo que significa que se pierde mucha información de bajo nivel, y si se está preguntando acerca de la optimización del compilador, esta es probablemente la información que le interesa.

De todos modos, resultó que escribí un desensamblador Java de código abierto . A diferencia de Javap, esto funciona incluso en clases altamente patológicas, por lo que puede ver qué herramientas de ofuscación también están haciendo en sus clases. También puede descompilar, aunque no lo recomendaría.

Antimonio
fuente
4

JAD no funciona para mí (problema de Ubuntu 11.10), así que avancé y me metí en JODO . Al menos tiene código fuente Open Java y ha podido descompilar mi clase correctamente.

Recomiendo revisar la rama 'sucursales / genérico' primero. Los troncos no son estables.

alexander.box
fuente
1
JODO se mantiene esporádicamente mientras que CFR y Procyon se desarrollan activamente y tienen soporte para JDK 8.
Janus Troelsen
4

En la plataforma IntelliJ IDEA puede usar el Decompiler IntelliJ Plugin de Java . Le permite mostrar todas las fuentes de Java durante su proceso de depuración, incluso si no las tiene todas. Se basa en las famosas herramientas JD-GUI .

ingrese la descripción de la imagen aquí

naXa
fuente
@ NoOP's ¿Eres un robot? ¿O simplemente no prestas atención a un tema de revisión?
naXa
Lo siento, a primera vista parece que solo el enlace responde. Tal vez debería agregar más detalles y su respuesta solo cumpla con el título de la pregunta, no con el contenido de la pregunta.
ashiquzzaman33
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
Kristijan Iliev
@ Chris, ¿has probado la solución sugerida? ¿Has leído la pregunta ?
naXa
1
@ NoOP lamenta ser grosero = (Estoy abrumado por la cantidad de revisores que no prestan atención.
naXa
1

Con AndroChef Java Decompiler puedes descompilar archivos de clase apk, dex, jar y java. Es simple y fácil. AndroChef JD está basado en FernFlower . Puede evaluarlo en 10 usos gratuitos.

AndroChef admite características del lenguaje Java como genéricos, enumeraciones y anotaciones. Según algunos estudios, AndroChef Java Decompiler puede descompilar el 98.04% de las aplicaciones Java generadas con compiladores Java tradicionales, una tasa de recuperación muy alta. Es una herramienta simple pero poderosa que le permite descompilar el código de bytes de Java y Dalvik (DEX, APK) en una fuente legible de Java.

naXa
fuente
1
@Dimitrius, lea atentamente las respuestas durante una revisión. ¿Cómo te imaginas incluir un FernFlower o AndroChef aquí?
naXa