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.gitPaymentCore 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.90Nach 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.