Wenn Sie eine Java-Anwendung entwickeln, ist es wichtig zu verstehen, dass die Java-Klassendateien mit Java-Decompilern leicht rückentwickelt werden können. Lassen Sie uns in diesem Artikel untersuchen, wie eine Java-Klassendatei rückentwickelt wird und wie Sie Ihren Quellcode davor schützen, von jemandem rückentwickelt zu werden.
Der Java-Quellcode wird in eine Klassendatei kompiliert, die Bytecode enthält. Java Virtual Machine benötigt zur Ausführung nur die Klassendatei. Das Problem besteht darin, dass die Klassendatei mit Java-Decompiler-Tools leicht in den ursprünglichen Quellcode dekompiliert werden kann. Die beste Lösung, um Reverse Engineering zu verhindern, besteht darin, die Klassendatei zu verschleiern, sodass es sehr schwierig ist, sie zurückzuentwickeln. Laut Wörterbuch bedeutet Obfuscate „unklar oder unklar machen“. Das ist genau das, was viele Java-Obfuscator-Tools tun, wie unten erklärt.
Ich. Java-Klassendatei dekompilieren.
Bevor wir verstehen, wie man den Java-Code verschleiert, lassen Sie uns zunächst versuchen zu verstehen, wie jemand Ihre Java-Anwendung zurückentwickeln kann. Die folgenden 3 Schritte erklären, wie eine Klassendatei zum ursprünglichen Java-Quellcode zurückentwickelt wird.
1. Erstellen Sie HelloWorld.java wie unten gezeigt.
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. HelloWorld.java kompilieren programmieren und ausführen, um sicherzustellen, dass es ordnungsgemäß funktioniert.
$ javac HelloWorld.java $ java HelloWorld Hello World! 101
Die Java-Klassendatei enthält nur Bytecode. Wenn Sie versuchen, eine Klassendatei anzuzeigen, ist sie wie unten gezeigt nicht lesbar.
$ 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. Dekompilieren Sie HelloWorld.class Datei und sehen Sie sich die Originalquelle an.
Für diese Demonstration verwenden wir den Jad-Decompiler, der für nicht-kommerzielle Zwecke kostenlos ist. Laden Sie das passende jad für Ihre Plattform herunter. Verwenden Sie jad, um die HelloWorld.class-Datei zurückzuentwickeln, um die ursprüngliche Quelle wie unten gezeigt zu erhalten.
$ 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. Verschleiern Sie Ihre Java-Anwendung
Sehen wir uns an, wie Sie Ihren Quellcode mit ProGuard, einer kostenlosen GPL-lizenzierten Software, verschleiern und vor Reverse Engineering schützen können.
1. Laden Sie ProGuard herunter und installieren Sie es
$ cd /home/jsmith $ unzip proguard4.2.zip
2. Erstellen Sie eine Proguard-Konfigurationsdatei
Erstellen Sie myconfig.pro, das alle Informationen über Ihre Java-Anwendung enthält.
- -injar :Geben Sie den Speicherort Ihrer JAR-Datei an. d.h. die kompilierte Java-Anwendung, die die Klassendateien enthält
- -outjar:Dies ist die JAR-Datei, die proguard nach der Verschleierung erstellt. Diese enthält alle verstümmelten, obskuren Namenskonventionen der Methoden und Variablen in der Klassendatei, wenn jemand versucht, sie zurückzuentwickeln.
- -printmapping:ProGurad gibt alle Zuordnungsinformationen in dieser Datei zu Referenzzwecken aus.
- -keep:Geben Sie die Klassendateien oder Methoden an, die ProGuard nicht verschleiern soll. Für z.B. mypkg.MainAppFrame enthält den Einstiegspunkt für die Anwendung mit der Hauptklasse, die in diesem Beispiel nicht verschleiert wird.
$ 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. Führen Sie ProGuard aus.
$ cd /home/jsmith/proguard4.2/lib $ java -jar proguard.jar @myconfig.pro
Dadurch werden die folgenden zwei Dateien erstellt:
- myapp-obfuscated.jar:Enthält die verschleierten Klassendateien Ihrer Anwendung. Sie können dies verteilen, ohne sich Gedanken über ein Reverse Engineering Ihrer Anwendung machen zu müssen.
- proguard.map:Diese Datei enthält die Zuordnungsinformationen für Ihre Referenz.
4. Beispieldatei proguard.map
Dies ist eine Beispieldatei proguard.map, die den ursprünglichen Namen der Java-Quellobjekte (Klassendatei, Methoden, Variable usw.) und den neuen verschleierten Namen angibt.
myapp.AppToolBar -> myapp.ae: javax.swing.JButton btnNew -> d javax.swing.JButton btnOpen -> e
5. Beispiel-Java-Quellcode (myapp.AppToolBar) vor der Verschleierung.
btnNew = changeButtonLabel(btnNew, language.getText("new")); btnOpen = changeButtonLabel(btnOpen, language.getText("open"));
6. Beispiel-Java-Quellcode, der nach Verschleierung aus der Klassendatei (myapp.ae) dekompiliert wurde.
d = a(d, n.a("new")); e = a(e, n.a("open"));
Sie können sehen, dass die Zeile „btnNew =changeButtonLabel(btnNew, language.getText(“new“)); “ wurde übersetzt in „d =a(d, n.a(„neu“));“, von ProGuard, was für jemanden keinen Sinn ergibt, der Java-Decompiler-Tools verwendet, um die Klassendatei zurückzuentwickeln.
Helfen Sie mir, die Neuigkeiten über The Geek Stuff zu verbreiten.
Bitte hinterlassen Sie Ihre Kommentare und Ihr Feedback zu diesem Artikel. Wenn Ihnen dieser Beitrag gefällt, würde ich mich sehr freuen, wenn Sie den Blog „The Geek Stuff“ verbreiten könnten, indem Sie ihn über den unten stehenden Link zu del.icio.us oder Digg hinzufügen.