Skip to Content
Neue Version 12 verfügbar 🎉
ObfuscatorUmbenennung von Symbolen

Umbenennung von Symbolen

Babel Obfuscator kann Namespaces, Typen, Methoden, Eigenschaften, Ereignisse und Felder umbenennen und erschwert so das Reverse Engineering. Standardmäßig verwendet es für die Umbenennung ASCII-Zeichen. Für noch schwerer lesbare Symbole können Sie Unicode wählen.

Babel benennt interne Symbole automatisch um, nicht aber die Symbole, die für andere Assemblys sichtbar sind. Private und interne Symbole werden also umbenannt, während öffentliche und geschützte Member unverändert bleiben, sofern keine benutzerdefinierten Regeln die Umbenennung erzwingen.

Beachten Sie, dass die Umbenennung öffentlicher Symbole die öffentliche Schnittstelle der Komponente beschädigen kann, weil externer Code von den Namen dieser Symbole abhängen kann. In der Regel empfiehlt es sich, extern sichtbare Symbole nicht umzubenennen und stattdessen die internen Implementierungsdetails zu verschleiern.

Ein Symbol, das nicht für die externe Verwendung gedacht ist, sollte als internal deklariert werden. Dann ist es außerhalb der Assembly nicht sichtbar und gehört nicht zur öffentlichen Schnittstelle.

Wenn Sie die Sichtbarkeit öffentlicher Typen auf internal herabsetzen, erhöhen Sie die Gesamtzahl der verschleierten Member und erhalten dennoch die öffentliche Schnittstelle der Komponente.

Umbenennung von Symbolen konfigurieren

Sie können die Umbenennung in Babel Desktop, auf der Befehlszeile oder mit der MSBuild-Aufgabe konfigurieren.

Babel Desktop

Um die Umbenennung in Babel Desktop zu konfigurieren, öffnen Sie ein Projekt oder legen Sie eines an, wählen Sie die Assembly auf der Zeichenfläche des Projekts aus und setzen Sie die Optionen in der Gruppe Umbenennung des Eigenschaftenbereichs. Die Gruppe enthält die Flags für Typen und Member (ObfuscateTypes, ObfuscateMethods, ObfuscateProperties, ObfuscateEvents, ObfuscateFields, ObfuscateParameters), die Abflachung der Namespaces (FlattenNamespaces), Unicode-Namen (UnicodeNormalization), Namenslänge und Namenspräfix (NameLength, NamePrefix) und die überladene Umbenennung (OverloadedRenaming). Wie Projekte in Babel Desktop funktionieren, beschreibt die Seite Verschleierungsprojekte.

Befehlszeile

Die Konfiguration der Umbenennung in Babel Obfuscator über die Befehlszeilenschnittstelle (CLI) ist ein leistungsfähiger und flexibler Weg, die Verschleierung in Ihren Buildprozess einzubinden, wenn Sie mit CLI-Skripten arbeiten.

Um die Umbenennung in Babel Obfuscator zu konfigurieren, wechseln Sie in der Eingabeaufforderung unter Windows oder im Terminal unter macOS oder Linux in den Ordner Ihres Projekts und geben Sie Folgendes ein:

babel myapp.exe --types --methods --properties --events --fields --parameters

Ersetzen Sie dabei myapp.exe durch den Namen der erstellten Assembly, die Sie verschleiern möchten. Die darauf folgenden CLI-Schalter geben an, welche Arten von Symbolen Sie umbenennen möchten.

Jeder Schalter (--types, --methods und so weiter) schaltet die Umbenennung für die jeweilige Kategorie von Symbolen in Ihrer Assembly ein. Mit diesen Schaltern weisen Sie Babel Obfuscator an, Typen, Methoden, Eigenschaften, Ereignisse, Felder und Parameter umzubenennen. Um eine bestimmte Kategorie von der Umbenennung auszuschließen, stellen Sie dem Symboltyp das Präfix --no voran. Um zum Beispiel die Umbenennung von Typen auszuschalten, verwenden Sie --notypes. Das geht für jeden Symboltyp, sodass Sie selbst festlegen, welche Elemente verschleiert werden.

Um die Hilfe der Befehlszeile zu einzelnen Schaltern der Umbenennung aufzurufen, geben Sie den folgenden Befehl ein

babel --help types

Dadurch wird die ausführliche Hilfe zum Schalter --types angezeigt.

MSBuild-Aufgabe Babel

