Skip to Content
Neue Version 12 verfügbar 🎉

.NET-App veröffentlichen

Dieses Beispiel zeigt, wie Sie mit der Babel-Aufgabe die assemblyübergreifende Umbenennung im Buildprozess einer .NET-Anwendung konfigurieren. Konkret wird die öffentliche Schnittstelle des Pakets MathNet.Numerics verschleiert, um zu zeigen, wie Sie eine verschleierte Anwendung veröffentlichen, die eine verschleierte Assembly verwendet. Für dieses Beispiel ist das NuGet-Paket Babel.Obfuscator erforderlich, und um es zu verwenden, brauchen Sie eine Lizenz der Edition Ultimate oder Server. Das Beispiel zeigt, wie Sie die assemblyübergreifende Umbenennung konfigurieren, um den Verschleierungsgrad der Anwendung zu erhöhen und das Reverse Engineering zu erschweren.

Der vollständige Quellcode des Beispiels ist auf GitHub verfügbar und lässt sich mit dem folgenden Befehl herunterladen:

git clone https://github.com/babelfornet/cross-assembly-reference-example.git

Der Beispielcode ist eine einfache .NET-Konsolenanwendung, die mit der Bibliothek MathNet.Numerics einige grundlegende statistische Operationen ausführt.

Um die assemblyübergreifende Umbenennung zu konfigurieren, referenzieren wir zunächst das NuGet-Paket von Babel Obfuscator, entweder mit dem NuGet-Paket-Manager von Visual Studio oder indem wir der Projektdatei die folgende MSBuild-Anweisung hinzufügen:

<PackageReference Include="Babel.Obfuscator" Version="10.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference>

Damit wird die Ziel-Assembly Math.dll verschleiert, ohne dass die assemblyübergreifende Umbenennung eingeschaltet ist.

Sobald das Paket hinzugefügt ist, können wir mit der Babel-Aufgabe die assemblyübergreifende Umbenennung im Buildprozess konfigurieren, indem wir die öffentliche Schnittstelle der referenzierten Bibliothek MathNet.Numerics aus dem NuGet-Paket umbenennen.

<!-- Obfuscate the public interface of MathNet.Numerics reference --> <Target Name="BeforeObfuscate"> <PropertyGroup> <MathNetNumerics Condition="'%(filename)' == 'MathNet.Numerics'">@(ReferencePathWithRefAssemblies->'%(fullpath)')</MathNetNumerics> <MathNetRules> <Rules> <Rule name="rename public" feature="renaming" exclude="false"> <Access>Public</Access> <Pattern>*</Pattern> </Rule> </Rules> </MathNetRules> </PropertyGroup> <Message Text="MathNet.Numerics: $(MathNetNumerics)" Importance="high" /> <Babel InputFile="$(MathNetNumerics)" OutputFile="$(TargetDir)MathNet.Numerics.dll" FlattenNamespaces="true" XmlRules="$(MathNetRules)" GenerateMapOutFile="true" /> </Target>

Konkret müssen wir den vollständigen Pfad der referenzierten Komponenten aus der Liste der Referenzen ermitteln, mit denen die Anwendung erstellt wird.

<MathNetNumerics Condition="'%(filename)' == 'MathNet.Numerics'">@(ReferencePathWithRefAssemblies->'%(fullpath)')</MathNetNumerics>

Dieser Pfad ist die Eingabe der Babel-Aufgabe, zusammen mit der XML-Regel, die Babel anweist, die öffentliche Schnittstelle der Komponente umzubenennen. Außerdem müssen wir die Map-Datei erzeugen, die bei der Verschleierung der Ziel-Assembly verwendet wird, indem wir die Eigenschaft GenerateMapOutFile="true" setzen.

Beachten Sie, dass wir das Ziel BeforeObfuscate genannt haben. Das ist ein vom NuGet-Paket von Babel Obfuscator definierter Einstiegspunkt, an dem sich zusätzliche Aufgaben ausführen lassen, bevor die Ziel-Assembly verschleiert wird.

