Obfuscator

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Der Begriff Obfuscator (engl. obfuscate „verdunkeln“, „verwirren“, zu Deutsch Quelltextverschleierer) bezeichnet ein Mittel zur Verschleierung von Quelltext. Es wird in erster Linie eingesetzt, um Programme vor Reverse Engineering zu schützen. Hierzu wird aus einem gut les- und nachvollziehbaren Programmcode – meist unter Nutzung speziell dafür entwickelter Tools – eine für Menschen schwerer lesbare Form generiert, die aber von der verarbeitenden Maschine etwa genauso schnell ausgeführt wird und die gleiche Funktionalität ausübt wie der Originalcode.

Eigenschaften[Bearbeiten]

Ein Obfuscator muss die Funktionalität des Originalprogramms erhalten und sollte als Resultat ein Programm liefern, das nicht wesentlich langsamer ausgeführt wird als das Originalprogramm.

Ein Nebeneffekt kann, je nach Beschaffenheit des Codes, auch die Verkleinerung dessen Speicherbedarfs sein, z. B. durch die Umbenennung langer Identifier in kürzere. Dies ist vor allem bei der Entwicklung von Anwendungsprogrammen für mobile Endgeräte mit geringer Speicherkapazität oder Rechenleistung vorteilhaft.

Die Veränderung eines Programmes mit einem Obfuscator führt in der Regel dazu, dass der Ergebnis-Code kaum zu debuggen ist, weil die nachträgliche Zuordnung einer Fehlerquelle im umgewandelten Code zu ihrem Pendant im Originalcode (zwecks genauerer Fehleranalyse) sehr zeitaufwendig bis unmöglich sein kann.

Abgrenzung[Bearbeiten]

Ein Obfuscator ist keine Anwendung der sogenannten Steganografie oder Kryptografie, da beim Obfuscator nur das Verständnis für den Menschen die Hürde ist, nicht jedoch in formaler Hinsicht für die ausführende Maschine oder z. B. einen Decompiler.

Beispiele für Methoden der Code Obfuscation[Bearbeiten]

Äquivalente Formeln und konstante Transformationen
Beispielsweise kann man einem Register die Zahl 10 addieren oder, was auf dasselbe hinausläuft, 15 addieren und 5 subtrahieren.
Umordnung von Anweisungen
Die Reihenfolge, in der Programmanweisungen ausgeführt werden, kann manchmal umgeordnet werden, ohne das Programm zu beeinflussen.
Variablensubstitution
Einfaches Umbenennen von Variablennamen wie „Rechnungsbetrag“ oder „Adresse“ auf generierte Namen wie „ax7zhgr“.
Bedingte Anweisungen und Sprünge
Dazu gehören auch überflüssige Vergleiche, die stets wahr bzw. falsch ergeben, Links oder Pointer.
Aufruf von Subroutinen
Jede einzelne Anweisung kann auch durch eine Subroutine ersetzt werden.
Einfügen von Leercode
In die Folge der Anweisungen wird hierbei überflüssiger Code eingefügt, der nichts zum Programm beiträgt und lediglich triviale oder irrelevante Berechnungen ausführt.
Verschlüsselung
Verschlüsselung ist besonders für die Tarnung von einzelnen Bytes oder Strings wie im Code hardcodiert abgelegte Passwörter geeignet.
Mischen von Funktionen
Die Anweisungen zweier Funktionen können alternierend geschrieben werden. Dadurch verschwimmen die Grenzen zwischen den Funktionen.
Spalten von Variablen
Umstrukturierung von Arrays
  • ein eindimensionales Array kann in mehrere eindimensionale Arrays gespalten werden
  • ein eindimensionales Array kann in ein mehrdimensionales Array ausgeweitet werden
  • ein mehrdimensionales Array kann in ein eindimensionales Array geschrumpft werden
  • zwei oder mehrere eindimensionale Arrays können zu einem eindimensionalen Array zusammengeführt werden.
Anti Debugs
Routinen, die auf die Erkennung und die frühzeitige Terminierung eines Programmes bei der Erkennung eines Debuggers abzielen. Dazu scannen sie beispielsweise den Speicher nach Suchstrings diverser Debugger.

Programme[Bearbeiten]

Windows Script Encoder[Bearbeiten]

Um verschiedene Skripte wie JScript-, VBScript- und insbesondere ASP-Dateien zu verschleiern, empfiehlt Microsoft, den Windows Script Encoder zu benutzen. Im Falle einer Kompromittierung des Webservers soll der Angreifer nicht in der Lage sein, zu verstehen, wie die ASP-Anwendung funktioniert. Mittlerweile gibt es jedoch Decoder, um die Verschleierung rückgängig zu machen.

Java Bytecode[Bearbeiten]

Für das Verschleiern von Java Bytecode gibt es eine Reihe von Code-Obfuscatoren. Diese sind: bb_mug, CodeShield, DashO, jarg, JavaGuard, JCloak, jmangle, JOBE, Jode, JShrink, Marvin, ProGuard, Sandmark, Retroguard, Smokescreen, yGuard und Zelix Klassmaster.

Siehe auch[Bearbeiten]

Des Weiteren gibt es Programmierwettbewerbe für die am kreativsten verschleierten Programm-Quelltexte:

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]