Die MSBuild-Aufgabe Babel bindet Babel Obfuscator nahtlos in Ihren Buildablauf ein und gibt Ihnen eine fein abgestufte Kontrolle über die Einstellungen der Verschleierung. So legen Sie genau fest, welche Elemente Ihres Codes verschleiert werden, und passen die Verschleierung an Ihre Anforderungen an.

<PropertyGroup> <ObfuscateTypes>true</ObfuscateTypes> <ObfuscateMethods>true</ObfuscateMethods> <ObfuscateProperties>true</ObfuscateProperties> <ObfuscateEvents>true</ObfuscateEvents> <ObfuscateFields>true</ObfuscateFields> <ObfuscateParameters>true</ObfuscateParameters> </PropertyGroup> <Babel ObfuscateTypes="$(ObfuscateTypes)" ObfuscateMethods="$(ObfuscateMethods)" ObfuscateProperties="$(ObfuscateProperties)" ObfuscateEvents="$(ObfuscateEvents)" ObfuscateFields="$(ObfuscateFields)" ObfuscateParameters="$(ObfuscateParameters)" />

Namenspräfix

Mit Babel Obfuscator können Sie jedem generierten Symbolnamen ein Namenspräfix voranstellen. Sie können das Präfix für eine bestimmte Art von Symbolen angeben, etwa für Typen, Methoden, Eigenschaften, Ereignisse, Felder oder Parameter. Das Präfix geben Sie mit --nameprefix oder --prefix an, gefolgt von der gewünschten Präfixzeichenfolge. Zusätzlich können Sie die Art des Symbols, für die das Präfix gelten soll, mit der folgenden Syntax angeben: —prefix [kind]=[prefix]

Babel akzeptiert das Präfix $name, das bei der Umbenennung durch den ursprünglichen Symbolnamen ersetzt wird. Das kann beim Debuggen helfen oder dabei, Probleme zu erkennen, die durch die Umbenennung entstehen.

Befehlszeile

babel myapp.exe --prefix xy_ --prefix types=tp_ --prefix fields=m_

Um mehr über den Befehlszeilenschalter für das Namenspräfix zu erfahren, geben Sie Folgendes ein:

babel --help prefix

MSBuild-Aufgabe Babel

<PropertyGroup> <NamePrefix>xy_;types=tp_;fields=m_</NamePrefix> </PropertyGroup> <Babel NamePrefix="$(NamePrefix)" />

Namenslänge

In Babel Obfuscator legen Sie die Mindestlänge der generierten verschleierten Namen mit der Option --namelength fest, gefolgt von der gewünschten Länge. Das ist nützlich, wenn die verschleierten Namen eine bestimmte Länge haben sollen. Zusätzlich können Sie die Art des Symbols, für die die Namenslänge gelten soll, mit der folgenden Syntax angeben: —namelength [kind]=[value]

Befehlszeile

babel myapp.exe --namelength 3 --namelength types=8

Um mehr über den Befehlszeilenschalter für die Namenslänge zu erfahren, geben Sie Folgendes ein:

babel --help namelength

MSBuild-Aufgabe Babel

<PropertyGroup> <NameLength>3;types=8</NameLength> </PropertyGroup> <Babel NameLength="$(NameLength)" />

Unicode-Zeichensatz

Mit Babel können Sie den Unicode-Zeichensatz festlegen, der beim Generieren der verschleierten Namen verwendet wird. Sie können durch Kommas getrennte Unicode-Zeichen oder Zeichenbereiche angeben, in hexadezimaler oder dezimaler Schreibweise oder als Zeichen.

Befehlszeile

babel myapp.exe --unicode 10,13,a-z,0x4E00-0x4FFF

Um die Unicode-Umbenennung auszuschalten, geben Sie Folgendes ein:

babel myapp.exe --nounicode

MSBuild-Aufgabe Babel

<PropertyGroup> <UnicodeNormalization>10,13,a-z,0x4E00-0x4FFF</UnicodeNormalization> </PropertyGroup> <Babel UnicodeNormalization="$(UnicodeNormalization)" />

Namespaces abflachen

Wenn die Abflachung der Namespaces eingeschaltet ist, entfernt Babel alle Namespace-Informationen aus der verschleierten Assembly und verschiebt alle umbenannten Typen in den globalen Namespace. Das erschwert es einem Angreifer, den Aufbau des Codes zu verstehen und bestimmte Typen oder Member in der Assembly zu finden.

Optional können Sie den Namen des Namespace angeben, den Babel als globalen Container für alle umbenannten Typen verwendet.

Beachten Sie, dass Babel nur bei umbenannten Typen den Namen des Namespace gemäß den Einstellungen für die Abflachung der Namespaces ändert.

