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.
Tabla de contenidos
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 Java Decompiler que realiza todo este proceso de una forma más automatizada y sencilla, consiguiendo extraer una mayor cantidad de información:
en su comentario, hay una interesante herramienta que desconocida, denominadaEspero que este tutorial os haya gustado y si tenéis alguna duda, dejamos los comentario abiertos.
4 comentarios en “Ingeniería inversa con Java”
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!
Sanyerman
Muy buen POST se agradece
pavocejudo
te puedes descargar un programita que descompila los .jar y te saca directamente el archivo .java
el programa es http://jd.benow.ca/
SomosBinarios
Muchas gracias por tu comentario, ese programa no lo conocía y tiene muy buena pinta. Voy a ampliar el post con él.
Saludos