Thursday, June 5, 2014

Modificar archivo class de un jar sin tener el código fuente

Antecedentes


La empresa para la que trabajo realizó una activación en el estadio Omnilife, la cual tomaba fotografías con una "Samsung Galaxy Camera (Jelly Bean 4.1)", esta cámara recibía señal para el "shooting" desde una tablet "Galaxy Tab 3 (Jelly Bean 4.1)". La logística y desarrollo tecnológico lo realizó un proveedor, una de las herramientas que desarrollaron fue un "uploader" en JAVA, el cual conectaba con un pequeño webservice para tener las fotografías en un micrositio. 
El problema se presentó al tener 2 activaciones al mismo tiempo, que se verían reflejadas en 2 micrositios diferentes, por lo que se debía actualizar la ruta del webservice. Esto representaba cambiar un par de lineas de código pero el problema real era no contar con el código fuente, solo con el jar.

Introducción

El archivo JAR no es más que un zip, por lo que podemos consultar su contenido, ver su estructura, imágenes, paquetes, clases (esto último compilado) con tan solo cambiar la extensión de "jar" a "zip".

Solución

Entendiendo esto, lo que debemos hacer es:
  1. Decompilar el JAR.
  2. Guardar clase como ".java"
  3. Modificar las clases
  4. Compilar ".java"
  5. Actualizar ".class"

1.- Decompilar JAR

Una de las mejores herramientas para decompilar es "Java Decompiler" desarrollada por Emmanuel Dupuy, la cual esta disponible en 4 diferentes sabores: GUI (mi elección), Eclipse,  IntelliJ y Live Demo.
  •  Ejecutamos Java Decompiler -> Nos vamos al menú "Archivo" -> Abrir archivo -> Buscamos nuestro JAR. 
2.- Guardar clase

El programa nos muestra el código reconstruido, con esto podemos copiar toda la clase y pegarla en un nuevo archivo de texto nombre "nombreArchivo.java" y guardarlo en la misma ubicación de nuestro archivo JAR.

3.- Modificar clase


Hacemos las modificaciones de código correspondientes en nuestro archivo "java".

4.- Compilar ".java" (jarc command)

Nota: Muy importante, recomiendo colocar en la carpeta "C:\Program Files\Java\jdk1.7.0_XX\bin", los tres archivo: "jar", "java", "class". Ya que el comando "jar.exe" (que veremos en el siguiente punto) crea el archivo, dentro del jar, con la misma ruta de nuestra ubicación física.

   A) Ejecutamos la consola de windows con permisos de administrador.
   B) Nos movemos a la ubicación del "javac.exe" (c:\Program Files\Java\jdk1.7.0_XX\bin)
   C) Corremos el siguiente comando: javac -classpath nombreArchivo.jar nombreArchivo.java

5.- Actualizar ".class" (jar command)

Por último, para actualizar la clase, utilizamos el comando "jar" de java, por lo que:

   A) Ejecutamos el comando: jar uf nombreArchivo.jar nombreArchivo.class

Listo, hemos modificado código de una JAR, sin tener los fuentes.

 Referencias

  • http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html
  • http://docs.oracle.com/javase/tutorial/deployment/jar/update.html