XML-Regeln
Zusätzlich zu den Optionen der Befehlszeile oder der MSBuild-Aufgabe Babel lässt sich Babel Obfuscator über Regeln steuern und konfigurieren, die in externen XML-Dateien definiert sind. Diese XML-Regeln erlauben eine feine Steuerung der Verschleierung und können für bestimmte Assemblys, Typen, Methoden und andere Codeelemente gelten.
Regeldateien
Die Regeldateien von Babel sind XML-Dokumente mit Konfigurationsangaben, die die Verschleierung anpassen und steuern. In diesen Dateien legen Sie genau fest, welche Verschleierungsfunktionen auf welche Teile Ihres Codes angewendet werden, und steuern so den Schutz Ihrer Assemblys im Detail.
<Rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Rule name="rule 1" feature="default" exclude="false">
</Rule>
<Rule name="rule 2" feature="control flow" exclude="true">
</Rule>
</Rules>Das Element Rules kann ein Attribut targetAssembly definieren, das den Geltungsbereich der enthaltenen Regeln auf eine bestimmte Assembly beschränkt. Fehlt das Attribut targetAssembly, gelten die Regeln für alle verarbeiteten Assemblys. Beispiel:
<Rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
targetAssembly="ACME.Data">In der XML-Regeldatei werden die Regeln der Reihe nach von oben nach unten verarbeitet, in der Reihenfolge, in der sie stehen. Dadurch können Sie vorhandene Regeln durch spezifischere Regeln außer Kraft setzen, die weiter unten stehen, und erhalten eine flexible, hierarchische Regelstruktur.
Das Element Rules
Das Element Rules ist der Wurzelcontainer, der einen Satz von Regeln für die Ziel-Assembly definiert. Es kann mehrere Kindelemente Rule enthalten, die jeweils ein anderes Verschleierungsverhalten festlegen.
| Attribut | Beschreibung |
|---|---|
| targetAssembly | Gibt den vollqualifizierten Namen der Assembly an, auf die die Regeln angewendet werden. Fehlt die Angabe, gelten die Regeln für alle Assemblys, die an der Verschleierung beteiligt sind. |
Das Element Rule
Das Element Rule definiert eine Babel-Verschleierungsregel, die für eine oder mehrere Funktionen von Babel Obfuscator gelten kann. Jede Regel legt fest, welche Codeelemente betroffen sind und wie die Verschleierungsfunktionen auf sie angewendet werden.
| Attribut | Beschreibung |
|---|---|
| name | Ein sprechender, beschreibender Name der Regel, an dem ihr Zweck erkennbar ist |
| feature | Der Name der Funktion des Obfuscators, für die die Regel gilt, oder eine durch Kommas getrennte Liste solcher Namen. Mit mehreren Funktionen gilt dieselbe Regel für verschiedene Aspekte der Verschleierung |
| exclude | Boolescher Wert, der angibt, ob die Regel die Ausführung der angegebenen Funktion(en) verhindert. Mit „true“ werden Symbole von der Verschleierung ausgeschlossen, mit „false“ ausdrücklich eingeschlossen |
| applyToMembers | Boolescher Wert, der angibt, ob die Regel auf alle Member eines Symbols angewendet wird, das den Kriterien der Regel entspricht. Ist er gesetzt, gilt die Regel auch für geschachtelte Member |
| locked | Boolescher Wert, der angibt, ob die Regel unveränderlich ist und von nachfolgenden Regeln in der Verarbeitungsreihenfolge nicht außer Kraft gesetzt werden kann |
Das Attribut feature legt die Funktion des Obfuscators fest, auf die die Regel wirkt. Die Attribute name und exclude sind Pflicht, das Attribut feature ist optional. Fehlt es, gilt der Wert „default“, der für die Umbenennung steht.
Die Funktionen des Obfuscators sind vordefinierte Zeichenfolgen, die für bestimmte Fähigkeiten der Verschleierung stehen. Die folgenden Tabellen führen alle unterstützten Funktionsnamen auf.
Tabelle der Funktionen
Die folgenden Funktionen können für alle Arten von Symbolen gelten, die in einer Assembly definiert sind, also für Typen, Methoden, Eigenschaften, Felder und Ereignisse:
| Funktion | Beschreibung |
|---|---|
| all | Gilt für alle verfügbaren Verschleierungsfunktionen |
| default | Die Standardfunktion steht für die Verschleierung durch Umbenennung von Symbolen |
| agent | Gilt für den Verschleierungs-Agent |
| cleanup attributes | Entfernt unerwünschte Attribute aus den Metadaten der Assembly |
| control flow | Wendet die Kontrollflussverschleierung an, damit die Logik des Codes schwerer zu verstehen ist |
| dead code | Schaltet die Optimierung ein, die ungenutzten Code entfernt |
| dynamic proxy | Ersetzt direkte Methodenaufrufe durch dynamische Proxy-Aufrufe |
| embed | Bettet abhängige Assemblys in die Ziel-Assembly ein |
| merge | Führt mehrere Assemblys zu einer einzigen Assembly zusammen |
| msil encryption | Verschlüsselt Methodenrümpfe mit der Verschlüsselung von MSIL-Code (Microsoft Intermediate Language) |
| renaming | Verschleiert die Namen der Member (Typen, Methoden, Eigenschaften, Felder, Ereignisse) |
| renaming blob | Benennt Zeichenfolgenliterale um, die umbenannten Symbolen entsprechen, damit der Code funktionsfähig bleibt |
| resource encryption | Verschlüsselt die in die Assembly eingebetteten Ressourcen |
| string encryption | Verschlüsselt die Zeichenfolgenliterale im Code |
| value encryption | Verschlüsselt konstante Inline-Werte und Arrayinitialisierungen |
| inline | Erweitert Methodenaufrufe inline, damit die Struktur des Codes weniger erkennbar ist |
| instrumentation | Schaltet die Instrumentierung des Codes für Überwachung und Analyse ein |
| optimizations | Wendet verschiedene Metadaten- und Codeoptimierungen an |
| xaml | Behandelt die Umbenennung von Symbolen, die in XAML- oder BAML-Ressourcen referenziert werden |
Die folgenden Verschleierungsfunktionen sind methodenspezifisch und lassen sich nur auf Methoden anwenden:
| Funktion | Beschreibung |
|---|---|
| msil encryption get stream | Deklariert die Methode, die den Quelldatenstrom des verschlüsselten Codes für die MSIL-Entschlüsselung liefert |
| string encryption encrypt method | Legt die benutzerdefinierte Methode fest, die Zeichenfolgenliterale verschlüsselt |
| string encryption decrypt method | Legt die benutzerdefinierte Methode fest, die Zeichenfolgenliterale zur Laufzeit entschlüsselt |
| instrumentation on entry method | Legt die Methode fest, die beim Eintritt in eine instrumentierte Methode aufgerufen wird |
| instrumentation on exit method | Legt die Methode fest, die beim Verlassen einer instrumentierten Methode aufgerufen wird |
| instrumentation on exception method | Legt die Methode fest, die aufgerufen wird, wenn in einer instrumentierten Methode eine Ausnahme auftritt |
| module initializer | Bestimmt eine Methode, die automatisch ausgeführt wird, wenn die Laufzeit das Modul initialisiert |
Jedes Element Rule kann Kindelemente wie Access, Target, Pattern, HasAttribute, Properties und Description enthalten. Das Element Pattern ist Pflicht, alle anderen sind optional. Mit diesen Kindelementen lässt sich die Regel weiter filtern und konfigurieren. Beispiel:
<Rule name="DataWriter" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>SQLUtils.DataWriter::*</Pattern>
<Properties>
<Cache>true</Cache>
<MinInstructionCount>6</MinInstructionCount>
</Properties>
<Description>Encrypt all methods of the DataWriter class.</Description>
</Rule>Die folgende Liste enthält alle möglichen Kindelemente von Rule:
| Element |
|---|
| Access |
| Targets |
| Pattern |
| HasAttribute |
| HasBase |
| Implements |
| Namespace |
| Properties |
| Description |
Das Element Access
Beschränkt den Geltungsbereich der Regel auf Symbole mit der angegebenen Sichtbarkeit. Mögliche Werte sind All oder eine beliebige Kombination von Public, Protected, Internal, Private, FamilyAndAssembly und FamilyOrAssembly. Fehlt das Element, gilt der Standardwert All: Die Regel gilt dann für Symbole jeder Sichtbarkeit.
| Access | Beschreibung |
|---|---|
| Public | Zugriff von jedem Typ in jeder Assembly. |
| Protected | Zugriff innerhalb desselben Typs wie der Member und von allen abgeleiteten Typen, die von ihm erben (auch Family-Zugriff genannt). |
| Internal | Zugriff nur innerhalb der Assembly, in der der Typ definiert ist (auch Assembly-Zugriff genannt). |
| Private | Zugriff nur innerhalb desselben Typs wie der Member oder von einem Typ, der in diesem Typ geschachtelt ist. |
| FamilyOrAssembly | Zugriff von Typen, für die Family-Zugriff oder Assembly-Zugriff gilt (in C# protected internal). |
| FamilyAndAssembly | Zugriff nur von Typen, für die sowohl Family-Zugriff als auch Assembly-Zugriff gilt (in C# private protected). |
Das Element Targets
Beschränkt den Geltungsbereich der Regel auf bestimmte Arten von Codesymbolen. Zulässige Werte sind All oder eine beliebige Kombination von Classes, Delegates, Structures, Interfaces, Enums, Events, Methods, Properties, Fields, StaticFields und Resources. Fehlt das Element, wird der Standardwert All angenommen, und die Regel gilt für alle Arten von Symbolen.
Das Element Pattern
Das Element Pattern in der Definition einer XML-Regel von Babel Obfuscator bestimmt, welche Symbole der Assembly die Regel erfasst und welche damit der Verschleierung unterliegen. Es nimmt einen vollqualifizierten Symbolnamen, einen Ausdruck mit Platzhaltern oder einen regulären Ausdruck an und bildet damit einen vielseitigen, anpassungsfähigen Filter für bestimmte Codeelemente.
Ausdrücke mit Platzhaltern: Für einfachere Auswahlkriterien kann das Element Pattern Platzhalterzeichen enthalten. Das Zeichen „?“ steht für ein beliebiges einzelnes Zeichen, „*“ für null oder mehr Zeichen. So lassen sich breite und dennoch kontrollierte Auswahlkriterien formulieren und Gruppen zusammengehöriger Symbole erfassen, ohne komplexe Muster zu schreiben.
Reguläre Ausdrücke: Für komplexere und genauere Filter können im Element Pattern reguläre Ausdrücke verwendet werden. Dazu muss das Attribut isRegEx den Wert „true“ haben. Es gibt an, dass das Muster als regulärer Ausdruck und nicht als wörtliche Zeichenfolge oder Platzhaltermuster zu lesen ist. Es empfiehlt sich, den regulären Ausdruck in einen CDATA-Abschnitt zu setzen, damit das XML korrekt geparst wird und Sonderzeichen richtig interpretiert werden. Zum Beispiel:
<Pattern isRegEx="true"><![CDATA[^Properties.*]]></Pattern> Format des vollqualifizierten Namens
Das Format eines vollqualifizierten Symbolnamens im Muster einer XML-Regel von Babel Obfuscator hängt von der Art des Symbols ab. Diese Unterscheidung sorgt für eine genaue und wirksame Verschleierung über alle Arten von Symbolen hinweg und hält die Schreibweise klar und einheitlich.
Typen (Klassen, Strukturen, Enumerationen, Schnittstellen): Das übliche Format ist NamespaceName.TypeName, eine einfache Schreibweise für gewöhnliche Typdeklarationen.
Geschachtelte Typen: Für geschachtelte Typen (Typen, die in anderen Typen definiert sind) verwendet das Format einen Schrägstrich als Trennzeichen: NamespaceName.TypeName/NestedTypeName. Diese Schreibweise unterscheidet geschachtelte Typen klar von ihren umschließenden Typen und bildet die Hierarchie ab.
Generische Typen: Die Schreibweise für generische Typen beginnt mit NamespaceName.TypeName, gefolgt von den generischen Typargumenten in spitzen Klammern:
NamespaceName.TypeName<GenericArgumentList>
GenericArgumentList: Dieses Element ist kein eigenständiges Muster, sondern fester Bestandteil des Musters für generische Typen. Es ist die durch Kommas getrennte Liste der generischen Typargumente, jedes mit vollständigem Namespace und Typnamen angegeben:
NamespaceName.TypeName1,NamespaceName.TypeName2,...,NamespaceName.TypeNameN
Methoden: Das übliche Format für Methoden enthält den Namespace, den Typnamen, den Methodennamen, die Parameterliste und optional den Rückgabetyp:
NamespaceName.TypeName::MethodName(ParameterList):ReturnType
Die Angabe von ReturnType im Muster ist optional und kann in den meisten Fällen entfallen.
Eigenschaften: Das Format für Eigenschaften hat diesen Aufbau:
NamespaceName.TypeName::PropertyName:PropertyType
Der Typ der Eigenschaft muss im Muster in der Regel nicht angegeben werden und kann entfallen.
Ereignisse: Das Format für Ereignisse lautet:
NamespaceName.TypeName::EventName:EventHandlerType
Dieses Format umfasst den Namen des Ereignisses und den Typ des zugehörigen Handlers.
Felder: Felder folgen diesem Format:
NamespaceName.TypeName::FieldName:FieldType
Wie bei Eigenschaften ist der Typ des Feldes in der Regel optional und in den meisten Mustern nicht erforderlich.
ParameterList: Dieser Bestandteil gehört ausschließlich zum Muster für Methoden. Er führt die vollqualifizierten Typnamen der Parameter auf, durch Kommas getrennt:
NamespaceName.TypeName1,NamespaceName.TypeName2,...,NamespaceName.TypeNameN
Mit diesen Mustern legen Sie genau fest, welche Teile des Codes Babel Obfuscator verschleiern soll. Die genaue Syntax kann je nach Kontext und nach den Anforderungen Ihrer Verschleierungsstrategie leicht abweichen. Genaue Muster stellen sicher, dass die Verschleierungsregeln nur die beabsichtigten Symbole betreffen.
Das Element HasAttribute
Gibt eine durch Kommas getrennte Liste vollqualifizierter Typnamen benutzerdefinierter Attribute an. Trägt das Symbol mindestens eines dieser Attribute, wird die Regel auf dieses Symbol angewendet. Mit diesem Element filtern Sie nach Attributen und grenzen die Regel genau ein.
Das Element unterstützt das optionale Attribut onEnclosingType. Hat es den Wert „true“, wird das benutzerdefinierte Attribut nicht am Symbol selbst geprüft, sondern an dem Typ, der das Symbol umschließt:
<HasAttribute onEnclosingType="true">System.SerializableAttribute</HasAttribute>Diese Konfiguration erfasst Symbole wie Methoden, Eigenschaften, Felder und Ereignisse, die zu einem Typ mit dem Attribut SerializableAttribute gehören.
Das Element HasBase
Gibt eine durch Kommas getrennte Liste vollqualifizierter Namen von Basistypen an. Die Regel erfasst einen Typ, wenn er von einem der angegebenen Basistypen abgeleitet ist. Mit diesem Element filtern Sie nach der Vererbung.
Das Element unterstützt das optionale Attribut onEnclosingType. Hat es den Wert „true“, sucht Babel in der Hierarchie des Typs, der die Symbole umschließt. So lassen sich Regeln nach der Vererbungsstruktur der umschließenden Typen anwenden.
Das Element Namespace
Beschränkt die Regel auf Symbole in einem angegebenen Namespace. Damit filtern Sie auf der Ebene der Namespaces.
<Namespace>ACME.Data</Namespace>Die Regel wird auf alle Symbole angewendet, die im Namespace ACME.Data und seinen untergeordneten Namespaces definiert sind.
Das Element Properties
Das Element Properties enthält eine Reihe von XML-Kindelementen, die das Verhalten der Funktion anpassen, für die die Regel gilt. Jede Verschleierungsfunktion unterstützt eigene Eigenschaften, die ihre Arbeitsweise steuern und fein abstimmen, wie sie die erfassten Symbole verarbeitet.
<Rule name="DataWriter" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>ACME.Data.DataWriter::*</Pattern>
<Properties>
<Cache>true</Cache>
<MinInstructionCount>6</MinInstructionCount>
</Properties>
<Description>Encrypts code in the DataWriter class.</Description>
</Rule>Diese Regel konfiguriert die Funktion msil encryption, indem sie die Eigenschaften Cache und MinInstructionCount für alle Methoden der Klasse DataWriter setzt.
Die folgende Übersicht führt alle Eigenschaftselemente auf, die die einzelnen Verschleierungsfunktionen unterstützen:
agent
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| TaskNameList | Zeichenfolge | Eine durch Kommas getrennte Liste der Namen der Agent-Aufgaben, für die die Regel gilt. |
cleanup attributes
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| Attributes | Zeichenfolge | Eine durch Kommas getrennte Liste qualifizierter Typnamen von Attributen oder regulärer Ausdrücke, die auf die in die Suche einzubeziehenden Member passen. |
| IncludeMembers | Zeichenfolge | Eine durch Kommas getrennte Liste qualifizierter Symbolnamen oder regulärer Ausdrücke, die auf die in die Suche einzubeziehenden Member passen. |
| ExcludeMembers | Zeichenfolge | Eine durch Kommas getrennte Liste qualifizierter Symbolnamen oder regulärer Ausdrücke, die auf die von der Suche auszuschließenden Member passen. |
control flow
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| ILIterations | Ganzzahl | Gibt die Anzahl der Iterationen der Kontrollflussverschleierung an. Höhere Werte erzeugen komplexere Codestrukturen. |
| EmitInvalidOpcodes | Boolescher Wert | Wenn eingeschaltet, werden ungültige Opcodes in den Ablauf der Methode eingefügt, um Disassembler und Decompiler zu verwirren. |
| ChangeIfStatement | Boolescher Wert | Wenn eingeschaltet, werden bedingte if-Anweisungen transformiert und verschleiert, damit die Logik schwerer nachzuvollziehen ist. |
| AddSwitchStatement | Boolescher Wert | Wenn eingeschaltet, wird der Kontrollfluss angereichert: In den Ablauf der Methode werden switch-Anweisungen eingefügt, sodass komplexere Ausführungspfade entstehen. |
| ScrambleControlFlow | Boolescher Wert | Wenn eingeschaltet, entsteht „Spaghetticode“: Eingefügte irrelevante Verzweigungen und Sprunganweisungen verdecken den ursprünglichen Kontrollfluss erheblich. |
| MaxSwitchTargets | Ganzzahl | Legt die maximale Anzahl der case-Ziele fest, die bei der Kontrollflussverschleierung mit switch zulässig sind, und steuert so die Komplexität der erzeugten switch-Anweisungen. |
| HideCaseConstantExpressions | Boolescher Wert | Wenn eingeschaltet, werden die berechneten Konstantenwerte bei der Kontrollflussverschleierung mit switch verborgen: An die Stelle von Literalwerten treten berechnete Ausdrücke. |
| RandomCall | Boolescher Wert | Wenn eingeschaltet, werden zufällige Methodenaufrufe eingefügt, um die Analyse weiter zu erschweren (nur verfügbar, wenn die Kontrollflussverschleierung mit switch eingeschaltet ist). |
| AddMethodToken (*) | Boolescher Wert | Wenn eingeschaltet, wird der Kontrollfluss angereichert: In den Ablauf der Methode werden Anweisungen zum Laden von Token eingefügt, was die Komplexität weiter erhöht. |
| StackUnderflow (*) | Boolescher Wert | Wenn eingeschaltet, werden Anweisungen eingefügt, die einen Unterlauf des Auswertungsstapels herbeiführen. Das erschwert die statische Analyse. |
(*) Diese Optionen erzeugen nicht verifizierbaren IL-Code. Schalten Sie sie nicht ein, wenn Ihre Assembly in einer teilweise vertrauenswürdigen Umgebung laufen oder die Prüfung durch PEVerify bestehen muss.
renaming
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| DisableOverloading | Boolescher Wert | Wenn eingeschaltet, wird die überladene Umbenennung ausgeschaltet: Methoden mit unterschiedlichen Signaturen erhalten dann unterschiedliche verschleierte Namen, statt denselben Namen zu teilen. |
| DisableUnicode | Boolescher Wert | Wenn eingeschaltet, werden in verschleierten Namen keine Unicode-Zeichen verwendet. Die Namen bestehen dann nur aus ASCII-Zeichen. |
| Internalize | Boolescher Wert | Wenn eingeschaltet, wird die Sichtbarkeit aller öffentlichen Typen, die die Regel erfasst, von public auf internal geändert. Das verkleinert die API-Oberfläche der Assembly. |
| NameLength | Ganzzahl | Gibt die gewünschte Namenslänge umbenannter Symbole an. Damit steuern Sie, wie lang oder kurz verschleierte Bezeichner sind. |
| NamePrefix | Zeichenfolge | Legt ein Namenspräfix fest, das allen umbenannten Symbolen vorangestellt wird. So lassen sich verschleierte Namen erkennen oder einordnen. |
string encryption
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| MinInstructionCount | Ganzzahl | Legt fest, wie viele Anweisungen eine Methode mindestens enthalten muss, damit die Regel angewendet wird. Methoden mit weniger Anweisungen werden ausgeschlossen. |
| MaxInstructionCount | Ganzzahl | Legt fest, wie viele Anweisungen eine Methode höchstens enthalten darf, damit die Regel angewendet wird. Methoden mit mehr Anweisungen werden ausgeschlossen. |
merge
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| CopyAttributes | Zeichenfolge | Eine durch Kommas getrennte Liste vollqualifizierter Typnamen benutzerdefinierter Attribute oder regulärer Ausdrücke. Sie filtert, welche Attribute bei der Zusammenführung aus der Quell-Assembly in die Ziel-Assembly kopiert werden. |
| NoCopyAttributes | Zeichenfolge | Eine durch Kommas getrennte Liste vollqualifizierter Typnamen benutzerdefinierter Attribute oder regulärer Ausdrücke. Sie filtert, welche Attribute bei der Zusammenführung NICHT in die Ziel-Assembly kopiert werden. |
| Internalize | Boolescher Wert | Wenn eingeschaltet, wird die Sichtbarkeit aller zusammengeführten Typen, die die Regel erfasst, von public auf internal geändert. Externe Assemblys sehen sie dann nicht mehr. |
| MergeAction | Default/Discard/Redirect | Legt fest, wie der ausgewählte Typ bei der Zusammenführung behandelt wird. Default führt ihn normal zusammen, Discard schließt ihn von der Zusammenführung aus, und Redirect leitet Referenzen auf einen anderen Typ in der Ziel-Assembly um (angegeben in der Eigenschaft RedirectTo). |
| RedirectTo | Zeichenfolge | Enthält den vollqualifizierten Namen des Typs in der Ziel-Assembly, der den Quelltyp ersetzt, wenn die Aktion Redirect angegeben ist. |
msil encryption
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| Cache | Boolescher Wert | Wenn eingeschaltet, wird die entschlüsselte Methode im Arbeitsspeicher zwischengespeichert, sodass die JIT-Kompilierung nur beim ersten Zugriff stattfindet. Das verbessert die Leistung bei späteren Zugriffen. |
| Internal | Boolescher Wert | Wenn eingeschaltet, wird der MSIL-verschlüsselte Code in der Ziel-Assembly selbst gespeichert, wenn ausgeschaltet, in einer externen Datei. |
| Password | Zeichenfolge | Gibt das Passwort an, mit dem der Code der Methode verschlüsselt wird. Das fügt eine weitere Schutzebene hinzu. |
| Source | Zeichenfolge | Legt einen Quellennamen für den verschlüsselten Code fest. Das ist nützlich, um mehrere Verschlüsselungsquellen zu ordnen. |
| MinInstructionCount | Ganzzahl | Legt fest, wie viele Anweisungen eine Methode mindestens enthalten muss, damit die Regel angewendet wird. |
| MaxInstructionCount | Ganzzahl | Legt fest, wie viele Anweisungen eine Methode höchstens enthalten darf, damit die Regel angewendet wird. |
optimizations
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
| ClassSealing | Boolescher Wert | Wenn eingeschaltet, werden Klassen versiegelt: Klassen ohne abgeleitete Typen werden als sealed (final) markiert. Das verbessert die Leistung. |
| ConstRemoval | Boolescher Wert | Wenn eingeschaltet, werden die Metadaten der Konstantenfelder entfernt und die Referenzen im Code direkt durch Literalwerte ersetzt. |
| DisgregateRemoval | Boolescher Wert | Wenn eingeschaltet, werden die Metadaten von Eigenschaften und Ereignissen entfernt. Das verringert den Umfang der Metadaten der Assembly. |
| EnumRemoval | Boolescher Wert | Wenn eingeschaltet, werden die Definitionen von Enumerationstypen entfernt und durch ihre zugrunde liegenden ganzzahligen Typen ersetzt. |
| UnwantedAttributes | Boolescher Wert | Wenn eingeschaltet, werden unerwünschte benutzerdefinierte Attribute entfernt, die Implementierungsdetails oder Debuginformationen preisgeben können. |
Das Element Description
Enthält einen beschreibenden Text zu Zweck und Verhalten der Regel. Die Beschreibung erscheint im Protokoll der Verschleierung. So ist bei der Durchsicht des Protokolls leichter zu erkennen, was jede Regel bewirkt.
Regeln konfigurieren
Regeldateien können Sie Babel Obfuscator über die Befehlszeile, die MSBuild-Aufgabe Babel oder Babel Desktop übergeben. Wählen Sie den Weg, der zu Ihrem Build passt.
Befehlszeile
babel myapp.exe --rules babelRules.xmlDie Option --rules kann auf der Befehlszeile mehrfach angegeben werden, um weitere XML-Regeldateien einzubeziehen. So können Sie die Regeln auf getrennte Dateien verteilen und nach Bedarf kombinieren.
MSBuild-Aufgabe Babel
<ItemGroup>
<RuleFile Include="babelRules.xml" />
</ItemGroup>
<Babel RulesFiles="@(RuleFile)" />Die Option RulesFiles von Babel Obfuscator nimmt eine Liste von XML-Regeldateien an, die Sie mit dem Element ItemGroup in Ihrer MSBuild-Projektdatei definieren. So lassen sich mehrere Regeldateien angeben und innerhalb der Projektstruktur leicht verwalten. Jede in der Elementgruppe aufgeführte Regeldatei ist eine eigene Eingabe für Babel Obfuscator und kann für verschiedene Teile Ihrer Codebasis unterschiedliche Verschleierungsregeln und Einstellungen festlegen.
Zusätzlich zu externen XML-Regeldateien können Sie die XML-Regeln direkt in die Projektdatei einbetten, und zwar mit dem Attribut XmlRules der Babel-Aufgabe, wie unten gezeigt:
<PropertyGroup>
<XmlRules>
<Rules targetAssembly="Acme, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f66185f16ea61c16">
<Rule name="rule1" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>Acme.Engine*</Pattern>
<Description>Enable MSIL Code Encryption in Acme Engine</Description>
</Rule>
</Rules>
<Rules targetAssembly="Acme.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f66185f16ea61c16">
<Rule name="rule2" feature="control flow" exclude="true">
<Target>Methods</Target>
<Pattern>Acme.Entities.*</Pattern>
<Description>Disable Control Flow Obfuscation for EF classes</Description>
</Rule>
</Rules>
</XmlRules>
</PropertyGroup>
<Babel XmlRules="$(XmlRules)" />Wenn Babel Obfuscator in einem Projekt mehrere Ziel-Assemblys verarbeitet, geben Sie mit dem Attribut targetAssembly in den XML-Regeln an, auf welche Ziel-Assembly ein Satz von Regeln angewendet wird. Das Attribut bezeichnet eine bestimmte Assembly mit ihrem vollqualifizierten Namen, einschließlich Version, Gebietsschema und Token des öffentlichen Schlüssels. Fehlt das Attribut targetAssembly, gelten die Regeln für alle Ziel-Assemblys, die im Projekt definiert sind.
Babel Desktop
Um externe XML-Regeldateien zu verwenden, wählen Sie die Ziel-Assembly auf der Zeichenfläche des Projekts aus und fügen Sie die Dateien im Eigenschaftenbereich in der Gruppe „Dateien und Abhängigkeiten“ zu RulesFiles hinzu.
Um eingebettete Regeln zu schreiben, öffnen Sie die Ansicht „XML-Regeln“ der ausgewählten Assembly (die Registerkarte „XML-Regeln“ des Eigenschaftenbereichs oder Einstellungen > Ausgewählte Assembly > XML-Regeln). Der Editor validiert die Regeln gegen das XML-Schema von Babel und meldet Fehler mit Zeile und Spalte. Außerdem kann er Regeldokumente als XML-Dateien öffnen und speichern.
Eingebettete Regeln werden in der Projektdatei gespeichert, in der Eigenschaft XmlRules der Babel-Aufgabe, wie im MSBuild-Beispiel oben. Sie werden daher zusammen mit der Projektkonfiguration gespeichert und versioniert. Wie Sie in Babel Desktop mit Projekten arbeiten, beschreibt die Seite Verschleierungsprojekte.