Obfuskation

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Obfuscator)
Wechseln zu: Navigation, Suche

Obfuskation (lat. obfuscare für „verdunkeln“) ist ein Begriff aus der Softwaretechnik und beschreibt die absichtlich herbeigeführte Veränderung von Programmcode, sodass der Quelltext für Menschen schwer verständlich wird. Damit soll das Reverse Engineering möglichst aufwendig bis unmöglich gemacht werden.

Bei Programmiersprachen wie beispielsweise Skriptsprachen, wo der Quelltext ausgeliefert wird, bedeutet dies, die ausgelieferte Kopie des Quelltextes unkenntlich und (für Menschen) schwerer lesbar zu machen. Bei einem kompilierten Programm verwürfelt und verschleiert ein Obfuskator nicht den Quellcode, sondern entweder direkt das Kompilat oder eine Kopie des Quellcodes unmittelbar vor dem Kompilieren. Hier soll vor allem das (maschinelle) Dekompilieren verhindert werden bzw. das Dekompilat soll möglichst unverständlich werden.[1]

Eigenschaften[Bearbeiten]

Obfuskation verändert den ausführbaren Code eines Programms, jedoch nur so, dass die Funktion des Programms erhalten bleibt. Zum Beispiel werden Variablen- und Funktionsnamen umbenannt, sofern sie aus dem Programm rückgewinnbar wären. Ebenfalls kann (bei einem kompilierten Programm) der Maschinen- oder Bytecode so verwürfelt werden, dass die Befehlsabschnitte, die einem Hochsprachenbefehl entsprechen, sich mit denen des vorherigen/nachfolgenden Hochsprachenbefehls mischen; oft werden auch zusätzliche nicht notwendige (Maschinen-)Befehle eingefügt. Dies kann ein maschinelles Dekompilieren in die ursprüngliche Hochsprache deutlich erschweren oder sogar unmöglich machen.[2]

Ein Nebeneffekt kann, je nach Beschaffenheit des Codes, auch die Verkleinerung dessen Speicherbedarfs sein (v. a. bei Skriptsprachenprogrammen), z. B. durch die Umbenennung langer Identifier in kürzere.[3] Dies ist vor allem bei der Entwicklung von Website-Skripten vorteilhaft, da es das Übertragungsvolumen reduziert. Ebenfalls kann es vorteilhaft sein bei Anwendungsprogrammen für Endgeräte mit geringer Speicherkapazität oder Rechenleistung. Bei kompilierten Programmen tritt meist eine Vergrößerung des Programmcodes ein, sowie eine Verlangsamung der Ausführungsgeschwindigkeit.

Abgrenzung[Bearbeiten]

Die Obfuskation verändert lediglich Dinge wie z. B. den Kontrollfluss oder die Variablennamen. Sie verschlüsselt jedoch nicht das gesamte Programm, ist also keine Anwendung der sogenannten Steganografie und im Allgemeinen auch nicht der Kryptografie. Es können allerdings u. U. im Programm hinterlegte Zeichenketten, Dateien oder ganze Klassen verschlüsselt werden, damit diese nicht im Klartext lesbar sind (siehe unten).

Beispiele für Methoden der Code Obfuskation[Bearbeiten]

Äquivalente Formeln und konstante Transformationen
Beispielsweise kann eine Addition +10 ersetzt werden durch „addiere 15 und subtrahiere 5“.
Verändern des Kontrollflusses
Die Reihenfolge, in der Programmanweisungen ausgeführt werden, kann manchmal umgeordnet werden, ohne die Funktionalität zu beeinflussen. Dies kann sowohl im Quelltext als auch im Kompilat (dann mit Maschinenbefehlen) geschehen.[4]
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.
Veränderung der Funktionshierarchie
Einzelne Anweisungen oder auch Blöcke können - entgegen der logischen Struktur - in Unterprogramme ausgelagert oder aus Unterprogrammen an die aufrufende Stelle kopiert werden.
Einfügen von redundantem Code
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.
Einfügen von Code, der Decompilieren erschwert
Beispielsweise das Einfügen von Code nach dem Ende einer Methode, was manche Decompilierer zum Absturz bringt.[5][2]
Verschlüsselung
Verschlüsselung ist besonders für die Tarnung von einzelnen Bytes oder Strings wie im Code hardcodiert abgelegte Passwörter oder mitgelieferte Dateien, oder sogar ganze Klassen und Bibliotheken geeignet.[6]
Mischen von Funktionen
Die (Maschinen-)Anweisungen zweier Funktionen/Hochsprachenbefehle können alternierend geschrieben werden. Dadurch verschwimmen die Grenzen zwischen den Funktionen.
Spalten von Variablen
Umstrukturierung von Arrays oder Listen
  • 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 dann frühzeitiges Beenden eines Programmes bei der Erkennung eines Debuggers abzielen. Dazu scannen sie beispielsweise den Speicher nach Suchstrings diverser Debugger.

