ProGuard es una libreria hecha en Java que nos permite optimizar y ofuscar (dificultar la vision) del codigo java una ves que este esté compilado. Optimiza el ByteCode al eliminar lineas de codigo que no se utilizan, cambia de nombre las clases, campos y metodos con nombres cortos haciendo el codigo casi indescifrable.
Mas informacion en la pagina del proyecto en ingles : http://proguard.sourceforge.net/
Basta de teoria y vamos a la practica, ¿que necesitamos?
1. La libreria ProGuard, la ultima version estable es la 4.5.1, la puedes descargar desde aqui.
Comencemos.
1. Una vez que te bajaste la libreria ProGuard, en la carpeta LIB encontraras los archivos:
- proguard.jar : esta es la libreria que hace el trabajo de optimizacion y ofuscacion ademas de otras cosillas.
- proguardgui.jar : esta aplicación nos sirve para utilizar la libreria de una manera grafica (GUI)
- retrace.jar : esta libreria hace lo opuesto a proguard.jar
2. Una vez que compilamos nuestra aplicacion desde netbeans u otro IDE, copiamos el JAR a una carpeta del disco duro para poder trabajar mejor.
Para poder apreciar mejor como funciona el ProGuard, nuestro proyecto de prueba, contiene adrede "lineas de codigo innecesarias" entre variables y metodos, podras verlas cuando abras el proyecto desde netbeans y analices el codigo.
3. Ejecutamos el archivo ProGuardgui.jar, este nos muestra una interfaz sencilla y bastante intuitiva
5. La opción que ahora nos toca es Shrinking (encoger) como se ve en la imagen aqui tenemos mas opciones cada quien experimenta para que sirve cada una.
Para este ejemplo, solamente habilitamos la opcion Print Usage que nos permite guardar en un archivo las lineas de codigo que seran eliminadas porque no las utilizamos en el proyecto, entonces escogemos el lugar donde guardar el archivo, para este ejemplo, llamado "eliminados.txt"
7. En la opcion de Optimizacion, no realizaremos ningun cambio esta vez.
8. En la opcion de Information, se elige si se trata de una aplicacion para celular o no, tambien se especifica el tratamiento que tendran las lineas de codigo y los errores que se encuentren.
Para este ejemplo, dejamos todo como esta.
9. Finalmente nos toca la opcion Process, en esta opcion, tenemos tres alternativas
- View Configuration, presionando este boton podemos ver en codigo java la configuracion con la cual sera optimizado/ofuscado nuestro JAR
- Save Configuration, como su nombre lo dice nos permite Guardar una configuracion para poder utilizar en otro proyecto en cualquier momento y no realizar todos los pasos de nuevo
- Process, comienza el procesado del codigo...
Presionamos Process para terminar.
Dependiendo del tamaño de nuestra aplicación y de la PC que tengamos, se tardara un tiempo (no mucho) en procesar las lineas de codigo.
01 package ProgdPrueba; 02 /** 03 * @web http://jc-mouse.blogspot.com/ 04 * @author Mouse 05 */ 06 public class cesar { 07 08 private String tabla = "abcdefghijklmnopqrstuvwxy1234567890@.,;:-+*/=()[]{}"; 09 private String cadena = "soy una cadena que no sirve para nada"; 10 11 public cesar(){ 12 } 13 14 public String Encriptar(String t, int key){ 15 String texto = LimpiarCadena(t); 16 //aqui se almacena el resultado 17 String res = ""; 18 for(int i = 0; i < texto.length();i++) 19 { 20 //busca la posicion del caracter en la variable tabla 21 int pos = tabla.indexOf(texto.charAt(i)); 22 //realiza el reemplazo 23 if ((pos + key) < tabla.length()){ 24 res = res + tabla.charAt(pos+key); 25 } 26 else 27 { 28 res = res + tabla.charAt((pos+key) - tabla.length()); 29 } 30 } 31 return res; 32 } 33 34 public String Desencriptar(String t, int key){ 35 String texto = LimpiarCadena(t); 36 String res = ""; 37 for(int i = 0; i < texto.length();i++) 38 { 39 int pos = tabla.indexOf(texto.charAt(i)); 40 if ((pos - key) < 0){ 41 res = res + tabla.charAt((pos-key) + tabla.length()); 42 } 43 else 44 { 45 res = res + tabla.charAt(pos-key); 46 } 47 } 48 return res; 49 } 50 51 private String LimpiarCadena(String t){ 52 //transforma el texto a minusculas 53 t = t.toLowerCase(); 54 //eliminamos todos los retornos de carro 55 t = t.replaceAll("\n", ""); 56 //eliminamos caracteres prohibidos 57 for(int i = 0; i < t.length();i++) 58 { 59 int pos = tabla.indexOf(t.charAt(i)); 60 if (pos == -1){ 61 t = t.replace(t.charAt(i), ' '); 62 } 63 } 64 return t; 65 } 66 67 private void SoyUnMetodoInutil(){ 68 int i=0; 69 for(int j=0;j<=cadena.length();j++){ 70 i = i + j; 71 } 72 } 73 74 }
Despues de utilizar el ProGuard, decompilamos una de las clases (a.java) y podemos ver como quedo nuestro codigo, irreconocible. fue horrible fue horrible....
01 package ProgdPrueba; 02 03 public final class a 04 { 05 06 public a() 07 { 08 a = "abcdefghijklmnopqrstuvwxyz\341\351\355\363\372 1234567890@.,;:-+*/$#\277?!\241=()[]{}"; 09 } 10 11 public final String a(String s, int i) 12 { 13 s = a(s); 14 String s1 = ""; 15 for(int j = 0; j < s.length(); j++) 16 { 17 int k; 18 if((k = a.indexOf(s.charAt(j))) + i < a.length()) 19 s1 = (new StringBuilder()).append(s1).append(a.charAt(k + i)).toString(); 20 else 21 s1 = (new StringBuilder()).append(s1).append(a.charAt((k + i) - a.length())).toString(); 22 } 23 24 return s1; 25 } 26 27 public final String b(String s, int i) 28 { 29 s = a(s); 30 String s1 = ""; 31 for(int j = 0; j < s.length(); j++) 32 { 33 int k; 34 if((k = a.indexOf(s.charAt(j))) - i < 0) 35 s1 = (new StringBuilder()).append(s1).append(a.charAt((k - i) + a.length())).toString(); 36 else 37 s1 = (new StringBuilder()).append(s1).append(a.charAt(k - i)).toString(); 38 } 39 40 return s1; 41 } 42 43 private String a(String s) 44 { 45 s = (s = s.toLowerCase()).replaceAll("\n", ""); 46 for(int i = 0; i < s.length(); i++) 47 { 48 int j; 49 if((j = a.indexOf(s.charAt(i))) == -1) 50 s = s.replace(s.charAt(i), ' '); 51 } 52 53 return s; 54 } 55 56 private String a; 57 }
Eso es todo, todos los archivos que utilizamos en este tutorial, esta en el siguiente enlace:




