Um die assemblyübergreifende Umbenennung für die Ziel-Assembly Math.dll einzuschalten, müssen wir die XML-Map-Datei, die für die referenzierte Bibliothek MathNet.Numerics.dll erzeugt wurde, der Verschleierungsaufgabe für die Ziel-Assembly hinzufügen. Das geschieht über die Eigenschaften des NuGet-Pakets von Babel Obfuscator, die in der Referenz des Pakets beschrieben sind.

<!-- Target assembly obfuscation settings --> <ItemGroup> <MapInFile Include="$(TargetDir)MathNet.Numerics.dll.map.xml" /> </ItemGroup> <PropertyGroup> <StringEncryption>true</StringEncryption> <ValueEncryption>array=true;true;</ValueEncryption> <ControlFlowObfuscation>goto=on;if=on;switch=on;case=on;call=on</ControlFlowObfuscation> <CopyOutputSymbolsToPublishDirectory>false</CopyOutputSymbolsToPublishDirectory> </PropertyGroup>

Damit Angreifer keine zusätzlichen Informationen gewinnen, die sich zur Analyse des verschleierten Codes nutzen lassen, wurde die Veröffentlichung von PDB-Dateien mit der folgenden Einstellung ausgeschaltet:

CopyOutputSymbolsToPublishDirectory=false.

PDB-Dateien enthalten Debuginformationen wie Namen von Quellcodedateien und Zeilennummern, die es Angreifern erleichtern können, den verschleierten Code zu verstehen.

Beim Erstellen des Projekts wird die assemblyübergreifend verschleierte Anwendung im Zielverzeichnis erzeugt. Um das Bereitstellungspaket zu erstellen, muss die Dateireferenz auf MathNet.Numerics.dll aus dem NuGet-Paket durch den Dateipfad der verschleierten Version ersetzt werden. Dieser Schritt ist nötig, damit Visual Studio die richtigen, verschleierten Assemblys verpackt.

<!-- Replace the deployed MathNet.Numerics.dll assembly reference with the obfuscated one --> <Target Name="UpdateFilesToPublish" AfterTargets="ComputeFilesToPublish"> <ItemGroup> <ResolvedFileToPublish Remove="$(MathNetNumerics)" /> <ResolvedFileToPublish Include="$(TargetDir)MathNet.Numerics.dll"> <RelativePath>MathNet.Numerics.dll</RelativePath> </ResolvedFileToPublish> </ItemGroup> </Target>

Das gezeigte MSBuild-XML-Fragment ist ein Ziel mit dem Namen UpdateFilesToPublish, das nach dem Ziel ComputeFilesToPublish ausgeführt wird. Dieses Ziel ersetzt im Bereitstellungspaket die ursprüngliche Referenz auf die Assembly MathNet.Numerics.dll aus dem NuGet-Paket durch die verschleierte.

Das Ziel definiert zunächst eine Elementgruppe, die die ursprüngliche Referenz auf die Datei MathNet.Numerics.dll entfernt. Dazu verwendet sie das Attribut „Remove“ und verweist auf die Eigenschaft mit dem ursprünglichen Dateipfad.

Anschließend fügt das Ziel der Elementgruppe die verschleierte Version der Datei MathNet.Numerics.dll hinzu. Dazu verwendet es das Attribut „Include“ und verweist auf den Pfad der verschleierten Datei im Zielverzeichnis. Das Element „RelativePath“ gibt den relativen Pfad der Datei ab dem Stammverzeichnis der Bereitstellung an.

Bei der Ausführung entfernt das Ziel die ursprüngliche Dateireferenz und fügt dem Bereitstellungspaket die Referenz auf die verschleierte Datei hinzu, sodass die verschleierte Assembly anstelle der ursprünglichen bereitgestellt wird.

Um die vollständig verschleierte Anwendung zu veröffentlichen, wechseln Sie in den Projektordner und führen den folgenden Befehl aus:

dotnet publish

Insgesamt dient das Beispiel als Ausgangspunkt für Entwickler, die die Babel-Verschleierung in ihre .NET-Buildpipeline integrieren und ihren Code mit assemblyübergreifender Verschleierung schützen möchten. Zusätzlich haben wir einige ergänzende Hinweise gegeben, wie sich das Bereitstellungspaket so anpassen lässt, dass es die verschleierten Assemblys enthält.

Last updated on