GNU/Linux >> Tutoriels Linux >  >> Linux

Protégez votre code Java contre l'ingénierie inverse

Si vous développez une application Java, il est important de comprendre que les fichiers de classe Java peuvent être facilement rétro-conçus à l'aide de décompilateurs Java. Dans cet article, explorons comment un fichier de classe Java est rétro-conçu et comment protéger votre code source contre la rétro-ingénierie par quelqu'un.

Le code source Java est compilé dans un fichier de classe contenant du code d'octet. Java Virtual Machine n'a besoin que du fichier de classe pour s'exécuter. Le problème est que le fichier de classe peut facilement être décompilé dans le code source d'origine à l'aide des outils de décompilation Java. La meilleure solution pour empêcher l'ingénierie inverse est d'obscurcir le fichier de classe afin qu'il soit très difficile d'effectuer une ingénierie inverse. Selon le dictionnaire Obfuscate signifie "rendre obscur ou peu clair". C'est exactement ce que feront beaucoup d'outils d'obscurcissement Java, comme expliqué ci-dessous.

Je. Décompilez le fichier de classe Java.

Avant de comprendre comment obscurcir le code Java, essayons d'abord de comprendre comment quelqu'un peut désosser votre application Java. Les 3 étapes suivantes expliquent comment un fichier de classe est rétroconçu dans le code source Java d'origine.

1. Créer HelloWorld.java comme indiqué ci-dessous.

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. Compiler HelloWorld.java programme et exécutez-le pour vous assurer qu'il fonctionne correctement.

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

Le fichier de classe Java contient uniquement du code d'octet. Si vous essayez d'afficher un fichier de classe, il sera illisible, comme indiqué ci-dessous.

$ 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. Décompiler HelloWorld.class fichier et afficher la source d'origine.

Pour cette démonstration, utilisons le décompilateur Jad qui est gratuit pour une utilisation non commerciale. Téléchargez le jad approprié pour votre plate-forme. Utilisez jad pour désosser le fichier HelloWorld.class afin d'obtenir la source d'origine, comme indiqué ci-dessous.

$ 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. Obfuscez votre application Java

Voyons comment masquer et protéger votre code source contre l'ingénierie inverse à l'aide de ProGuard, un logiciel gratuit sous licence GPL.

1. Téléchargez et installez ProGuard

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

2. Créer un fichier de configuration proguard

Créez myconfig.pro qui contient toutes les informations sur votre application Java.

  • -injar :spécifiez l'emplacement de votre fichier jar. c'est-à-dire l'application java compilée qui contient les fichiers de classe
  • -outjar :il s'agit du fichier jar que proguard créera après l'obscurcissement. Celui-ci contiendra toutes les conventions de dénomination obscures et mutilées des méthodes et des variables dans le fichier de classe si quelqu'un essaie de faire de l'ingénierie inverse.
  • -printmapping :ProGurad affiche toutes les informations de mappage dans ce fichier pour votre référence.
  • -keep :indiquez les fichiers de classe ou les méthodes que vous ne voulez pas que ProGuard obfusque. Par ex. mypkg.MainAppFrame contient le point d'entrée de l'application avec la classe principale, qui ne sera pas masquée dans cet exemple.
$ 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. Exécutez ProGuard.

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

Cela crée les deux fichiers suivants :

  • myapp-obfuscated.jar :contient les fichiers de classe obfusqués de votre application. Vous pouvez le distribuer sans avoir à vous soucier de la rétro-ingénierie de votre application par quelqu'un.
  • proguard.map :ce fichier contient les informations de mappage pour votre référence.

4. Exemple de fichier proguard.map

Il s'agit d'un exemple de fichier proguard.map qui indique le nom d'origine des objets source Java (fichier de classe, méthodes, variable, etc.) et le nouveau nom masqué.

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

5. Exemple de code source Java (myapp.AppToolBar) avant obfuscation.

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

6. Exemple de code source Java qui a été décompilé à partir du fichier de classe (myapp.ae) après obfuscation.

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

Vous pouvez voir que la ligne "btnNew =changeButtonLabel(btnNew, language.getText("new")); » a été traduit en « d =a(d, n.a(“new”));", par ProGuard, ce qui n'aura aucun sens pour quelqu'un qui utilise des outils de décompilation Java pour désosser le fichier de classe.

Aidez-moi à diffuser l'actualité de The Geek Stuff.

S'il vous plaît laissez vos commentaires et commentaires concernant cet article. Si vous aimez cet article, j'apprécierais vraiment que vous puissiez faire passer le mot sur le blog "The Geek Stuff" en l'ajoutant à del.icio.us ou Digg via le lien ci-dessous.


Linux
  1. Installez Java à partir des dépôts de votre distribution Linux

  2. Conversion de votre code Python 2 en Python 3

  3. Servez votre domaine à partir d'un serveur cloud Rackspace

  4. Appeler une fonction C à partir du code C++

  5. Invoquer des appels système depuis Java

Principes de base de la compilation de logiciels à partir du code source sous Linux

Wpm - Mesurez votre vitesse de frappe depuis le terminal

Utilisez Prey pour protéger votre ordinateur portable Ubuntu Linux contre le vol

Choisir votre saveur de serveur cloud

Comment installer un logiciel à partir du code source dans votre système Linux

Comment gérer les LinkageErrors en Java ?