Progetti di offuscamento
Un progetto di offuscamento raccoglie gli assembly da proteggere, le loro dipendenze e le impostazioni di ciascuno. Babel Desktop lo mostra come grafo su un canvas e lo esegue con il motore di Babel Obfuscator.
Babel Desktop salva i progetti come file .babel, il formato di progetto MSBuild usato dal task MSBuild. Puoi compilare con MSBuild un progetto salvato in Babel Desktop e aprire in Babel Desktop un progetto .babel esistente.
Creare un progetto
Aggiungi gli assembly
Fai clic su Aggiungi assembly nella schermata iniziale o su + Aggiungi assembly nella barra degli strumenti del canvas (Ctrl+Shift+A, Cmd+Shift+A su macOS), oppure trascina gli assembly .NET dal file manager sul canvas. Ogni assembly diventa un target principale: un nodo del canvas che il motore offusca.
Collega le dipendenze
Aggiungi gli assembly che vengono uniti a un target, incorporati in esso o da esso referenziati, come descritto in Dipendenze.
Configura ogni target
Seleziona un nodo e apri il pannello delle proprietĂ per modificarne le impostazioni e le regole XML. Vedi Impostazioni del target.
Salva ed esegui
Salva il progetto con File > Salva (Ctrl+S, Cmd+S su macOS), poi fai clic su Esegui progetto (Ctrl+Enter, Cmd+Enter su macOS). Salva scrive il file .babel aperto e chiede un nome di file solo per un progetto nuovo. Per salvare una copia con un altro nome, usa File > Salva con nome… (Ctrl+Shift+S, Cmd+Shift+S su macOS).
Per ricominciare da capo, usa Progetto: Nuovo (Ctrl+N) o il pulsante Nuovo progetto sul canvas. Progetto: Apri recente… nella tavolozza comandi riapre un progetto recente, e la finestra Apri progetto si apre sulla cartella dell’ultimo progetto aperto. Se il progetto corrente ha modifiche non salvate, Babel Desktop chiede se scartarle prima di creare o aprire un altro progetto. Se è in corso un’elaborazione, attendi prima che termini.
Il canvas del progetto
Il canvas mostra ogni assembly come un nodo. Per spostare la vista trascina lo sfondo, usa la rotellina o scorri con due dita. Per fare zoom attorno al puntatore pizzica, oppure tieni premuto Ctrl (Cmd su macOS) mentre scorri. I pulsanti dello zoom e Adatta vista inquadrano il grafo. Trascina i nodi per disporli, oppure lascia che Visualizza > Disponi grafo automaticamente (Ctrl+Shift+L, Cmd+Shift+L su macOS) collochi i target da sinistra a destra nell’ordine di esecuzione, con le dipendenze di ciascun target impilate alla sua sinistra. Le posizioni dei nodi vengono salvate nel file di progetto.



