Ingeniería inversa con Java

por:

Ingenieria inversa con Java Extracción del código fuente
La entrada que hoy os traemos, es fruto de una demostración vista en una charla sobre informática a la que asistí el otro día. En la charla se veía lo simple que era realizar ingeniería inversa a cualquier programa Java realizado.

Nuestro programa para la demostración

Para la realización de la demostración, vamos a utilizar un proyecto más o menos complejo, escrito en java que he encontrado en github. El método es válido para cualquier proyecto.
Realizando ingenieria inversa a un proyecto Java

Lo normal cuando nos envían un proyecto java, es que nos manden el .jar para que lo ejecutemos, pero qué pasa si queremos ver cómo esta hecho. Pues que no tenemos el código fuente.

Desempaquetando el .jar

Una de las cosas más curiosas, es que los .jar son un archivo empaquetado, que podemos desempaquetar.
Realizando ingenieria inversa a un proyecto Java

Así que lo que hacemos es cambiar la extensión del archivo de .jar a .zip
Realizando ingenieria inversa a un proyecto Java
Descomprimimos el archivo y tenemos una carpeta con el proyecto. En este caso por ejemplo tenemos acceso a la música del juego, a las librerías que ha usado etc.
Proyecto java descomprimido

Analizando el proyecto

Entre las distintas carpetas que encontramos, debemos ir a com/redomar/game y ahí encontramos todos los archivos del proyecto.

Pero todavía no tenemos la información accesible, por ejemplo si accedemos a Game.class y analizamos el contenido del archivo, vemos que no tenemos el código:
Código de la clase en java

Recuperando el contenido original

En el última paso debemos recuperar la información original del .class, es decir el código fuente escrito en Java.

Para ello nos vamos a esta pagina y subimos el archivo y obtenemos el código fuente:
Recuperando la información original del .jar

Comparando el código fuente

Lo bueno de que el proyecto sea Open Source es que podemos comparar el código extraído por nosotros mismos, con el propio generado por el autor. Aunque el código no está ordenado de igual manera y algunas inicializaciones se han movido de sitio (por las optimizaciones del compilador). Obtenemos un código que seguramente es prácticamente igual al original.
Por ejemplo (a la izquierda el código extraído, a la derecha el original):
Demostración del código decompilado y listo en Java

Como nos indica  en su comentario, hay una interesante herramienta que desconocida, denominada Java Decompiler que realiza todo este proceso de una forma más automatizada y sencilla, consiguiendo extraer una mayor cantidad de información:

Java Decompiler la herramienta para abrir los jar y ver su contenido y codigo java

Espero que este tutorial os haya gustado y si tenéis alguna duda, dejamos los comentario abiertos.

4 comentarios en “Ingeniería inversa con Java”

  1. Raist

    Existen decompiladores online muy efectivos aparte del que comentas en el post. http://www.javadecompilers.com/ tiene una versión rápida que decompila código hasta Java 7 pero también incluye alguno más lento que es capaz de decompilar Java 8 y 9 (aunque no he probado a decompilar nada de Java 9), cosa que el JD-GUI, que recomendaban en otro comentario, es incapaz. Decompila lambda expresiones de forma muy muy satisfactoria. Sólo lo he probado para Java con muy buenos resultados pero tiene bastantes más posibilidades. Muy buena página en mi opinión.

    Buen post!

    Responder
  2. Sanyerman

    Muy buen POST se agradece

    Responder
  3. pavocejudo

    te puedes descargar un programita que descompila los .jar y te saca directamente el archivo .java
    el programa es http://jd.benow.ca/

    Responder

Deja una Respuesta