Regole di esempio
Per adattare il processo di offuscamento di Babel Obfuscator, puoi scrivere regole XML personalizzate. Queste regole stabiliscono come l’offuscatore tratta determinate classi, metodi, proprietà e altri elementi. Offrono un controllo dettagliato e ti permettono di affinare i risultati dell’offuscatore. Questa sezione presenta alcuni esempi di regole XML per Babel Obfuscator.
Disabilitare la ridenominazione di una classe
Per disabilitare la ridenominazione di una determinata classe con le regole XML di Babel Obfuscator, puoi usare la seguente regola XML:
<Rule name="disable-myclass-renaming" feature="renaming" exclude="true"
applyToMembers="true">
<Target>Classes</Target>
<Pattern>MyNamespace.MyClass</Pattern>
<Description>Disable renaming for MyClass.</Description>
</Rule>Nota:
Sostituisci MyNamespace.MyClass con il nome completo della classe che vuoi escludere dalla ridenominazione.
- L’attributo
featureè impostato su “renaming” per indicare la funzionalità di ridenominazione. - L’attributo
excludeè impostato su “true” per impedire la ridenominazione della classe specificata. - L’attributo
applyToMembersè impostato su “true” per impedire la ridenominazione dei membri della classe. - L’elemento
Targetspecifica che la regola si applica alle classi. - L’elemento
Patternspecifica il nome completo della classe.
Codice generato dal compilatore
La seguente regola esclude alcune funzionalità avanzate di offuscamento per il codice generato dal compilatore.
<Rule name="no-compiler-generated"
feature="control flow, value encryption, string encryption"
exclude="true" applyToMembers="false">
<Target>Classes</Target>
<Pattern>*</Pattern>
<HasAttribute onEnclosingType="false">
System.Runtime.CompilerServices.CompilerGeneratedAttribute,
System.Diagnostics.DebuggerHiddenAttribute
</HasAttribute>
<Description>Do not obfuscate compiler-generated methods.</Description>
</Rule>Tipi anonimi
In C#, un tipo anonimo è un tipo definito senza nome usando l’operatore new insieme a un inizializzatore di oggetto.
var query =
from prod in products
select new { prod.Name, prod.Price };
foreach (var v in query)
{
Console.WriteLine("Name={0}, Price={1}", v.Name, v.Price);
}In questo modo è possibile creare oggetti al volo senza dover definire prima un tipo specifico. Il compilatore genera per il tipo anonimo un nome di tipo, che di solito inizia con i caratteri <>f__Anonymous. Il nome generato è univoco e non è pensato per essere usato dallo sviluppatore.
I tipi anonimi sono molto usati nelle query LINQ e in altri scenari, come le applicazioni web ASP.NET, in cui è richiesta la creazione di oggetti al volo.
Nel contesto dell’offuscamento, i tipi anonimi possono creare difficoltà, perché i loro nomi generati potrebbero essere offuscati. Rinominarli può causare problemi al codice che li usa, quindi spesso è consigliabile escluderli dall’offuscamento.
Un modo per farlo è aggiungere una regola rivolta a qualsiasi simbolo con l’attributo
System.Runtime.CompilerServices.CompilerGeneratedAttribute
per escludere tutto il codice generato dal compilatore, compresi i tipi anonimi.
<Rule name="rule1" feature="renaming, dead code" exclude="true" applyToMembers="true">
<Pattern>*</Pattern>
<HasAttribute>System.Runtime.CompilerServices.CompilerGeneratedAttribute</HasAttribute>
</Rule>Un’altra possibilità è usare un modello di espressione regolare che corrisponda al nome di qualsiasi tipo inline, dato che questi tipi hanno di solito il prefisso <>f__Anonymous.
<Pattern isRegEx="true">
<![CDATA[<>f__Anonymous.*]]>
</Pattern>Controllando il nome del tipo anonimo in uno strumento di ispezione di assembly .NET come ILSpy o dotPeek, puoi verificare se segue questa regola.
Usare i filtri delle chiamate del proxy dinamico
I filtri delle chiamate del proxy dinamico sono uno strumento utile di Babel Obfuscator per regolare con precisione la generazione del proxy dinamico e ottenere il livello di offuscamento desiderato mantenendo prestazioni ottimali (vedi Proxy dinamico).
<Rule name="rule1" feature="dynamic proxy" exclude="false" applyToMembers="true">
<Pattern>*</Pattern>
<Description>Set Dynamic Proxy Call Filters</Description>
<Properties>
<DynamicProxyCallFilters>IEnumerator.*;ICollection.*</DynamicProxyCallFilters>
</Properties>
</Rule>La regola XML riportata sopra è una configurazione di Babel che imposta i filtri delle chiamate del proxy dinamico.
Impostando i filtri delle chiamate del proxy dinamico, puoi definire con precisione quali chiamate di metodo devono essere intercettate e sostituite con proxy dinamici. Così proteggi le sezioni critiche del tuo codice e lasci intatte le altre. Poiché i filtri accettano espressioni regolari, puoi adattare la regola a specifici schemi di denominazione dei metodi o a comportamenti che richiedono il proxy dinamico. In questo modo adegui le strategie di offuscamento e protezione ai requisiti specifici della tua applicazione.
Controllare l’Obfuscation Agent
L’Obfuscation Agent di Babel Obfuscator esegue una serie di task durante il processo di offuscamento, in base a regole predefinite. Il suo scopo principale è prevenire i problemi che l’offuscamento potrebbe introdurre e che potrebbero compromettere l’assembly risultante. Per esempio, l’Agent fa in modo che i simboli usati tramite reflection non vengano offuscati, perché ciò potrebbe causare errori in fase di esecuzione. I task eseguiti dall’Agent vanno da controlli semplici, come l’esame dei campi dei tipi serializzabili, a operazioni più complesse che comportano l’analisi statica del codice MSIL.
Anche se l’Obfuscation Agent è essenziale per il corretto funzionamento del codice offuscato, in alcuni scenari gli sviluppatori possono voler ottenere risultati di offuscamento specifici che richiedono di disabilitare alcuni task dell’Agent.
Per saltare task specifici dell’Agent con le regole XML, gli sviluppatori possono definire una regola di esclusione rivolta alla funzionalità agent. Per esempio, per disabilitare task come “Serializable types” e “Reflected strings”, la regola XML ha questo aspetto:
<Rule name="rule1" feature="agent" exclude="true">
<Pattern>ACME.Data.*</Pattern>
<Properties>
<TaskNameList>Serializable types;Reflected strings</TaskNameList>
</Properties>
</Rule>In conclusione, anche se l’Obfuscation Agent ha un ruolo centrale nel garantire che il codice offuscato funzioni senza intoppi, in alcune situazioni gli sviluppatori possono aver bisogno di disabilitare task specifici per ottenere i risultati di offuscamento desiderati. È essenziale procedere con cautela, comprendendo le implicazioni di ogni task disabilitato sull’applicazione finale.