Un target principale con quattro assembly uniti
Tieni il puntatore su un nodo per mezzo secondo, oppure raggiungilo con la tastiera, per aprire il suo riquadro. Il riquadro di un target principale mostra il suo stato, l’ordine di esecuzione, quanti assembly unisce, incorpora e referenzia, i suoi collegamenti map e il percorso del file di input. Dopo un’esecuzione mostra anche il punteggio di offuscamento.
Dipendenze
Gli ancoraggi superiore e inferiore di un nodo collegano le dipendenze. Trascina dall’ancoraggio inferiore dell’assembly sorgente all’ancoraggio superiore del target, oppure fai clic sui due ancoraggi uno dopo l’altro. Una nuova dipendenza assume uno di questi tre tipi:
| Tipo | Effetto |
|---|---|
| Unisci | L’assembly sorgente viene unito al target e offuscato insieme a esso, producendo un unico assembly di output. Vedi Unione di assembly. |
| Incorpora | L’assembly sorgente viene memorizzato come risorsa del target e caricato in fase di esecuzione. Vedi Incorporamento di assembly. |
| Riferimento | L’assembly sorgente serve solo a risolvere i riferimenti del target. |
Babel Desktop sceglie il tipo per te. Se il target fa riferimento all’identità esatta dell’assembly sorgente (nome, versione, impostazioni cultura e token della chiave pubblica), la nuova dipendenza è di tipo Unisci; altrimenti è di tipo Riferimento. Per cambiare il tipo, fai clic sulla linea della dipendenza, scegli Unisci, Incorpora o Riferimento nel popover, poi fai clic su Applica. Il comando Assembly: Aggiungi dipendenza automaticamente… e i comandi Assembly: Aggiungi input da unire…, Assembly: Aggiungi assembly incorporato… e Assembly: Aggiungi riferimento… della tavolozza comandi aggiungono le dipendenze da un selettore di file.
Un assembly usato come input da unire resta sul canvas ma non viene offuscato separatamente, perché entra a far parte del target a cui viene unito.
Ordine di esecuzione e file map
Gli ancoraggi sinistro e destro collegano due target in modo che uno venga eseguito prima dell’altro. Trascina dall’ancoraggio destro del primo target all’ancoraggio sinistro del secondo. Babel Desktop chiede a quel punto a che cosa serve il collegamento:
| Scelta | Effetto |
|---|---|
| Solo ordine di esecuzione | Un arco di flusso: il target A viene eseguito prima del target B. Da A a B non passa nulla. |
| Passa il file di map | Un collegamento map, disegnato con l’etichetta MAP: A scrive la sua mappa XML di ridenominazione e B la legge, così B usa i nuovi nomi dei simboli pubblici di A. A viene eseguito prima di B. Vedi Ridenominazione cross-assembly. |
Un collegamento map attiva Generate Map Out File per il primo target e aggiunge la sua mappa ai Map In Files del secondo. Se il primo target non imposta né un percorso di output né un percorso per la mappa, la sua mappa viene scritta in una posizione fissa accanto al suo input, ad esempio BabelOut/Library2.dll.map.xml, così il secondo target la trova sempre. I collegamenti map non vengono memorizzati a parte: Babel Desktop li ricava da queste due impostazioni, quindi anche un progetto scritto a mano o con Babel UI mostra i suoi collegamenti map.
Ogni nodo mostra il suo passo, cioè la posizione in cui viene eseguito nel proprio flusso. Un flusso è un gruppo di target legati tra loro da archi di flusso, collegamenti map o dipendenze di unione, incorporamento e riferimento. I target non legati tra loro formano flussi separati. All’interno di un flusso i target vengono eseguiti nell’ordine dei passi e, dove nulla lo stabilisce, nell’ordine del progetto. Gli archi di flusso vengono salvati nel progetto come normali dipendenze tra target di MSBuild.
Babel Desktop rifiuta i collegamenti di un nodo con se stesso e gli archi duplicati, e rifiuta un collegamento che costringerebbe due target ad attendersi a vicenda. Se i target di un progetto aperto da disco attendono ciascuno il file map dell’altro, il progetto si apre comunque. Babel Desktop mostra un errore che indica il ciclo, ad esempio Library1.dll → Library2.dll → Library1.dll, e il progetto non viene eseguito finché non rimuovi un collegamento. Per rimuovere un arco o un collegamento map, fai clic su di esso e premi Delete o Backspace; Esc annulla un collegamento in corso o deseleziona tutto.
Sostituire un input
Per far puntare un target a una nuova build del suo assembly senza perderne le impostazioni, seleziona il nodo ed esegui Assembly: Sostituisci input e mantieni impostazioni… dalla tavolozza comandi. Assembly: Rimuovi destinazione selezionata rimuove un target e i suoi archi.
Comandi di configurazione
Tre comandi della tavolozza comandi configurano un progetto in un solo passaggio. Aggiungi prima gli assembly, poi esegui il comando adatto all’applicazione.



