Obfuscator

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

Der Begriff Obfuscator (engl. obfuscate „verdunkeln“, „verwirren“) bezeichnet ein Mittel zum Erschweren von Reverse Engineering. Bei einem Skriptsprachenprogramm bedeutet dies, die ausgelieferte Kopie des Programmcodes unkenntlich und (für Menschen) schwerer lesbar zu machen. Bei einem kompilierten Programm verwürfelt und verschleiert ein Obfuscator 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, oder das Dekompilat soll möglichst unverständlich werden.

Eigenschaften[Bearbeiten]

Ein Obfuscator verändert den ausführbaren Code des 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. Auch wird (bei einem kompilierten Programm) der Maschinen- oder Bytecode so verwürfelt, 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 gänzlich unmöglich machen.

Im Allgemeinen verschlüsselt ein Obfuscator die Anwendung jedoch nicht.

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. Dies ist vor allem bei der Entwicklung von Anwendungsprogrammen für mobile Endgeräte mit geringer Speicherkapazität oder Rechenleistung vorteilhaft. Bei kompilierten Programmen tritt meist eine Vergrößerung des Programmcodes ein, sowie eine Verlangsamung der Ausführungsgeschwindigkeit.

Abgrenzung[Bearbeiten]

Ein Obfuscator ist keine Anwendung der sogenannten Steganografie und im Allgemeinen auch nicht der Kryptografie.

Beispiele für Methoden der Code Obfuscation[Bearbeiten]

  • Äquivalente Formeln und konstante Transformationen
    Beispielsweise kann eine Addition +10 ersetzt werden durch „addiere 15 und subtrahiere 5“.
  • Umordnung von Anweisungen
    Die Reihenfolge, in der Programmanweisungen ausgeführt werden, kann manchmal umgeordnet werden, ohne das Programm zu beeinflussen. Dies kann sowohl im Quelltext als auch im Kompilat (dann mit (Maschinen-)Befehlen) geschehen.
  • 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.
  • Einfügen von Code, der Decompilieren erschwert
    Beispielsweise das Einfügen von Code nach dem Ende einer Methode, was manche Decompilierer zum Absturz bringt.
  • 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 (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.

Sonstiges[Bearbeiten]

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

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]