Programme[Bearbeiten]

Für das Verschleiern von Software gibt es je nach Programmiersprache und Plattform eine unterschiedlich große Zahl an Obfuskatoren. Viele davon sind für die direkte Anwendung auf den Quellcode[7][8], oder für Plattformen erhältlich, deren Quellcode ohne den Einsatz von Obfuskatoren leicht zugänglich wäre, etwa durch die Verwendung einer Bytecode-ähnlichen Zwischensprache vor der Ausführung. Es gibt allerdings auch Obfuskatoren, die Programme verschleiern, die in Programmiersprachen geschrieben wurden, die direkt in ausführbaren Code kompilieren.

C / C++[Bearbeiten]

Folgende Obfuskatoren für C/C++ werden aktiv gewartet: Stunnix C++ Obfuscator[9], StarForce C++ Obfuscate[10], Morpher C/C++ Obfuscator[11], Semantic Design C und C++ Obfuscators[12][13]

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 und MSIL[Bearbeiten]

Für das Verschleiern von Java Bytecode und der Common Intermediate Language von .NET gibt es eine Reihe von proprietären und open-source Obfuskatoren.[14][15]

Folgende Obfuskatoren für Java Bytecode werden aktiv gewartet: DashO[16], JavaGuard[17], ProGuard, yGuard[18] und Zelix Klassmaster[19].

Nachteile von Obfuskation[Bearbeiten]

Obfuskation kann Reverse Engineering eines Programms zeitaufwändig erschweren, aber nicht notwendigerweise unmöglich machen. [20] Darüber hinaus beschränkt es die Anwendungsmöglichkeiten der Reflexion auf verschleiertem Code.

Dieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit Belegen (beispielsweise Einzelnachweisen) ausgestattet. Die fraglichen Angaben werden daher möglicherweise demnächst entfernt. Bitte hilf der Wikipedia, indem du die Angaben recherchierst und gute Belege einfügst. Näheres ist eventuell auf der Diskussionsseite oder in der Versionsgeschichte angegeben. Bitte entferne zuletzt diese Warnmarkierung.
Die "Belege" sind a) Blogartikel, die b) von Personen stammen, die keineswegs federführend im Security-Bereich oder bei Obfuskation sind. c) Der erste Beleg sagt nichts zu Antivirusprogrammen oder AVG aus. d) Der zweite Beleg sagt was darüber aus, wie man Obfuskation nützt um Antivirusprogramme zu umgehen, aber nichts darüber dass Antivirusprogramme "den Benutzer beim Besuch einer Website mit verschleiertem Code alarmierten". e) Der dritte Beleg sagt was darüber aus, dass man mit Compressern oder anderen Tätigkeiten Antivirusprogramme umgehen kann.

Fazit: Der nachfolgende Absatz ist nichtmal mit in der WP ungültigen Blog-Belegen belegt. Ich persönlich halte ihn auch für Schwachsinn, da die meisten Webseiten mittels Obfuskatoren Javascript verschleiern & verkleinern und somit AVG ständig beim Browsen anschlagen müsste. --Sebastian.Dietrich 15:40, 25. Feb. 2015 (CET)