I comandi di configurazione nella tavolozza comandi
| Comando | Effetto |
|---|---|
| Offuscamento: Imposta unione nell’assembly principale | Unisce tutti gli altri target all’assembly principale, così il progetto produce un solo file di output. L’assembly principale è l’unico .exe del progetto, oppure il primo target quando non ce n’è nessuno o ce n’è più di uno. Un assembly che il motore non può unire viene lasciato com’è. |
| Offuscamento: Imposta offuscamento pubblico (tutti gli assembly) | Prepara un insieme di assembly distribuiti insieme perché i loro simboli pubblici vengano rinominati. Ogni target riceve una regola XML chiamata obfuscate public e scrive la propria mappa di ridenominazione, e un target che dipende da un altro ne legge la mappa tramite un collegamento map. |
| Offuscamento: Imposta livello… | Applica al target selezionato uno dei tre livelli di protezione. |
I livelli impostano queste opzioni e lasciano invariate le altre:
| Livello | Protezione |
|---|---|
| Leggero | Ridenominazione di tipi, metodi, campi, proprietĂ ed eventi. Il flusso di controllo, le funzioni di cifratura e le protezioni anti-analisi sono disattivati. |
| Bilanciato | Ridenominazione, offuscamento del flusso di controllo con l’algoritmo goto, cifratura delle stringhe e soppressione di ILDASM. |
| Massimo | Ridenominazione, offuscamento del flusso di controllo con goto, switch, case, if e chained state, cifratura delle stringhe con l’algoritmo stream, cifratura dei valori, cifratura MSIL, rilevamento delle manomissioni, protezione dal debug e soppressione di ILDASM. Se la licenza non include l’algoritmo stream, viene usata la cifratura delle stringhe predefinita. |
I due comandi di configurazione saltano i target di tipo pacchetto (.apk, .appx e .xap). Nessuno dei tre viene eseguito mentre è in corso un’elaborazione o c’è una modifica in attesa di essere applicata. Modificano il progetto aperto senza salvarlo, così puoi prima controllare il risultato sul canvas e nel pannello delle proprietà . Se applichi un livello più basso dopo uno più alto, le protezioni aggiuntive vengono disattivate.
Impostazioni del target
Seleziona un nodo e fai clic sul pulsante Proprietà in alto a destra nel canvas, oppure premi Enter su un nodo selezionato, per aprire il pannello delle proprietà . La scheda Impostazioni elenca tutte le opzioni di Babel Obfuscator del target selezionato, raggruppate in Ridenominazione, Flusso di controllo, Cifratura codice, Ottimizzazione, Firma e protezione, File e dipendenze, Output & diagnostics e Advanced. Digita in Cerca un’impostazione per filtrare l’elenco.



Il pannello delle proprietĂ del target selezionato
Le impostazioni usano i nomi delle opzioni del task MSBuild, quindi il loro funzionamento è descritto nel riferimento del task Babel e nelle pagine delle singole protezioni. Ogni opzione ha un controllo adatto al suo tipo: caselle di controllo per gli interruttori, elenchi per gli algoritmi, selettori di file e cartelle per i percorsi, editor per i filtri e per le mappe di proprietà .



Impostazioni di cifratura del codice: cifratura di stringhe, MSIL e valori
Le opzioni composte, come Control Flow Obfuscation, mostrano un controllo per ogni proprietà . L’immagine seguente mostra gli interruttori del flusso di controllo. L’ultimo, chain, attiva l’algoritmo chained state dell’edizione Ultimate.



ProprietĂ di Control Flow Obfuscation
Le password, come quella di una chiave di firma o di un file map, vengono conservate solo per la sessione corrente. Non vengono mai scritte nel file di progetto, quindi dopo un riavvio devi inserirle di nuovo. Quando il motore ha bisogno di una password durante un’esecuzione, Babel Desktop te la chiede.
Babel Desktop conserva le parti di un file .babel che non modifica, come commenti, proprietà personalizzate e task MSBuild personalizzati. Non valuta gli import, le condizioni né i task personalizzati di MSBuild: un progetto che ne dipende deve essere compilato con MSBuild.
File map
Il gruppo File map del pannello delle proprietĂ raccoglie le impostazioni relative alle mappe del target selezionato:
- Scrive la sua map di rinomina attiva o disattiva il file map del target. Il percorso sottostante indica dove viene scritta la mappa, per impostazione predefinita accanto all’assembly offuscato; Cambia… sceglie un altro file.
- Map da altri target elenca i collegamenti map che terminano su questo target. Fai clic sul nome di un target per selezionarlo.
- Altri file di map elenca le mappe che questo target legge e che nessun target del progetto scrive, come la mappa di una libreria offuscata in una build precedente. Aggiungi file di map… ne aggiunge una e Rimuovi la toglie.
Regole XML
La scheda Regole XML modifica le regole di offuscamento XML inline del target selezionato. L’editor evidenzia la sintassi XML e Valida controlla le regole rispetto allo schema delle regole di Babel, indicando riga e colonna di ogni errore. Apri XML carica un file di regole nell’editor, Salva file XML scrive il contenuto dell’editor in un file e Applica all’assembly memorizza le regole nel target. Le regole inline vengono salvate nel file di progetto.



