Skip to Content
Nueva versión 12 disponible 🎉
ObfuscatorPaquete NuGetCombinación en un único archivo

Un único archivo ofuscado: combinar dependencias

Distribuir una aplicación junto con los DLL de sus dependencias da más superficie de ataque a un atacante, y esas bibliotecas no suelen estar ofuscadas en absoluto. Este ejemplo usa el paquete NuGet de Babel Obfuscator para combinar con el ensamblado host un ensamblado al que se hace referencia, internalizar sus tipos públicos y ofuscar el resultado, de modo que se entrega un único archivo autónomo sin bibliotecas sueltas y legibles.

Para usar este ejemplo necesita una licencia de sitio de Babel Obfuscator (ediciones Ultimate, Server o Data Center). El código fuente está disponible en GitHub:

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

PaymentCore es una biblioteca de clases corriente con una API pública (src/PaymentCore/PaymentProcessor.cs) que Checkout usa como cualquier dependencia:

// 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

Tras la compilación, PaymentProcessor es un tipo interno y renombrado dentro de Checkout.dll: no hay ningún PaymentCore.dll que distribuir. El proyecto de consola Checkout hace referencia a la biblioteca y la incorpora con dos propiedades de MSBuild en Release:

<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 incorpora a la salida los ensamblados a los que se hace referencia, e Internalize cambia a internal los tipos públicos combinados para que puedan renombrarse y dejen de formar parte de cualquier superficie pública. El paquete de Babel ejecuta la combinación antes de los pasos posteriores del SDK (resolución de dependencias, recorte, empaquetado en un único archivo) y mantiene la coherencia de dotnet publish actualizando el archivo .deps.json y el conjunto de archivos publicados.

Al compilar el ejemplo en Release se obtiene un único Checkout.dll (PaymentCore.dll ya no está presente porque se ha combinado) y la aplicación se ejecuta desde ese único archivo con una salida idéntica. Si prefiere conservar una dependencia como un blob cifrado y opaco en lugar de combinar sus tipos, use EmbedAssemblies.

Last updated on