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:
12 comentarios:
Muy bueno gracias, buscaba algo así para proteger una aplicación comercial, para que no la descompilen, la pregunte es, queda todo funcional después del proceso de ofuscación?, no provoca fallas en la aplicación?
Hi
Buen tuto, pero mi pregunta es, has intentado hacerlo con una app que use una base de datos, lo he intentado pero no me funciona.
Saludos!
Jaja excellente un tuto mas avanzado no estaria mal tampoco no nos conformemos gracias!!! jajaja el codigo quedo irreconocible: fue horrible fue horrible....jajaja
Para empezar buenas a todos!
Perdonad mi ignorancia pero tengo un problema y es que siempre que le doy a procesar me sale este mensaje:
The output jar is empty. Did you specify the proper '-keep' options?
Alguien sabe decirme como arreglarlo?
ya que mi conocimiento es escaso...
Gracias de antemano!
Holas, te agradesco , es muy intuitivo tu ejemplo, pero mi problema es que tengo una aplicacion web en netbeans que genera un war.. y bueno las clases quiero que o se puedan leer te agradeceria alguna sugerencia...
Buen tutorial amigo,estoy utilizando esta herramienta pero tengo un problema cuando quiero generar reporte utilizando librerias jasper.
funciona correctamente el primer jar generado pero cuando ese jar es ofuscado, ya no funciona el reporte.
alguna solucion?
muchas gracias de antemano.
y que pasa si quiero des ofuscarlo, cual seria el procedimiento o la herramienta para hacerlo
Siempre aparece el mismo erro:
The output jar is empty. Did you specify the proper '-keep' options?
puedea ayudarme por favor,el link de descarga ya no funciona muchas gracias
Muy bueno eh! La verdad si me ayudó ;)
como agrego mis plugins que use en proguard?? librerias y plugins donde los agrego?
como agrego mis plugins que use en proguard?? librerias y plugins donde los agrego?
Publicar un comentario