Regole XML inline di un target
Plugin del motore
I plugin di Babel Obfuscator si impostano per ogni target con Plugin del motore: Configura percorsi DLL. Plugin del motore: Rileva nomi degli argomenti legge i nomi degli argomenti dichiarati da un plugin, così puoi compilarne gli argomenti. I plugin sono codice .NET eseguito all’interno del motore, quindi usa solo plugin di cui ti fidi.
Eseguire il progetto
Fai clic su Esegui progetto in alto a destra nel canvas, premi Ctrl+Enter (Cmd+Enter su macOS) oppure scegli Esegui > Esegui offuscamento. A meno che un target non imposti un proprio percorso di output, l’assembly offuscato viene scritto in una cartella BabelOut accanto a ogni assembly di input. Prima di avviare l’esecuzione, Babel Desktop controlla dove verrà scritto l’output. Non sovrascrive mai un assembly di input, un file di chiave o un plugin, e chiede conferma prima di sostituire file di output esistenti.
Il pannello Attività mostra la fase in corso, un indicatore di avanzamento e il log del motore. La scheda Registro elenca tutti i messaggi che il motore scrive al Verbose Level del target, mentre avvisi ed errori vengono raccolti anche nella scheda Problemi. Il nodo di ogni target riporta il proprio stato sul canvas. Annulla elaborazione interrompe l’esecuzione. I target vengono eseguiti uno dopo l’altro; se un target fallisce, quelli successivi non vengono eseguiti.



Un’esecuzione completata nel pannello AttivitĂ
Dopo un’esecuzione, i pulsanti in cima al pannello Attività aprono la cartella di output e avviano l’applicazione offuscata. File > Mostra output e Esegui > Avvia app offuscata (Ctrl+F5, Cmd+F5 su macOS) fanno lo stesso. Babel Desktop avvia direttamente un eseguibile Windows, mentre avvia un’applicazione .NET tramite dotnet quando è disponibile il suo file .runtimeconfig.json. Non propone di avviare una libreria.
Punteggio di offuscamento
Dopo un’esecuzione completata, il riquadro di ogni target mostra un punteggio di offuscamento da 0 a 100: un modo rapido per verificare che l’esecuzione abbia applicato le protezioni che ti aspettavi. Tieni il puntatore sul target per aprire il riquadro.



