Skip to Content
Neue Version 12 verfügbar 🎉
ObfuscatorNuGet-PaketZusammenführung in eine Datei

Eine verschleierte Datei: Abhängigkeiten zusammenführen

Wer eine Anwendung zusammen mit den DLLs ihrer Abhängigkeiten ausliefert, bietet einem Angreifer mehr Angriffsfläche, und diese Bibliotheken sind meist überhaupt nicht verschleiert. Dieses Beispiel verwendet das NuGet-Paket von Babel Obfuscator, um eine referenzierte Assembly mit dem Host zusammenzuführen, ihre öffentlichen Typen zu internalisieren und das Ergebnis zu verschleiern. Sie liefern also eine einzige, eigenständige Datei aus, ohne lose, lesbare Bibliotheken.

Für dieses Beispiel brauchen Sie eine Standortlizenz für Babel Obfuscator (Edition Ultimate, Server oder Data Center). Der Quellcode ist auf GitHub verfügbar:

git clone https://github.com/babelfornet/single-file-merge-nuget-example.git

PaymentCore ist eine gewöhnliche Klassenbibliothek mit einer öffentlichen API (src/PaymentCore/PaymentProcessor.cs), die Checkout wie jede andere Abhängigkeit verwendet:

// PaymentCore (the dependency) public sealed class PaymentProcessor { public PaymentProcessor(decimal feeRate) => _feeRate = feeRate; public decimal Charge(decimal amount) => amount + Math.Round(amount * _feeRate, 2); } // Checkout (the host) var processor = new PaymentProcessor(feeRate: 0.029m); Console.WriteLine(processor.Charge(100.00m)); // 102.90

Nach dem Build ist PaymentProcessor ein interner, umbenannter Typ in Checkout.dll, und es gibt keine PaymentCore.dll mehr, die auszuliefern wäre. Das Konsolenprojekt Checkout referenziert die Bibliothek und nimmt sie in Release mit zwei MSBuild-Eigenschaften in sich auf:

<ItemGroup> <ProjectReference Include="..\PaymentCore\PaymentCore.csproj" /> </ItemGroup> <ItemGroup Condition="'$(Configuration)' == 'Release'"> <PackageReference Include="Babel.Obfuscator" Version="12.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> </ItemGroup> <PropertyGroup Condition="'$(Configuration)' == 'Release'"> <MergeAssemblies>true</MergeAssemblies> <Internalize>true</Internalize> <StringEncryption>hash</StringEncryption> <BabelWarningsAsErrors>W00000</BabelWarningsAsErrors> </PropertyGroup>

MergeAssemblies führt die referenzierten Assemblys in die Ausgabe zusammen, und Internalize ändert die zusammengeführten öffentlichen Typen in internal, sodass sie umbenannt werden können und zu keiner öffentlichen Schnittstelle mehr gehören. Das Babel-Paket führt die Zusammenführung vor den späteren Schritten des SDK aus (Auflösung der Abhängigkeiten, Trimming, Bündelung als einzelne Datei) und hält dotnet publish konsistent, indem es die Datei .deps.json und die Menge der veröffentlichten Dateien aktualisiert.

Ein Build des Beispiels in Release erzeugt eine einzige Checkout.dll. PaymentCore.dll ist nicht mehr vorhanden, weil sie zusammengeführt wurde, und die Anwendung läuft aus dieser einen Datei mit identischer Ausgabe. Wenn Sie eine Abhängigkeit lieber als undurchsichtigen verschlüsselten Blob behalten möchten, statt ihre Typen zusammenzuführen, verwenden Sie stattdessen EmbedAssemblies.

Last updated on