Einige Antivirus-Software wie etwa AVG, alarmieren den Benutzer beim Besuch einer Website mit verschleiertem Code, da Obfuskation auch dazu benutzt wird, schädlichen Code zu verbergen.[21][22] Dennoch verwenden einige Entwickler Obfuskatoren zum Zweck geringerer Dateigrößen oder höherer Sicherheit. Der durchschnittliche Nutzer würde einen Alarm seiner Antivirus-Software über eigentlich harmlosen Code hingegen nicht erwarten, insbesondere nicht von vertrauenswürdigen Unternehmen. Daher kann der Alarm der Antivirus-Software bei verschleiertem Code eher von der Verwendung von Obfuskatoren abschrecken, oder den Einsatz von zusätzlichen Kompressionsmethoden seitens des Entwicklers erforderlich machen.[23]

Obfuskation und die Copyleft-Lizenz[Bearbeiten]

Ob es legal ist, eine Copyleft-Softwarelizenz zu umgehen, indem verschleierter Quelltext herausgegeben wird, war Gegenstand von Debatten innerhalb der Open Source-Community. Diese Art der Umgehung kommt vor, wenn der Autor wenig gewillt ist, den Quelltext des eigenen Programms zu veröffentlichen, durch die Lizenz des ursprünglichen Programms jedoch dazu gezwungen wird. Die Thematik wird in der GNU General Public License behandelt, indem sie Quellcode als die bevorzugte Version von veröffentlichtem Code bezeichnet.[24] Die GNU-Website teilt mit, dass verschleierter Quellcode kein echter Quellcode ist und nicht als Quellcode zählt, womit die Anwendung von Obfuskatoren auf GPL-geschützten Quellcode in den Augen des GNU-Projekts eine Lizenzverletzung darstellt.[25]

Sonstiges[Bearbeiten]

Es gibt Programmierwettbewerbe für kreativ verschleierte Programm-Quelltexte, was jedoch nur für Skriptsprachen einer Obfuskation entspricht:

Weblinks[Bearbeiten]

Wikipedia[Bearbeiten]

extern[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1.  Richard R. Brooks: Disruptive Security Technologies with Mobile Code and Peer-to-Peer Networks. CRC Press, 14. Mai 2012, 7, S. 155ff.
  2. a b Codewall .Net Obfuscation - "Control Flow Obfuscation. Control Flow Obfuscation scrambles the execution paths of the method bodies of your application making decompilers crash."
  3. Proguard Results - "It primarily reduces the size of the processed code, with some potential increase in efficiency as an added bonus."
  4. Control Flow Obfuscation, Microsoft Developer Networt, Visual Studio 2005
  5. JBCO: the Java ByteCode Obfuscator - "JBCO has been shown to cause failure or crashes in two of the more modern decompilers Dava and SourceAgain"
  6. DeyGuard Website - Encrypt strings, encrypt entire classes, encrypt native libraries, encrypt assets
  7. Open Directory - Computers: Programming: Languages: JavaScript: Tools: Obfuscators. Dmoz.org. 3. August 2013. Abgerufen am 25. November 2013.
  8. Open Directory - Computers: Programming: Languages: PHP: Development Tools: Obfuscation and Encryption. Dmoz.org. 19. September 2013. Abgerufen am 25. November 2013.
  9. Stunnix C++ Obfuscator Homepage
  10. Star-Force Obfuscator Homepage
  11. Morpher Homepage
  12. Semantic Design C Obfuscator
  13. Semantic Design C++ Obfuscator
  14. Liste von Java Code-Obfuskatoren bei java2s.com
  15. ProGuard Alternativen lt. ProGuard
  16. DashO Homepage
  17. JavaGuard Homepage
  18. YGuard Homepage
  19. Zelix Klassmaster Homepage
  20. "Can We Obfuscate Programs?" by Boaz Barak. Math.ias.edu. Abgerufen am 25. November 2013.
  21. http://www.securityfocus.com/columnists/498, abgerufen am 8. Februar 2015
  22. "Using Metasploit to Bypass Anti-Virus Software Generating And Obfuscating Payloads, abegrufen am 8. Februar 2015
  23. Bypassing Antivirus Using De-Obfuscation, abgerufen am 8. Februar 2015
  24. "Reasoning behind the "preferred form of the work for making modifications to it" language in the GPL" Lwn.net. Aufgerufen am 25. November 2013.
  25. Freie-Software-Definition - www.gnu.org