GNU/Linux >> Tutoriales Linux >  >> Linux

Proteja su código Java de la ingeniería inversa

Si está desarrollando una aplicación Java, es importante comprender que los archivos de clase Java pueden modificarse fácilmente mediante ingeniería inversa utilizando descompiladores de Java. En este artículo, exploremos cómo se aplica ingeniería inversa a un archivo de clase Java y cómo proteger su código fuente para que alguien no realice ingeniería inversa.

El código fuente de Java se compila en un archivo de clase que contiene código de bytes. Java Virtual Machine solo necesita el archivo de clase para su ejecución. El problema es que el archivo de clase se puede descompilar fácilmente en el código fuente original utilizando las herramientas de descompilación de Java. La mejor solución para evitar la ingeniería inversa es ofuscar el archivo de clase para que sea muy difícil aplicar ingeniería inversa. Según el diccionario Ofuscar significa “hacer oscuro o poco claro”. Eso es exactamente lo que hará una gran cantidad de herramientas de ofuscador de Java como se explica a continuación.

Yo. Descompilar archivo de clase Java.

Antes de entender cómo ofuscar el código Java, primero intentemos entender cómo alguien puede aplicar ingeniería inversa a su aplicación Java. Los siguientes 3 pasos explican cómo un archivo de clase se aplica ingeniería inversa al código fuente original de Java.

1. Crear HelloWorld.java como se muestra a continuación.

public class HelloWorld {
    public static void main (String args[]) {
        String userMessage = "Hello World!";
        int userCount = 100;
        userCount = userCount + 1;
        System.out.println(userMessage);
        System.out.println(userCount);
    }
}

2. Compilar HelloWorld.java programe y ejecútelo para asegurarse de que funciona correctamente.

$ javac HelloWorld.java
$ java HelloWorld
Hello World!
101

El archivo de clase Java contiene solo código de bytes. Si intenta ver un archivo de clase, no se podrá leer como se muestra a continuación.

$ vi HelloWorld.class
Ãþº¾^@^@^@2^@
^@^G^@^P^H^@^Q  ^@^R^@^S
^@^T^@^V^G^@^W^G^@^X^A^@^F<init>^A^@^C()V^A^@^DCode^A^@^OLineNumberTable
^A^@^Dmain^A^@^V([Ljava/lang/String;)V^A^@
SourceFile^A^@^OHelloWorld.java^L^@^H^@ ^A^@^LHello World!^G^@^Y^L^@^Z^@^[^G^@^\^L^@^]^@^^^L^@^]^@^_^A^@
HelloWorld^A^@^Pjava/lang/Object^A^@^Pjava/lang/System^A^@^Cout^A^@^ULjava/io/PrintStream;^A
^@^Sjava/io/PrintStream^A^@^Gprintln^A^@^U(Ljava/lang/String;)V^A^@^D(I)V^@!^@^F^@^G^@^@^@^@^@^B^@^A^@^H^@  ^@^A^@

3. Descompilar HelloWorld.class archivo y ver la fuente original.

Para esta demostración, usemos el descompilador Jad, que es gratuito para uso no comercial. Descargue el jad apropiado para su plataforma. Use jad para aplicar ingeniería inversa al archivo HelloWorld.class para obtener la fuente original como se muestra a continuación.

$ unzip jadls158.zip
$ ./jad HelloWorld.class
Parsing HelloWorld.class...
Generating HelloWorld.jad
$ vi HelloWorld.jad <This will show the reverse engineered original source code>

II. Ofusque su aplicación java

Revisemos cómo ofuscar y proteger su código fuente de la ingeniería inversa utilizando ProGuard, un software gratuito con licencia GPL.

1. Descarga e instala ProGuard

$ cd /home/jsmith
$ unzip proguard4.2.zip

2. Crea un archivo de configuración proguard

Cree myconfig.pro que contenga toda la información sobre su aplicación java.

  • -injar:especifica la ubicación de tu archivo jar. es decir, la aplicación java compilada que contiene los archivos de clase
  • -outjar:este es el archivo jar que proguard creará después de la ofuscación. Esto contendrá toda la convención de nomenclatura oscura y distorsionada de los métodos y variables en el archivo de clase si alguien intenta aplicar ingeniería inversa.
  • -printmapping:ProGurad genera toda la información de mapeo en este archivo para su referencia.
  • -keep:indica los archivos de clase o los métodos que no desea que ProGuard ofusque. Por ej. mypkg.MainAppFrame contiene el punto de entrada para la aplicación con la clase principal, que no se ofuscará en este ejemplo.
$ cat myconfig.pro
-injars /home/jsmith/myapp.jar
-outjars /home/jsmith/myapp-obfuscated.jar This is the obfuscated jar file
-libraryjars /usr/java/jdk1.5.0_14/jre/lib/rt.jar
-printmapping proguard.map
-verbose
-keep public class mypkg.MainAppFrame

3. Ejecute ProGuard.

$ cd /home/jsmith/proguard4.2/lib
$ java -jar proguard.jar @myconfig.pro

Esto crea los siguientes dos archivos:

  • myapp-obfuscated.jar:contiene los archivos de clase ofuscados de su aplicación. Puede distribuir esto sin tener que preocuparse de que alguien realice ingeniería inversa de su aplicación fácilmente.
  • proguard.map:este archivo contiene la información de mapeo para su referencia.

4. Ejemplo de archivo proguard.map

Este es un archivo de muestra proguard.map que indica el nombre original de los objetos fuente de Java (archivo de clase, métodos, variable, etc.) y el nuevo nombre ofuscado.

myapp.AppToolBar -> myapp.ae:
javax.swing.JButton btnNew -> d
javax.swing.JButton btnOpen -> e

5. Muestra el código fuente de Java (myapp.AppToolBar) antes de la ofuscación.

btnNew = changeButtonLabel(btnNew, language.getText("new"));
btnOpen = changeButtonLabel(btnOpen, language.getText("open"));

6. Ejemplo de código fuente de Java que se descompiló del archivo de clase (myapp.ae) después de la ofuscación.

d = a(d, n.a("new"));
e = a(e, n.a("open"));

Puede ver que la línea “btnNew =changeButtonLabel(btnNew, language.getText(“new”)); ” se tradujo a “d =a(d, n.a(“nuevo”));”, por ProGuard, lo que no tendrá ningún sentido para alguien que esté utilizando herramientas de descompilación de Java para aplicar ingeniería inversa al archivo de clase.

Ayúdame a difundir las noticias sobre The Geek Stuff.

Por favor, deje sus comentarios y opiniones sobre este artículo. Si te gusta esta publicación, te agradecería mucho si puedes difundir el blog "The Geek Stuff" agregándolo a del.icio.us o Digg a través del enlace a continuación.


Linux
  1. Instale Java desde los repositorios de su distribución de Linux

  2. 12 herramientas simples para proteger su privacidad

  3. Importación del módulo Python desde Bash

  4. Llame a una función C desde el código C++

  5. ¿Cómo elimino el código VS y la configuración de Ubuntu?

Conceptos básicos de la compilación de software a partir del código fuente en Linux

Wpm:mida su velocidad de escritura desde la terminal

Use Prey para proteger su computadora portátil Ubuntu Linux contra robos

Elegir el sabor de su servidor en la nube

Cómo instalar software desde el código fuente en su sistema Linux

¿Cómo lidiar con LinkageErrors en Java?