Skip to Content
Nuova versione 12 disponibile 🎉
ObfuscatorMigliorare la sicurezza del codice

Migliorare la sicurezza del codice

Procedure consigliate per migliorare la sicurezza del codice.

Babel Obfuscator è uno strumento potente che offre una protezione solida al tuo codice. Approfondire tutti i dettagli dell’offuscamento può richiedere tempo, perciò abbiamo raccolto una serie di suggerimenti che ti aiutano a ottenere i migliori risultati di offuscamento con il minimo sforzo. Seguendo queste raccomandazioni puoi migliorare in modo significativo la sicurezza del tuo codice senza perderti nei dettagli.

Una protezione forte nasce dalla difesa in profondità: nessuna trasformazione è pensata per fermare da sola un attaccante. La ridenominazione nasconde l’intento, la cifratura nasconde i dati, il flusso di controllo e il proxy dinamico nascondono la logica, e i controlli in fase di esecuzione scoraggiano manomissioni e debug. Combina più strati, in modo che superarne uno lasci comunque attivi gli altri. I suggerimenti che seguono sono raggruppati in base a ciò che ogni strato protegge.

Rinomina e ristruttura i tuoi simboli

Valuta di internalizzare i tipi in C# o di contrassegnarli come Friend in VB

Dichiarare i tipi come internal o Friend (nella terminologia di VB) garantisce che non siano visibili agli assembly esterni e che possano essere rinominati in sicurezza durante l’offuscamento. Questo accorgimento mette il tuo codice al riparo da occhi indiscreti.

Babel Obfuscator permette di rinominare i tipi pubblici o i simboli visibili all’esterno dell’assembly tramite le regole XML. Questa scelta va però valutata con attenzione, perché se il simbolo è usato da assembly esterni l’applicazione smette di funzionare. Quindi, mentre internalizzare i tipi o contrassegnarli come Friend è un modo semplice per aumentare la sicurezza, forzare la ridenominazione dei simboli pubblici richiede un’analisi approfondita e test accurati.

Rafforza la ridenominazione

Oltre alla ridenominazione dei simboli predefinita, alcune opzioni rendono i metadati rinominati molto più difficili da leggere:

  • La ridenominazione con overload riusa un unico nome offuscato per molti membri non correlati, così i metadati non corrispondono più uno a uno ai tuoi membri.
  • L’appiattimento dei namespace comprime la gerarchia dei tuoi namespace e cancella gli indizi strutturali su cui si basa un decompilatore.
  • La ridenominazione dei membri virtuali rinomina in modo coerente i membri virtuali e di interfaccia lungo tutta la gerarchia dei tipi.

Babel CLI

babel.exe myapp.dll --overloaded --flatns --virtualmembers

Unisci le dipendenze quando possibile

Babel Obfuscator ti permette di unire gli assembly referenziati all’assembly target. Internalizzando tutti i tipi uniti aumenti il numero di simboli rinominati e rendi più difficile a un potenziale attaccante interpretare il tuo codice.

Nascondi i dati costanti

Usa l’algoritmo hash per la cifratura delle stringhe

L’algoritmo hash di cifratura delle stringhe offre una protezione forte e riduce la dimensione su disco dell’assembly offuscato. Puoi abilitare questa funzionalità con il seguente comando:

Babel CLI

babel.exe myapp.exe --stringencryption hash

Task Babel di MSBuild

<PropertyGroup> <StringEncryption>hash</StringEncryption> </PropertyGroup>

Cifra i valori inline e gli array

Le costanti numeriche e gli array inline contengono spesso dati sensibili: soglie, chiavi, numeri magici, tabelle di ricerca. La cifratura di valori e array rimuove questi valori letterali dall’IL e li decifra in fase di esecuzione, così un decompilatore non vede più i numeri reali né il contenuto degli array.

Babel CLI

babel.exe myapp.exe --values int32=on --values int64=on --values single=on --values double=on --values array=on

Cifra le risorse gestite

La cifratura delle risorse nasconde le risorse incorporate nel tuo assembly e allo stesso tempo le comprime, aggiungendo un ulteriore strato di protezione. Valuta con attenzione l’impatto sulle prestazioni prima di abilitare questa funzionalità.

Oscura la logica del programma

Abilita l’offuscamento del flusso di controllo

L’offuscamento del flusso di controllo rende più complesse le istruzioni if, inserisce diramazioni irrilevanti e introduce più istruzioni switch senza alterare il comportamento del metodo. Abilitare algoritmi specifici del flusso di controllo come goto, if, switch, case e call garantisce la migliore riorganizzazione del codice. Le seguenti impostazioni consigliate ti aiutano a ottenere un offuscamento efficace del flusso di controllo:

Babel CLI

babel.exe myapp.exe --controlflow goto=on --controlflow if=on --controlflow switch=on --controlflow case=on --controlflow call=on

Task Babel di MSBuild

<PropertyGroup> <ControlFlowObfuscation>goto=true;if=true;switch=true;case=true;call=true;true</ControlFlowObfuscation> <ControlFlowIterations>3</ControlFlowIterations> </PropertyGroup>

Con queste impostazioni del flusso di controllo ottieni un offuscamento solido ed efficace del tuo codice. I diversi algoritmi (goto, if, switch, case e call) contribuiscono a rendere il flusso di controllo più intricato e difficile da analizzare, aumentando la sicurezza della tua applicazione.

Usa la generazione del proxy dinamico per le chiamate ai metodi esterni

Il proxy dinamico nasconde efficacemente le chiamate ai metodi esterni e interni. Abilitare la generazione del proxy dinamico per le chiamate esterne è spesso sufficiente per raggiungere un alto grado di offuscamento.