Il punteggio di offuscamento di un target che unisce quattro assembly
Il punteggio somma i punti di cinque strati di protezione. Ogni barra mostra i punti ottenuti da uno strato rispetto al suo massimo, quindi un punteggio basso ti dice quale strato manca.
| Strato | Punti | Come si ottengono |
|---|---|---|
| Ridenominazione | 30 | La quota dei simboli idonei che sono stati rinominati |
| Flusso di controllo | 25 | La quota dei metodi che sono stati riorganizzati. I metodi senza diramazioni non vengono toccati, quindi basta la metĂ dei metodi per ottenere tutti i punti |
| Cifratura stringhe | 15 | Stringhe cifrate |
| Protezione del codice | 15 | Cifratura MSIL (7), chiamate tramite proxy dinamico (4) e cifratura dei valori (4) |
| Anti-analisi | 15 | Rilevamento delle manomissioni, protezione dal debug e soppressione di ILDASM, 5 punti ciascuno |
Il punteggio è classificato come Debole sotto 35, Discreto da 35, Buono da 60 e Robusto da 80. Si basa sulle statistiche dell’ultima esecuzione completata del progetto. Gli assembly uniti a un target contribuiscono al suo punteggio e non ne mostrano uno proprio. Un target che non è ancora stato eseguito non mostra alcun punteggio.
Il punteggio conta le protezioni applicate da un’esecuzione e non dice nulla su quanto a lungo il risultato resista a un determinato strumento. Un punteggio più basso può essere quello giusto: una libreria con un’API pubblica mantiene i propri nomi pubblici, quindi ottiene meno punti di ridenominazione.
Eseguire i flussi in parallelo
Un progetto con più flussi indipendenti, per esempio librerie che non si referenziano a vicenda, può offuscarli contemporaneamente. Attiva Esegui in parallelo i flussi indipendenti in Impostazioni > Offuscamento e scegli quanti flussi eseguire insieme, da 2 a 4. L’opzione è disattivata per impostazione predefinita.
Ogni flusso viene eseguito in un proprio processo del motore, e all’interno di un flusso i target vengono comunque eseguiti in ordine. Babel Desktop controlla l’intero progetto prima che parta qualsiasi flusso, come fa per un’esecuzione singola. Mentre i flussi sono in esecuzione:
- L’indicatore di avanzamento conta i target completati rispetto a quelli pianificati, e ogni riga del log inizia con il nome del suo assembly, ad esempio
[Library1.dll]. - Un target che fallisce interrompe il proprio flusso. Gli altri flussi proseguono e l’esecuzione viene segnalata come non riuscita.
- Annulla elaborazione interrompe tutti i flussi.
- Quando più target richiedono la password di un certificato, Babel Desktop le chiede una alla volta, indicando l’assembly che ne ha bisogno.
Ogni processo del motore impiega un paio di secondi ad avviarsi, quindi l’esecuzione in parallelo fa risparmiare tempo con assembly di grandi dimensioni. Un progetto piccolo può finire prima eseguendo un target dopo l’altro. Con una licenza flottante, Babel Desktop esegue un flusso alla volta.
Strumenti: Avvisi del processo nella tavolozza comandi elenca gli avvisi dell’esecuzione corrente, e Strumenti: Riferimento degli avvisi apre il catalogo dei codici di avviso del motore, con le relative descrizioni e una casella di ricerca.



La guida agli avvisi del motore
Risultati dell’esecuzione
Dopo un’esecuzione, il pulsante Risultati esecuzione nella barra degli strumenti del canvas apre le statistiche di protezione. Scegli un’esecuzione dalla cronologia, un assembly offuscato e un report:
| Report | Contenuto |
|---|---|
| Ridenominazione | Tipi, metodi, campi, proprietĂ ed eventi rinominati e totali, con un grafico della copertura |
| Flusso di controllo | Metodi riorganizzati, istruzioni di salto inserite e iterazioni, con una treemap per namespace e tipo e, quando vengono raccolte le statistiche complete, la complessitĂ ciclomatica prima e dopo la trasformazione |
| Cifratura stringhe | L’algoritmo di cifratura e le stringhe cifrate per metodo |
| Cifratura codice | I metodi cifrati per namespace e tipo |
| Proxy dinamico | Le chiamate sostituite da proxy e i tipi delegate, per metodo di destinazione |
| Ottimizzazioni | Rimozione del codice inutilizzato e contatori delle ottimizzazioni |
| Tempo di esecuzione | La durata di ogni fase del motore |
Puoi cercare nelle tabelle e ordinarle, e nelle treemap puoi scendere dal namespace al tipo. Mostra output, Mostra log del motore e Mostra dati statistici aprono la cartella di output, il log completo del motore e il file con i dati statistici grezzi dell’esecuzione. Babel Desktop conserva i risultati delle ultime 30 esecuzioni.



Statistiche di ridenominazione



Statistiche del flusso di controllo
I file delle statistiche contengono i nomi originali dei simboli e i valori delle stringhe. Come i file map XML, non vanno distribuiti insieme all’applicazione.
Decodificare gli stack trace
Per riportare ai nomi originali gli stack trace offuscati di un’applicazione protetta, usando i suoi file map XML, usa il Decodificatore stack.