Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

16/11/10

ProGuard ejemplo básico

JAN29


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.

2. Un JAR que optimizaremos y ofuscaremos, para este ejemplo utilizaremos un proyecto en netbeans llamado "ProgdPrueba" desde ahora me referire a el como JAR. Esta JAR es trivial (encripta/desencripa con el método Cesar), utiliza las librerias basicas de java, tiene una interfaz grafica  y esta compuesta por una clase MAIN.java,  interfaz.java y cesar.java. El proyecto completo más extras se encuentra al final del tutorial.

Comencemos.

1. Una vez que te bajaste la libreria ProGuard, en la carpeta LIB encontraras los archivos:
  1. proguard.jar : esta es la libreria que hace el trabajo de optimizacion y ofuscacion ademas de otras cosillas.
  2. proguardgui.jar : esta aplicación nos sirve para utilizar la libreria de una manera grafica (GUI)
  3. retrace.jar : esta libreria hace lo opuesto a proguard.jar
En el resto de las carpetas puedes encontrar un manual (ingles) asi como algunos ejemplos.

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

4. Presionamos el boton Input Output, esta opcion nos permite hacer dos cosas, elegir los archivos a optimizar/ofuscar y especificar sus salidas (parte superior), y dos nos permite especificar las libreiras que utilizamos en nuestro proyecto (parte inferior)
Cargamos nuestro JAR con el boton AddInput y escogemos el lugar  y el nombre donde lo guardaremos con AddOutput.... Como no utilizamos otras librerias ademas de las basicas de java, no tocamos las opciones de la parte inferior.

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"

6. Ahora la opcion que nos toca es Obfuscation (Ofuscacion), lo mismo que lo anterior, tenemos varias opciones que nos permite "ofuscar" el proyecto de varias maneras
Para este ejemplo solo habilitamos la opcion Print Mapping, esto nos guardara un archivo con todos los detalles de como se "ofusco" el codigo java

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.
Como se ve en la captura, nuestro JAR llamado ProgdPrueba.jar, tenia un tamaño original de 15 kb, despues de optimizar/ofuscar con ProGuard, se redujo a un tamaño de 6 kb, ¡menos de la mitad! nada mal. Tambien podemos ver los archivos de texto que creamos para ver como se hizo todo el proceso.

Veremos ahora como estan las classes en el JAR, antes y despues de utilizar ProGuard

Abriendo los JAR con cualquier descompresor, podemos ver claramente las diferencias que existen entre uno y otro JAR

Podemos ver como ProGuard ofusco el codigo java dividiendolo en varias clases ademas de cambiando el nombre de los metodos y de las variables:
Por ejemplo nuestra clase Cesar.java tenias el siguiente aspecto:

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:
Click para descargar

9 comentarios:

denis dijo...

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?

Anónimo dijo...

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!

Arnitol dijo...

Jaja excellente un tuto mas avanzado no estaria mal tampoco no nos conformemos gracias!!! jajaja el codigo quedo irreconocible: fue horrible fue horrible....jajaja

Anónimo dijo...

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!

Anónimo dijo...

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...

ALEX dijo...

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.

Anónimo dijo...

y que pasa si quiero des ofuscarlo, cual seria el procedimiento o la herramienta para hacerlo

Anónimo dijo...

Siempre aparece el mismo erro:

The output jar is empty. Did you specify the proper '-keep' options?

Enrique de la Cruz Ramirez dijo...

puedea ayudarme por favor,el link de descarga ya no funciona muchas gracias

Post recomendado