Befehlszeile

babel myapp.exe --flatns babel myapp.exe --flatns glbns

Um die Abflachung der Namespaces auszuschalten, geben Sie Folgendes ein:

babel myapp.exe --noflatns

MSBuild-Aufgabe Babel

<PropertyGroup> <FlattenNamespaces>true</FlattenNamespaces> </PropertyGroup> <Babel FlattenNamespaces="$(FlattenNamespaces)" />

Überladene Umbenennung

Die überladene Umbenennung ist eine Technik, mit der Babel Methoden mit unterschiedlichen Signaturen denselben Namen gibt, soweit die Entwurfsregeln von .NET Framework das zulassen. Das erschwert es einem Angreifer, den Code zu verstehen und per Reverse Engineering zu analysieren. Außerdem benennt Babel Überladungen auch dann um, wenn sich nur der Rückgabetyp der Methode unterscheidet. Dadurch lässt sich der Code nicht mehr vollständig in Hochsprachen wie C# und VB.NET dekompilieren, weil diese Sprachen eine Überladung über den Rückgabetyp nicht zulassen.

Befehlszeile

babel myapp.exe --overloaded

Um die überladene Umbenennung auszuschalten, geben Sie Folgendes ein:

babel myapp.exe --nooverloaded

MSBuild-Aufgabe Babel

<PropertyGroup> <OverloadedRenaming>true</OverloadedRenaming> </PropertyGroup> <Babel OverloadedRenaming="$(OverloadedRenaming)" />

Virtuelle Funktionen

Babel kann virtuelle Funktionen verschleiern, indem es sie so umbenennt, dass ihre virtuelle Natur erhalten bleibt. Das Layout der ursprünglichen Tabelle der virtuellen Funktionen (vtable) bleibt also auch nach der Verschleierung bestehen. Das ist wichtig, damit das Programm weiterhin korrekt funktioniert, denn virtuelle Funktionen sind ein wesentlicher Bestandteil vieler objektorientierter Programme. Durch die Verschleierung virtueller Funktionen erschwert Babel es Angreifern, das Verhalten des Programms zu verstehen und Schwachstellen auszunutzen.

Befehlszeile

babel myapp.exe --virtuals

Um die Verschleierung virtueller Funktionen auszuschalten, geben Sie Folgendes ein:

babel myapp.exe --novirtuals

MSBuild-Aufgabe Babel

<PropertyGroup> <VirtualFunctions>true</VirtualFunctions> </PropertyGroup> <Babel VirtualFunctions="$(VirtualFunctions)" />

Lokale Variablen umbenennen

In den .NET-Metadaten werden die Namen lokaler Variablen nicht ausdrücklich gespeichert. Decompiler leiten sie stattdessen aus verschiedenen Anhaltspunkten ab. Wenn zum Beispiel der Typ einer Variablen ausdrücklich angegeben ist, wie im Fall von

var list1 = new List<string>();

kann der Decompiler aus der Zuweisung den Variablennamen „list1“ ableiten.

Alternativ können die Namen lokaler Variablen aus der PDB-Datei (Program Database) der Assembly geladen werden. Die PDB-Datei enthält zusätzliche Debuginformationen, darunter Variablennamen, mit denen Decompiler die ursprünglichen Namen rekonstruieren können.

Um die Offenlegung der Namen lokaler Variablen einzudämmen, bietet Babel Obfuscator die Möglichkeit, Dynamic Proxy für externe Typen einzuschalten.

babel myapp.exe --proxy external

Diese Funktion hüllt die ursprünglichen Typen wie List<string> in Proxy-Typen ein, die umbenannt werden, und verbirgt so die Typen der Variablen.

Stellen Sie unbedingt sicher, dass der verwendete Decompiler die PDB-Datei nicht lädt, denn sonst könnte er die ursprünglichen Variablennamen rekonstruieren. Wenn das Laden der PDB-Datei ausgeschaltet oder die PDB-Datei gelöscht wird, hat der Decompiler nur eingeschränkten Zugriff auf die Debuginformationen.

Für einen umfassenden Schutz des Methodencodes empfiehlt es sich, nach Möglichkeit die Codeverschlüsselung einzuschalten. Die Codeverschlüsselung überführt den Methodencode in eine verschlüsselte Form. Dadurch wird es für Angreifer deutlich schwieriger, den Code zu verstehen oder zu ändern, selbst wenn es ihnen gelingt, die ursprünglichen Variablennamen wiederzugewinnen.

Last updated on