babel.exe myapp.exe --proxy external

Cifra il codice

La cifratura del codice offre una protezione solida ai metodi che gestiscono dati sensibili, come la verifica della chiave di licenza. Tieni però conto delle prestazioni, perché la cifratura del codice può incidere sulla velocità dell’applicazione: applicala in modo selettivo ai metodi che ne hanno bisogno.

Integrando il Babel Licensing Service puoi usare licenze con attivazione o licenze flottanti per realizzare licenze basate sulle funzionalità. In pratica puoi distribuire in modo sicuro le chiavi di cifratura tramite il servizio di licenze, sbloccando funzionalità specifiche della tua applicazione per gli utenti autorizzati.

Usando il Babel Licensing Service insieme alla cifratura del codice ti assicuri che solo gli utenti con licenza abbiano accesso alle parti di codice cifrate. La chiave di cifratura viene distribuita in modo sicuro tramite il servizio di licenze: questo impedisce l’uso non autorizzato e garantisce l’integrità delle funzionalità della tua applicazione.

Rileva e scoraggia gli attacchi in fase di esecuzione

Abilita il rilevamento delle manomissioni

Il rilevamento delle manomissioni individua qualsiasi modifica non autorizzata al tuo assembly. Scegli azioni adeguate, come interrompere l’esecuzione o segnalare un errore all’utente, per scoraggiare gli attaccanti. Preferire azioni silenziose rende più difficile aggirare il meccanismo di rilevamento delle manomissioni.

babel.exe myapp.exe --tamperingdetection

Abilita la protezione dal debug

La protezione dal debug rileva quando la tua applicazione viene eseguita sotto un debugger o un profiler, cioè gli strumenti che un attaccante usa per osservare i segreti mentre vengono decifrati in fase di esecuzione. Insieme agli strati di cifratura descritti sopra, chiude il varco lasciato dall’analisi statica.

babel.exe myapp.exe --antidebugging

Blocca gli strumenti di disassemblaggio e di reflection

Due opzioni leggere rendono più difficile un’ispezione occasionale: --ildasm contrassegna l’assembly in modo che MSIL Disassembler (ildasm.exe) si rifiuti di aprirlo, e --reflection impedisce agli strumenti basati sulla reflection di elencare i metadati dell’assembly.

babel.exe myapp.exe --ildasm --reflection

Rimuovi ciò che non ti serve distribuire

Ogni metadato che lasci nell’assembly è un indizio. Rimuovi ciò che non serve all’applicazione in esecuzione:

  • Pulisci gli attributi: --cleanattrs rimuove gli attributi personalizzati che servivano solo al compilatore o ai tuoi strumenti.
  • Rimuovi il codice inutilizzato: --deadcode elimina i metodi e i membri non raggiungibili.
  • Rimuovi le enumerazioni: --enumremoval sostituisce i tipi di enumerazione con le costanti sottostanti.
  • Sigilla le classi interne: --seal sigilla i tipi interni che non vengono mai ereditati.
  • Non distribuire i simboli di debug: distribuisci senza il file .pdb (evita --debug), così i numeri di riga e i nomi delle variabili locali non sono a disposizione di un attaccante.

Il seguente comando combina gli strati descritti sopra in una configurazione solida e di uso generale. Aggiungi --msilencryption per i metodi sensibili che lo giustificano.

babel.exe myapp.dll ` --overloaded --flatns --virtualmembers ` --stringencryption hash ` --values int32=on --values int64=on --values single=on --values double=on --values array=on ` --controlflow if=on --controlflow switch=on --controlflow case=on --controlflow chain=on ` --proxy external ` --resourceencryption ` --tamperingdetection --antidebugging --ildasm ` --cleanattrs --seal

Le proprietà equivalenti del task MSBuild:

<PropertyGroup> <OverloadedRenaming>true</OverloadedRenaming> <FlattenNamespaces>true</FlattenNamespaces> <VirtualFunctions>true</VirtualFunctions> <StringEncryption>hash</StringEncryption> <ValueEncryption>int32=true;int64=true;single=true;double=true;array=true;true</ValueEncryption> <ControlFlowObfuscation>if=true;switch=true;case=true;chain=true;true</ControlFlowObfuscation> <DynamicProxy>external=true;true</DynamicProxy> <ResourceEncryption>true</ResourceEncryption> <TamperingDetection>true</TamperingDetection> <DebuggingProtection>true</DebuggingProtection> <SuppressIldasm>true</SuppressIldasm> <CleanAttributes>true</CleanAttributes> <SealClasses>true</SealClasses> </PropertyGroup>

Conserva un file map per l’assistenza

Un offuscamento aggressivo rende illeggibili gli stack trace di produzione. Conserva il file map di offuscamento prodotto per ogni build, così puoi decodificare gli stack trace e risalire ai nomi originali quando diagnostichi i problemi dei clienti, senza indebolire l’assembly distribuito.

Testa l’applicazione offuscata: è fondamentale testare a fondo l’applicazione offuscata per individuare e risolvere gli eventuali problemi introdotti dall’offuscamento. I test garantiscono la stabilità e il corretto funzionamento del tuo codice. Se distribuisci su host con FIPS abilitato, consulta anche Conformità FIPS, perché diversi strati di cifratura decifrano in fase di esecuzione tramite il provider crittografico della piattaforma.

Seguendo questi suggerimenti di offuscamento puoi usare Babel Obfuscator in modo efficace e rafforzare la sicurezza del tuo codice. Per informazioni più dettagliate e indicazioni complete, ti consigliamo di consultare la guida utente di Babel Obfuscator.

Last updated on