Skip to Content
Nueva versión 12 disponible 🎉
ObfuscatorRenombrado entre ensambladosPublicar una aplicación .NET

Publicar una aplicación .NET

Este ejemplo muestra cómo usar la tarea Babel para configurar el renombrado entre ensamblados durante el proceso de compilación de una aplicación .NET. En concreto, se ofusca la interfaz pública del paquete MathNet.Numerics para mostrar cómo publicar una aplicación ofuscada que usa un ensamblado ofuscado. Tenga en cuenta que para seguir este ejemplo se requiere el paquete NuGet Babel.Obfuscator, y que para usarlo es necesaria una edición de licencia Ultimate o Server. El ejemplo muestra cómo configurar el renombrado entre ensamblados para aumentar el grado de ofuscación de la aplicación y dificultar así la ingeniería inversa.

El código fuente completo del ejemplo está disponible en GitHub y puede descargarse con el comando siguiente:

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

El código del ejemplo es una aplicación de consola .NET sencilla que realiza algunas operaciones estadísticas básicas con la biblioteca MathNet.Numerics.

Para empezar a configurar el renombrado entre ensamblados, primero hay que hacer referencia al paquete NuGet de Babel Obfuscator con el administrador de paquetes NuGet de Visual Studio o añadiendo la siguiente instrucción de MSBuild al archivo de proyecto:

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

Con esto, el ensamblado de destino Math.dll se ofusca sin el renombrado entre ensamblados activado.

Una vez añadido el paquete, se puede usar la tarea Babel para configurar el renombrado entre ensamblados durante el proceso de compilación, renombrando la interfaz pública de MathNet.Numerics, la biblioteca del paquete NuGet al que se hace referencia.

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

En concreto, hay que obtener la ruta completa de los componentes a los que se hace referencia a partir de la lista de referencias que se usa para compilar la aplicación.

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

Esta será la entrada de la tarea Babel, junto con la regla XML que configura Babel para renombrar la interfaz pública del componente. También hay que generar el archivo map que se usará al ofuscar el ensamblado de destino, para lo cual se define la propiedad GenerateMapOutFile="true".

Observe que el nombre del destino es BeforeObfuscate, un punto de entrada definido por el paquete NuGet de Babel Obfuscator que permite realizar algunas tareas adicionales antes de que se ofusque el ensamblado de destino.

Para activar el renombrado entre ensamblados en el ensamblado de destino Math.dll, hay que añadir el archivo map XML generado para la biblioteca a la que se hace referencia, MathNet.Numerics.dll, a la tarea de ofuscación del ensamblado de destino. Para ello se usan las propiedades definidas para el paquete NuGet de Babel Obfuscator, que se describen en Referencia del paquete.

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

Para impedir que los atacantes extraigan información adicional que pueda servir para analizar el código ofuscado, se ha desactivado la publicación de los archivos PDB con el ajuste:

CopyOutputSymbolsToPublishDirectory=false.

Los archivos PDB contienen información de depuración, como los nombres de los archivos de código fuente y los números de línea, que puede facilitar a los atacantes la comprensión del código ofuscado.

Al compilar el proyecto, la aplicación ofuscada con renombrado entre ensamblados se genera en el directorio de destino. Para crear el paquete de despliegue, es necesario sustituir la referencia al archivo MathNet.Numerics.dll del paquete NuGet por la ruta del archivo de la versión ofuscada. Este paso es esencial para garantizar que Visual Studio empaquete los ensamblados ofuscados correctos.

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

El fragmento XML de MSBuild mostrado es un destino con el nombre UpdateFilesToPublish que se ejecuta después del destino ComputeFilesToPublish. Este destino sirve para sustituir, en el paquete de despliegue, la referencia al ensamblado MathNet.Numerics.dll original del paquete NuGet por la del ensamblado ofuscado.

El destino define primero un grupo de elementos que quita la referencia original al archivo MathNet.Numerics.dll mediante el atributo «Remove», haciendo referencia a la propiedad que contiene la ruta del archivo original.

Después, el destino añade al grupo de elementos la versión ofuscada del archivo MathNet.Numerics.dll mediante el atributo «Include», haciendo referencia a la ruta del archivo ofuscado en el directorio de destino. El elemento «RelativePath» se usa para indicar la ruta relativa del archivo desde la raíz del directorio de despliegue.

Cuando el destino se ejecuta, quita la referencia al archivo original y añade al paquete de despliegue la referencia al archivo ofuscado, lo que garantiza que se despliegue el ensamblado ofuscado en lugar del original.

Para publicar la aplicación completamente ofuscada, vaya a la carpeta del proyecto y ejecute el comando siguiente:

dotnet publish

En conjunto, el ejemplo sirve como punto de partida para los desarrolladores que quieran integrar la ofuscación de Babel en su pipeline de compilación de .NET y proteger su código con la ofuscación entre ensamblados. Además, se han dado algunas indicaciones complementarias sobre cómo modificar el paquete de despliegue para incorporar los ensamblados ofuscados.

Last updated on