Skip to Content
Nuova versione 12 disponibile 🎉

Pubblicare un’app .NET

Questo esempio mostra come usare il task Babel per configurare la ridenominazione cross-assembly durante il processo di build di un’applicazione .NET. In particolare, l’interfaccia pubblica del pacchetto MathNet.Numerics viene offuscata per mostrare come pubblicare un’applicazione offuscata che usa un assembly offuscato. Tieni presente che per seguire l’esempio è richiesto il pacchetto NuGet Babel.Obfuscator, e che per usarlo serve una licenza dell’edizione Ultimate o Server. L’esempio mostra come configurare la ridenominazione cross-assembly per aumentare l’efficacia dell’offuscamento dell’applicazione e rendere più difficile il reverse engineering.

Il codice sorgente completo dell’esempio è disponibile su GitHub e può essere scaricato con il comando seguente:

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

Il codice dell’esempio è una semplice applicazione console .NET che esegue alcune operazioni statistiche di base usando la libreria MathNet.Numerics.

Per iniziare a configurare la ridenominazione cross-assembly devi prima aggiungere il riferimento al pacchetto NuGet di Babel Obfuscator con il gestore di pacchetti NuGet di Visual Studio, oppure aggiungendo al file di progetto la seguente istruzione MSBuild:

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

In questo modo l’assembly target Math.dll viene offuscato senza la ridenominazione cross-assembly abilitata.

Una volta aggiunto il pacchetto, puoi usare il task Babel per configurare la ridenominazione cross-assembly durante il processo di build, rinominando l’interfaccia pubblica di MathNet.Numerics, la libreria del pacchetto NuGet referenziato.

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

In particolare, devi ricavare il percorso completo dei componenti referenziati dall’elenco dei riferimenti usati per compilare l’applicazione.

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

Questo sarà l’input del task Babel, insieme alla regola XML che configura Babel per rinominare l’interfaccia pubblica del componente. Devi anche generare il file map che verrà usato nell’offuscamento dell’assembly target, impostando la proprietà GenerateMapOutFile="true".

Nota che il nome del target è impostato su BeforeObfuscate, un punto di ingresso definito dal pacchetto NuGet di Babel Obfuscator che permette di eseguire attività aggiuntive prima che l’assembly target venga offuscato.

Per abilitare la ridenominazione cross-assembly per l’assembly target Math.dll, devi aggiungere il file map XML generato per la libreria referenziata MathNet.Numerics.dll al task di offuscamento dell’assembly target. Puoi farlo con le proprietà definite per il pacchetto NuGet di Babel Obfuscator, descritte in Riferimento del pacchetto.

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

Per impedire agli attaccanti di estrarre informazioni aggiuntive utili ad analizzare il codice offuscato, la pubblicazione dei file PDB è stata disattivata impostando:

CopyOutputSymbolsToPublishDirectory=false.

I file PDB contengono informazioni di debug, come i nomi dei file di codice sorgente e i numeri di riga, che possono rendere piĂą facile per gli attaccanti capire il codice offuscato.

Al termine della build del progetto, l’applicazione offuscata con ridenominazione cross-assembly viene generata nella cartella di destinazione. Per creare il pacchetto da distribuire è necessario sostituire il riferimento al file MathNet.Numerics.dll del pacchetto NuGet con il percorso della versione offuscata. Questo passo è essenziale per garantire che Visual Studio includa nel pacchetto gli assembly offuscati corretti.

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

Il frammento XML di MSBuild mostrato è un target con il nome UpdateFilesToPublish che viene eseguito dopo il target ComputeFilesToPublish. Questo target serve a sostituire, nel pacchetto di distribuzione, il riferimento all’assembly MathNet.Numerics.dll originale del pacchetto NuGet con quello offuscato.

Il target definisce prima un gruppo di elementi che rimuove il riferimento originale al file MathNet.Numerics.dll usando l’attributo “Remove” e facendo riferimento alla proprietà che contiene il percorso del file originale.

Poi il target aggiunge al gruppo di elementi la versione offuscata del file MathNet.Numerics.dll usando l’attributo “Include” e facendo riferimento al percorso del file offuscato nella cartella di destinazione. L’elemento “RelativePath” specifica il percorso relativo del file rispetto alla radice della cartella di distribuzione.

Quando il target viene eseguito, rimuove il riferimento al file originale e aggiunge al pacchetto di distribuzione il riferimento al file offuscato, garantendo che venga distribuito l’assembly offuscato al posto di quello originale.

Per pubblicare l’applicazione completamente offuscata, spostati nella cartella del progetto ed esegui il comando seguente:

dotnet publish

Nel complesso, l’esempio è un punto di partenza per gli sviluppatori che vogliono integrare l’offuscamento di Babel nella propria pipeline di build .NET e proteggere il codice con l’offuscamento cross-assembly. Abbiamo inoltre fornito alcune indicazioni supplementari su come modificare il pacchetto di distribuzione per includervi gli assembly offuscati.

Last updated on