Was ist Obfuscation?
On Oktober 25, 2021 by adminWas ist Code Obfuscation?
Code Obfuscation ist der Prozess der Modifizierung einer ausführbaren Datei, so dass sie für einen Hacker nicht mehr nützlich ist, aber voll funktionsfähig bleibt. Dabei können zwar die eigentlichen Methodenanweisungen oder Metadaten verändert werden, nicht aber die Ausgabe des Programms. Um es klar zu sagen: Mit genügend Zeit und Aufwand kann fast jeder Code zurückentwickelt werden. Auf einigen Plattformen wie Java, Android, iOS oder .NET (z. B. Xamarin, C#, VB.NET, F#) können kostenlose Decompiler den Quellcode einer ausführbaren Datei oder einer Bibliothek in kürzester Zeit und ohne großen Aufwand zurückentwickeln. Automatisierte Codeverschleierung macht das Reverse-Engineering eines Programms schwierig und wirtschaftlich nicht machbar.
Warum einen Code Obfuscator verwenden?
Indem Sie das Reverse-Engineering einer Anwendung erheblich erschweren, können Sie sich vor dem Diebstahl von Geschäftsgeheimnissen (geistigem Eigentum), unbefugtem Zugriff, der Umgehung von Lizenzen oder anderen Kontrollen und der Entdeckung von Schwachstellen schützen.
Wie funktioniert Obfuscation?
Code Obfuscation besteht aus vielen verschiedenen Techniken, die sich gegenseitig ergänzen können, um einen mehrschichtigen Schutz zu schaffen. Am effektivsten ist sie bei Sprachen, die eine Form von Anweisungen auf mittlerer Ebene erstellen, wie Java oder die .NET-Sprachen wie C#, VB.NET, Managed C++, F# usw. Einige typische Beispiele für Obfuskations- und Anwendungssicherheitstechniken sind:
Rename Obfuscation
Renaming ändert den Namen von Methoden und Variablen. Dadurch wird der dekompilierte Quellcode für einen Menschen schwerer zu verstehen, die Programmausführung wird jedoch nicht verändert. Die neuen Namen können verschiedene Schemata wie „a“, „b“, „c“ oder Zahlen, nicht druckbare Zeichen oder unsichtbare Zeichen verwenden. Und Namen können überladen werden, solange sie einen anderen Geltungsbereich haben. Die Namensverschleierung ist eine grundlegende Transformation, die von den meisten Obfuskatoren für .NET (C# usw.), iOS, Java und Android verwendet wird.
String-Verschlüsselung
In einer verwalteten ausführbaren Datei sind alle Strings eindeutig erkennbar und lesbar. Selbst wenn Methoden und Variablen umbenannt werden, können Strings verwendet werden, um kritische Codeabschnitte zu lokalisieren, indem nach String-Referenzen innerhalb der Binärdatei gesucht wird. Dies gilt auch für Meldungen (insbesondere Fehlermeldungen), die dem Benutzer angezeigt werden. Um eine wirksame Barriere gegen diese Art von Angriffen zu schaffen, verbirgt die String-Verschlüsselung Strings in der ausführbaren Datei und stellt ihren ursprünglichen Wert nur bei Bedarf wieder her. Die Entschlüsselung von Strings zur Laufzeit führt in der Regel zu einem leichten Leistungsabfall zur Laufzeit.
Control Flow Obfuscation
Control Flow Obfuscation synthetisiert bedingte, verzweigende und iterative Konstrukte, die eine gültige ausführbare Logik erzeugen, aber bei der Dekompilierung nicht-deterministische semantische Ergebnisse liefern. Einfacher ausgedrückt: Dekompilierter Code sieht aus wie Spaghetti-Logik, die für einen Hacker sehr schwer zu verstehen ist. Diese Techniken können die Laufzeitleistung einer Methode beeinträchtigen.
Befehlsmustertransformation
Wandelt allgemeine, vom Compiler erzeugte Befehle in andere, weniger offensichtliche Konstrukte um. Dabei handelt es sich um völlig legale Maschinensprache-Anweisungen, die sich möglicherweise nicht sauber auf Hochsprachen wie Java oder C# übertragen lassen. Ein Beispiel ist die Zwischenspeicherung transienter Variablen, die die Stack-basierte Natur der Java- und .NET-Laufzeiten ausnutzt.
Einfügen von Dummy-Code
Einfügen von Code in die ausführbare Datei, der die Logik des Programms nicht beeinträchtigt, aber Decompiler bricht oder die Analyse von Reverse-Engineering-Code erheblich erschwert.
Entfernen von unbenutztem Code und Metadaten
Das Entfernen von Debug-Informationen, nicht benötigten Metadaten und benutztem Code aus Anwendungen macht diese kleiner und reduziert die für einen Angreifer verfügbaren Informationen. Dieses Verfahren kann die Laufzeitleistung leicht verbessern.
Binary Linking/Merging
Diese Transformation kombiniert mehrere ausführbare Eingabedateien/Bibliotheken zu einer oder mehreren Ausgabe-Binärdateien. Linking kann verwendet werden, um Ihre Anwendung zu verkleinern, insbesondere in Verbindung mit Renaming und Pruning. Es kann Einsatzszenarien vereinfachen und die Informationen, die Hackern zur Verfügung stehen, reduzieren.
Opaque Predicate Insertion
Verschleiert, indem bedingte Verzweigungen hinzugefügt werden, die immer zu bekannten Ergebnissen führen – Ergebnisse, die nicht einfach durch statische Analyse ermittelt werden können. Auf diese Weise wird potenziell falscher Code eingefügt, der nie tatsächlich ausgeführt wird, aber Angreifer verwirrt, die versuchen, die dekompilierte Ausgabe zu verstehen.
Anti-Tamper
Ein Obfuscator kann einen Anwendungs-Selbstschutz in den Code einfügen, um zu überprüfen, ob die Anwendung in irgendeiner Weise manipuliert wurde. Wird eine Manipulation festgestellt, kann er die Anwendung herunterfahren, die Funktionalität einschränken, zufällige Abstürze hervorrufen (um den Grund für den Absturz zu verschleiern) oder jede andere benutzerdefinierte Aktion durchführen. Es kann auch eine Nachricht an einen Dienst senden, um Details über die entdeckte Manipulation zu liefern.
Anti-Debug
Wenn ein Hacker versucht, Ihre Anwendung zu rauben oder zu fälschen, Ihre Daten zu stehlen oder das Verhalten einer kritischen Infrastruktursoftware zu ändern, wird er mit ziemlicher Sicherheit mit Reverse Engineering beginnen und Ihre Anwendung mit einem Debugger durchgehen. Ein Obfuscator kann die Anwendung selbst schützen, indem er Code einfügt, der erkennt, ob Ihre Produktionsanwendung in einem Debugger ausgeführt wird. Wenn ein Debugger verwendet wird, kann er sensible Daten beschädigen (um sie vor Diebstahl zu schützen), zufällige Abstürze hervorrufen (um zu verschleiern, dass der Absturz das Ergebnis einer Debug-Prüfung war) oder jede andere benutzerdefinierte Aktion durchführen. Es kann auch eine Nachricht an einen Dienst senden, um ein Warnsignal zu geben.
Sollte ich meine Anwendung verschleiern?
Wenn Sie Software veröffentlichen, die in einer nicht vertrauenswürdigen Umgebung läuft und geistiges Eigentum besitzt, Zugang zu sensiblen Informationen bietet oder über eine eingeschränkte Funktionalität verfügt, sollten Sie die Obfuskation und den Selbstschutz der Laufzeitanwendung unbedingt in Betracht ziehen. Durch die Verschleierung wird es für Angreifer sehr viel schwieriger, den Code zu überprüfen und die Anwendung zu analysieren. Außerdem wird es Hackern erschwert, Ihre Anwendung zu debuggen und zu manipulieren. Ziel ist es, eine Schutzschicht hinzuzufügen, die es erschwert, nützliche Informationen wie Geschäftsgeheimnisse (IP), Anmeldedaten oder Sicherheitslücken aus einer Anwendung zu extrahieren oder zu entdecken. Außerdem soll es schwieriger werden, die Anwendungslogik zu ändern oder eine Anwendung mit bösartigem Code neu zu verpacken.
Schreibe einen Kommentar