Se stai sviluppando un'applicazione java, è importante capire che i file di classe java possono essere facilmente decodificati utilizzando i decompilatori java. In questo articolo, esploriamo come viene decodificato un file di classe java e come proteggere il codice sorgente dall'ingegnerizzazione inversa da parte di qualcuno.
Il codice sorgente java viene compilato in un file di classe che contiene codice byte. Java Virtual Machine richiede solo il file di classe per l'esecuzione. Il problema è che il file di classe può essere facilmente decompilato nel codice sorgente originale utilizzando gli strumenti di decompilatore java. La soluzione migliore per prevenire il reverse engineering è offuscare il file di classe in modo che sia molto difficile da decodificare. Secondo il dizionario Offuscare significa “rendere oscuro o poco chiaro”. Questo è esattamente ciò che faranno molti strumenti java obfuscator, come spiegato di seguito.
Io. Decompilare il file di classe Java.
Prima di capire come offuscare il codice java, cerchiamo prima di capire come qualcuno può decodificare la tua applicazione java. I seguenti 3 passaggi spiegano come un file di classe viene decodificato sul codice sorgente java originale.
1. Crea HelloWorld.java come mostrato di seguito.
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); } }
$ javac HelloWorld.java $ java HelloWorld Hello World! 101
Il file di classe Java contiene solo byte code. Se provi a visualizzare un file di classe, non sarà leggibile come mostrato di seguito.
$ 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^@
Per questa dimostrazione usiamo il decompilatore Jad che è gratuito per uso non commerciale. Scarica il jad appropriato per la tua piattaforma. Usa jad per decodificare il file HelloWorld.class per ottenere il sorgente originale come mostrato di seguito.
$ 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. Offusca la tua applicazione java
Esaminiamo come offuscare e proteggere il codice sorgente dal reverse engineering utilizzando ProGuard, un software gratuito con licenza GPL.
$ cd /home/jsmith $ unzip proguard4.2.zip
Crea myconfig.pro che contiene tutte le informazioni sulla tua applicazione java.
- -injar :Specifica la posizione del tuo file jar. cioè l'applicazione java compilata che contiene i file di classe
- -outjar:questo è il file jar che proguard creerà dopo l'offuscamento. Questo conterrà tutte le convenzioni di denominazione alterate e oscure dei metodi e delle variabili nel file di classe se qualcuno tenta di eseguire il reverse engineering.
- -printmapping:ProGurad emette tutte le informazioni di mappatura in questo file come riferimento.
- -keep:indica i file di classe o i metodi che non vuoi offuscare da ProGuard. Per es. mypkg.MainAppFrame contiene il punto di ingresso per l'applicazione con la classe main, che non verrà offuscata in questo esempio.
$ 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
$ cd /home/jsmith/proguard4.2/lib $ java -jar proguard.jar @myconfig.pro
Questo crea i seguenti due file:
- myapp-obfuscated.jar:contiene i file di classe offuscati della tua applicazione. Puoi distribuirlo senza doverti preoccupare di qualcuno che decodifica facilmente la tua applicazione.
- proguard.map:questo file contiene le informazioni sulla mappatura come riferimento.
Questo è un file proguard.map di esempio che indica il nome originale degli oggetti sorgente java (classfile, metodi, variabile ecc.) e il nuovo nome offuscato.
myapp.AppToolBar -> myapp.ae: javax.swing.JButton btnNew -> d javax.swing.JButton btnOpen -> e
btnNew = changeButtonLabel(btnNew, language.getText("new")); btnOpen = changeButtonLabel(btnOpen, language.getText("open"));
d = a(d, n.a("new")); e = a(e, n.a("open"));
Puoi vedere che la riga "btnNew =changeButtonLabel(btnNew, language.getText("new")); ” è stato tradotto in “d =a(d, n.a(“new”));", da ProGuard, che non avrà alcun senso per qualcuno che sta usando strumenti di decompilatore Java per decodificare il file di classe.
Aiutami a diffondere le notizie su The Geek Stuff.
Si prega di lasciare i vostri commenti e feedback su questo articolo. Se ti piace questo post, ti sarei davvero grato se potessi spargere la voce sul blog "The Geek Stuff" aggiungendolo a del.icio.us o Digg tramite il link qui sotto.