Categorías: Programacion

Ingeniería inversa con Java


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.

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.

Así que lo que hacemos es cambiar la extensión del archivo de .jar a .zip

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.

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:

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:

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):

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:

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

Jorge Durán

Entusiasta de la tecnología desde los 10 años, desarrollador y creador de varios proyectos de software y autodidacta por naturaleza. Ingeniero Informático por la USAL y .Net backend developer en idealista.

Share
Publicado por
Jorge Durán

Recent Posts

Docker: conceptos principales y tutorial paso a paso

Hoy queremos hablaros de Docker un proyecto que cada día es más usado, porque permite…

3 años hace

Crea diagramas rápidamente usando código

Cada vez estamos más acostumbrados a usar código para generar la infraestructura (IaC), documentar nuestro…

3 años hace

Procesamiento del lenguaje natural con ElasticSearch

Uno de los problemas que se presentan con una mayor frecuencia hoy en día, es…

4 años hace

Elige tecnología clásica y aburrida

Uno de los problemas que solemos tener los programadores, es que nos gusta estar a…

4 años hace

Cómo usar Docker en Windows

Docker es una de las herramientas más usadas por los desarrolladores, sin embargo, usarlo en…

4 años hace

Analiza el coste del uso de JavaScript

Como seguramente sabrás el uso de JavaScript ha crecido exponencialmente en los últimos tiempos, sin…

5 años hace