Obfuskation: Code-Dieben das Handwerk legen

Gängige Dekompilierer können relativ leicht den Quellcode aus einem kompilierten Code extrahieren. Der Einsatz von Java-Obfuskatoren bietet hier einen sehr wirksamen Schutz vor Reverse Engineering. Der Artikel erklärt die Wirkungsweise verschiedener Obfuskationstechniken.

Es ist sehr einfach, Java-Klassendateien rückzuentwickeln. Der Java-Bytecode enthält viele Informationen, die auch im ursprünglichen Quellcode enthalten sind. Darüber hinaus sind Java-Programme dafür bekannt, dass sie nur einmal geschrieben werden müssen und anschließend überall laufen. Diese Flexibilität bietet zahlreiche potenzielle Vorteile in einer verteilten Umgebung. Die Code-Dekompilierung beschränkt sich nicht ausschließlich auf Java, wurde jedoch nie so öffentlich oder allgegenwärtig eingesetzt wie unter den Java-Entwicklern. Das Gegenteil der Dekompilierung ist die Obfuskation.

Was versteht man unter Obfuskation?

Code-Obfuskation ist aktuell das beste Verfahren, um Java-Code gegen Reverse Engineering zu schützen. Durch die Obfuskation wird die Software zwar unverständlich, funktioniert jedoch weiterhin nach dem ursprünglichen Code. Die Programme sind damit schwieriger zu dechiffrieren, was sie unempfindlicher gegen Reverse Engineering werden lässt.

Durch einen Obfuskator wird aus einem bestimmten Satz von Klassendateien P ein anderer Satz von Klassendateien P‘. Als Ergebnis ist der Code für P nicht mehr der gleiche wie der Code für P‘.

Als Beispiel dient ein einfacher Java-Code aus dem ursprünglichen Quellcode (src1.java.txt):


class OriginalHello {
public OriginalHello() {
int number=1;
}
public String getHello(String helloname){
return helloname;
}

Nach der Obfuskation dieses Codes durch einen relativ simplen Obfuskator, wie etwa Klass-Master, werden alle Namen in dieser Klasse geändert oder zerhackt und die Zeilennummern entfernt. Dadurch entsteht dann der obfuskatierte Code (dst1.java.txt):


class a {
public static boolean a;
public a() {
int a=1;
}
public String a(String b){
return b;
}

Am oben gezeigten Code erkennt man, dass Hello.class durch den Obfuskator Klass-Master zu einer Klasse und ihre Methode, also getHello(java.lang.String), zu a(java.lang.String) geändert wurde. Der Name der Methode a() ist schwieriger zu verstehen als getHello(). Wenn man den obfuskatierten Bytecode mit dem ursprünglichen Bytecode vergleicht, sieht man, dass die Zeilennummern entfernt wurden. Dadurch erhalten Rückentwickler weniger Informationen.

Bei diesem sehr einfachen Beispiel für eine Code-Obfuskation werden lediglich die Identifier verschlüsselt und die von Kompilierern erzeugten Zeilennummern entfernt. Moderne kommerzielle Obfuskatoren können sehr schnell verschlüsseln und gleichzeitig ziemlich gut Codes entschlüsseln. Auf diesem Gebiet wird jedoch noch viel geforscht.

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

ZDNet für mobile Geräte
ZDNet-App für Android herunterladen Lesen Sie ZDNet-Artikel in Google Currents ZDNet-App für iOS

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Obfuskation: Code-Dieben das Handwerk legen

Kommentar hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *