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 --virtualmembersUnisci 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 hashTask 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=onCifra 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=onTask 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 externalCifra 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 --tamperingdetectionAbilita 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 --antidebuggingBlocca 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 --reflectionRimuovi 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:
--cleanattrsrimuove gli attributi personalizzati che servivano solo al compilatore o ai tuoi strumenti. - Rimuovi il codice inutilizzato:
--deadcodeelimina i metodi e i membri non raggiungibili. - Rimuovi le enumerazioni:
--enumremovalsostituisce i tipi di enumerazione con le costanti sottostanti. - Sigilla le classi interne:
--sealsigilla 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.
Una configurazione di base consigliata
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 --sealLe 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.