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); } }
$ 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^@
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.
$ cd /home/jsmith $ unzip proguard4.2.zip
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
$ 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.
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
btnNew = changeButtonLabel(btnNew, language.getText("new")); btnOpen = changeButtonLabel(btnOpen, language.getText("open"));
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.