Skip to Content
Nuova versione 12 disponibile 🎉

Riferimento della riga di comando

Lo strumento da riga di comando di Babel Obfuscator accetta diverse opzioni. Ogni opzione è preceduta da un doppio trattino. Le sezioni seguenti descrivono tutte le opzioni che puoi inserire nella riga di comando.

Varie

Queste opzioni servono in genere a configurare le funzionalità generali di offuscamento o il modo in cui Babel Obfuscator tratta l’assembly target.

—help [option]

Digitando —help senza parametri viene visualizzato il menu principale della guida. Quando specifichi il parametro [option], Babel visualizza la guida estesa dell’opzione indicata. Per esempio:

--help strings

Stampa le seguenti informazioni:

stringencryption (nostringencryption, no-stringencryption, string-encryption, no-string-encryption, strings, no-strings) usage: --[no]stringencryption [name] Enable ([no]disable) string encryption (default: disabled) When enabled, all the user strings in the target assembly will be encrypted. The optional parameter name sets the encryption type. hash - Compressed hash table. The strings are arranged into compressed encrypted hash table data. This algorithm ensures tamper protection. xor - Inline xor strings. stream - Authenticated per-string encryption, decrypted lazily. Fully managed (AOT/trim/FIPS safe).

L’output mostra l’elenco degli alias ammessi per l’opzione, seguito dalla sintassi d’uso e da una breve descrizione.

Questa opzione controlla la visualizzazione del messaggio di copyright di Babel Obfuscator all’avvio. Se specifichi il prefisso facoltativo [no], il messaggio di copyright non viene mostrato.

—format <format>

Disponibile dalla versione 11.7.0.

Seleziona il formato di output di stdout. I valori ammessi sono text (predefinito), json e ndjson. Con json o ndjson l’esecuzione produce un flusso strutturato conforme allo schema babel.cli.v1 e la diagnostica destinata alle persone viene indirizzata su stderr.

babel myapp.exe --format=json > result.json babel myapp.exe --format=ndjson | jq -c 'select(.level=="error")'

Con la stessa opzione anche --help e --version passano a una rappresentazione leggibile dalle macchine. Vedi la pagina Modalità compatibile con l’AI per lo schema, gli esempi e il riferimento completo.

—quiet (-q)

Disponibile dalla versione 11.7.0.

Sopprime il banner del logo e fa sì che le richieste interattive di password terminino subito con un errore esplicito, invece di restare in attesa dell’input. È sicura per le esecuzioni non presidiate e per quelle avviate da agenti.

babel myapp.exe --quiet --keyfile mykey.pfx --keypwd env:KEY_PWD

—strict-exit

Disponibile dalla versione 11.7.0.

Abilita i codici di uscita semantici: 0 successo, 10 argomenti non validi, 20 input non trovato, 30 errore di offuscamento, 40 errore di licenza, 50 errore di chiave o di firma. Senza questa opzione viene mantenuto il contratto tradizionale 0/1. Vedi Modalità compatibile con l’AI: —strict-exit per la tabella completa e la semantica di exitReason.

—license [path|env]

Se non specifichi l’argomento facoltativo, visualizza le informazioni sulla licenza disponibili. Puoi anche specificare il percorso del file di licenza.

babel --license C:\Babel\babel.licenses

In alternativa, puoi specificare una cartella in cui Babel deve cercare il file di licenza.

Se hai una chiave di licenza, puoi usare l’opzione env per passarla a Babel in questo modo:

babel --license env:BABEL_LICENSE_KEY

Qui BABEL_LICENSE_KEY è la variabile d’ambiente che contiene la chiave di licenza.

—verbose <n>

Imposta il livello di dettaglio dell’output della console, dove <n> è un numero intero non negativo obbligatorio. Se specifichi 0, durante l’offuscamento non viene visualizzato alcun messaggio. Con un numero maggiore di 10 Babel mostra le informazioni di debug.

—noconfig (@)

Non carica la configurazione predefinita dei valori della riga di comando. Se la specifichi, tutti i valori predefiniti presenti nel file babel.exe.config vengono ignorati:

babel myapp.exe --noconfig babel myapp.exe @

—nowarn <warn list>

Sopprime la notifica di uno o più messaggi di avviso. Il parametro <warn list> è un elenco di ID di avviso separati da virgole. Babel ignora, senza segnalarli, gli avvisi i cui numeri vengono passati all’opzione nowarn.

—[no]warnasinfo [warn list]

Specifica un elenco di avvisi da declassare a messaggi informativi. [warn list] è un elenco facoltativo di ID di avviso separati da virgole.

—[no]warnaserror [warn list]

Specifica un elenco di avvisi da trattare come errori, che interrompono il processo di offuscamento. [warn list] è un elenco facoltativo di ID di avviso separati da virgole.

—[no]statistics [file]

Indica se generare le statistiche di offuscamento, che possono essere scritte nel log al termine del programma oppure salvate in un file, se specificato.

Sono disponibili le seguenti opzioni aggiuntive:

full=[on/off] Whether to collect additional method statistics

Abilitando le statistiche di offuscamento complete vengono raccolte informazioni aggiuntive sui metodi, come la CYC (complessità ciclomatica). Questo può aumentare il consumo di risorse, soprattutto quando vengono elaborati assembly con molti tipi.

Ecco un esempio di statistiche di offuscamento tratto dall’output della console:

Babel statistics: Random seed: 6dfabc3f1a479d66 Experimental features: false Multithread obfuscation: true Rules phase, elapsed time 00.000s Processed rules: 0 Agent phase, elapsed time 00.046s Renaming phase, elapsed time 00.082s Unicode normalization: off Flatten namespaces: on Overloaded renaming: off Virtual functions: on XAML renaming: on (res) Symbols statistics: 76/[ 106] types: 71.70 % 0/[ 2] events: 0.00 % 82/[ 236] methods: 34.75 % 7/[ 22] properties: 31.82 % 219/[ 258] fields: 84.88 % 384/[ 624] overall: 61.54 % Encrypt Strings phase, elapsed time 00.016s String algorithm: hash (.NET Core) Number of encrypted strings: 266

—[no]agent (a)

Questa opzione abilita o disabilita l’Obfuscation Agent. Quando è abilitato, l’Agent esegue un’analisi statica del codice per evitare la ridenominazione o l’offuscamento dei simboli dell’assembly target che altrimenti potrebbero causare malfunzionamenti nell’applicazione offuscata.

—assemblyname <option>

Questa opzione ti permette di stabilire il nome dell’assembly target.
Le opzioni disponibili sono:

--assemblyname name=assemblyname --assemblyname inputfilename --assemblyname outputfilename --assemblyname nochange (default)

Il comportamento predefinito è nochange: il nome dell’assembly non viene modificato rispetto al valore originale. È il comportamento che ottieni se non specifichi alcuna opzione --assemblyname.

—[no]satellite [assembly]

Abilita ([no] disabilita) l’elaborazione degli assembly satellite. Se specifichi il parametro facoltativo [assembly], il file di assembly indicato viene trattato come assembly satellite dell’assembly target.

—addsearch <path>

Aggiunge la cartella <path> specificata all’elenco delle cartelle in cui Babel cerca gli assembly referenziati.

Il parametro <path> può essere un’espressione con caratteri jolly che corrisponde a un insieme di cartelle. Per comporre un’espressione con caratteri jolly puoi usare i seguenti caratteri speciali:

* corrisponde a un numero qualsiasi di caratteri, anche nessuno
?corrisponde a un singolo carattere qualsiasi
**corrisponde a qualsiasi cartella, in modo ricorsivo
[a-z]corrisponde a un carattere compreso nell’intervallo indicato tra parentesi quadre
[!ab]corrisponde a qualsiasi carattere non indicato tra parentesi quadre

Nell’espressione del percorso puoi inserire le seguenti stringhe speciali, riferite all’assembly cercato in quel momento:

:assemblyname:nome dell’assembly cercato
:assemblyversion:versione dell’assembly cercato
:assemblypublickeytoken:token della chiave pubblica dell’assembly cercato

Questa opzione può essere specificata più volte.

--addsearch .\**\lib --addsearch .\:assemblyname:\**\netcoreapp2.0

W00013 nel percorso di associazione BAML

L’avviso W00013 emesso dal resolver degli assembly di Babel (Could not resolve assembly <assembly>) è in genere solo informativo. Per la maggior parte dei tipi di codice, nella maggior parte degli assembly, un riferimento non risolto non cambia l’output offuscato: i metadati già caricati danno a Babel informazioni sufficienti per eseguire la ridenominazione, l’offuscamento del flusso di controllo, la cifratura delle stringhe e le altre trasformazioni senza consultare ogni assembly referenziato.

Esiste però almeno un caso specifico in cui W00013 corrisponde a un cambiamento reale dell’output offuscato: gli assembly che contengono BAML incorporato con riferimenti a tipi definiti in un assembly non risolto. Quando Babel legge il BAML per individuare i membri associati a XAML (vedi Allineare i valori letterali stringa ai membri rinominati associati a XAML), deve risolvere il tipo CLR di ogni elemento BAML. Se l’assembly che dichiara quel tipo non si trova nel percorso di ricerca, il resolver emette W00013 per quell’assembly; l’elemento BAML non viene quindi associato al suo campo sottostante e il campo non viene contrassegnato come associato a XAML. Di conseguenza, quando in seguito il campo viene rinominato, il passo di allineamento che riscrive i valori letterali stringa corrispondenti al nome originale viene saltato senza alcuna segnalazione: il campo riceve il nuovo nome, ma tutti i valori letterali che riportano il nome originale restano invariati. L’assembly offuscato risulta così incoerente al suo interno, e qualsiasi ricerca per nome in fase di esecuzione basata su quei valori letterali smette di funzionare.

Nei progetti che contengono BAML incorporato, prima di considerare definitiva per la produzione un’esecuzione dell’offuscamento, verifica che ogni assembly che definisce tipi referenziati dagli elementi BAML sia raggiungibile tramite --addsearch e che il log di traccia non riporti alcun W00013 per quegli assembly. La stessa impostazione è disponibile nella proprietà SearchDirectories del task Babel di MSBuild e nell’impostazione SearchDirectories del gruppo File e dipendenze nel pannello delle proprietà di Babel Desktop.

Questo comportamento dell’avviso riguarda solo i progetti con BAML incorporato; nei progetti non WPF, o nei progetti senza BAML incorporato, W00013 è di norma solo informativo e non incide sull’output offuscato.

—quickrule <rule>

Inserisce la definizione di una regola rapida. Puoi usare una regola rapida al posto di una regola XML quando vuoi configurare il processo di offuscamento senza dover creare un file di regole XML.

Sintassi della regola rapida:

feature[=exclude];[regex];[access];[target]

Dove:

featureÈ il nome della funzionalità a cui si applica la regola
[=exclude]Può essere specificato per disabilitare la funzionalità
[regex]È un’espressione regolare facoltativa usata per filtrare i simboli. Per impostazione predefinita, l’offuscatore considera tutti i simboli.
[access]Imposta la visibilità dei simboli da elaborare e può assumere uno dei seguenti valori: Public, Protected, Internal, Private, All (predefinito All)
[target]Specifica il tipo di simbolo. I valori ammessi sono: Classes, Delegates, Structures, Interfaces, Enums, Events, Methods, Properties, Fields, StaticFields, Resource, All (predefinito All)

L’opzione quickrule può essere specificata più volte. Le regole rapide vengono elaborate nell’ordine in cui compaiono nella riga di comando e prima di qualsiasi regola XML.

Rinomina tutti i simboli pubblici dell’assembly target:

babel myapp.exe --quickrule renaming;.*;Public

Disabilita la cifratura delle stringhe nel namespace ACME:

babel myapp.exe --quickrule "string encryption=exclude;ACME.*;All;Methods"

Abilita la cifratura del codice per la classe ACME.Licensing:

babel myapp.exe --quickrule "msil encryption=on;ACME.Licensing.*"

—dbghelpdlldir <path>

Questa opzione funziona solo su Windows e configura il percorso di dbghelp.dll, permettendo a Babel Obfuscator di caricare i simboli di debug dal Microsoft Symbol Server .

—trace <regex>

Abilita il tracciamento dell’offuscamento per i simboli la cui firma con nome completo corrisponde all’espressione regolare specificata. Puoi usare questa opzione per eseguire il debug delle espressioni regolari.

babel myapp.exe --trace MyNamespace.MyClass::MyMethod

Traccia il metodo MyMethod e scrive nel log le informazioni di debug sul suo stato di offuscamento.

—randomseed <seed>

Imposta il seme usato per inizializzare il generatore di numeri casuali di Babel Obfuscator. Puoi impostarlo per ottenere un offuscamento deterministico. Il parametro <seed> può essere una qualsiasi stringa esadecimale.

—use <key=value>

Imposta opzioni aggiuntive di Babel Obfuscator come coppie chiave-valore.

debugxaml=[on/off] Whether to enable XAML debug mode encryption=<name> Set encryption algorithm (Aes, AesManaged, DES, TripleDES, Rijndael, RC2, XOR) experimental=[on/off] Whether to enable experimental features loadtomemory=[on/off] Whether to load assemblies to memory parallel=[on/off] Whether to perform multithread obfuscation tagassembly=[on/off] Whether to tag assembly with the BabelObfuscator attribute obfuscationattr=[skip/keep] Skip processing or force attribute retention logtimestamp=[on/off/fmt] Whether to add a timestamp to the log output (fmt date time format)

Esempi:

Stampa le informazioni di debug relative a tutte le risorse XAML il cui nome inizia con Panel

babel myapp.exe --use debugxaml=Panel.* --verbose 5

Contrassegna l’assembly offuscato con l’attributo [BabelObfuscator].

babel myapp.exe --use tagassembly=on

Forza Babel Obfuscator a usare l’algoritmo di cifratura TripleDES

babel myapp.exe --use encryption=TripleDES

Protegge con l’algoritmo AES gestito, in modo che il runtime iniettato nell’assembly offuscato decifri senza il provider crittografico della piattaforma. Usalo per far avviare gli assembly protetti sugli host in cui quel provider non è disponibile, come i container con uno stato FIPS di OpenSSL danneggiato (vedi Conformità FIPS). L’offuscatore continua a cifrare con il provider della piattaforma sull’host di build e produce lo stesso testo cifrato; cambia solo il decifratore inserito.

babel myapp.exe --msilencryption --use encryption=aesmanaged

L’opzione experimental accetta anche un elenco di funzionalità dell’offuscatore, compreso “all”, che permette di usare nuovi algoritmi di offuscamento non ancora rilasciati per tutte le piattaforme .NET.

babel myapp.exe --use experimental=all

Quando le funzionalità sperimentali sono abilitate, tieni presente che Babel non verifica se i requisiti specifici della piattaforma sono soddisfatti. Tutti gli offuscamenti configurati vengono quindi eseguiti, che siano adatti o meno alla piattaforma di destinazione. Abilitare le funzionalità sperimentali può aumentare il rischio di errori e incidere sulle prestazioni dell’applicazione. Usale quindi con cautela, preferibilmente solo in un ambiente di test e conoscendo bene i rischi che comportano.

—[no]isobfuscated [action]

Indica se rilevare un assembly target già offuscato.
Le azioni ammesse sono:

  • warn: genera un avviso e continua a elaborare l’assembly target.
  • exit: esce senza elaborare l’assembly target

Questa opzione è utile in uno scenario di build in cui l’assembly target può essere elaborato una seconda volta. Babel analizza i nomi dei simboli per capire se l’assembly è già stato offuscato. In alcuni casi, però, l’analisi può dare un risultato errato. In questa situazione è meglio contrassegnare l’assembly con l’attributo BabelObfuscator, usando il valore tagassembly dell’opzione —use della riga di comando.

File di input

La sezione File di input comprende le opzioni che forniscono a Babel Obfuscator file esterni con configurazioni aggiuntive o con i dati necessari per eseguire operazioni specifiche.

—keyfile <file>

Imposta il file della chiave con nome sicuro con cui firmare di nuovo l’assembly offuscato e le DLL di risorse localizzate. Babel Obfuscator supporta i file Strong Name Key (.snk) e Personal Information Exchange (.pfx).

Se usi un file Personal Information Exchange, aggiungi l’opzione della riga di comando —keypwd per specificare la password del file .pfx.

—keyname <container>

Usa questa opzione per firmare di nuovo l’applicazione se la coppia di chiavi è memorizzata in un contenitore di chiavi. Il parametro obbligatorio <_container>_ è il nome del contenitore di chiavi usato per firmare di nuovo l’assembly offuscato e le DLL di risorse localizzate.

—keypwd <password>

Specifica la password richiesta da un file Personal Information Exchange (.pfx) per firmare di nuovo l’assembly offuscato. Se la password non viene specificata nella riga di comando, Babel chiede di inserirla durante il processo di offuscamento.

—rules <file>

Imposta un file di regole XML che Babel usa per configurare il processo di offuscamento. Questa opzione può essere specificata più volte. I file di regole vengono elaborati nell’ordine in cui sono inseriti nella riga di comando.

babel myapp.exe --rules ruleset1.xml --rules ruleset2.xml

—mapin <file>

Imposta il file map XML di input che verrà usato per offuscare i nomi dei simboli referenziati. Questa opzione può essere specificata più volte.

babel myapp.exe --mapin library.map.xml --mapin utils.map.xml

—project <file>

Specifica un file di progetto di offuscamento.

—stacktrace <file|key=value>

Decodifica un file che contiene uno stack trace. Questa opzione richiede un <file> di testo con lo stack trace offuscato e un insieme di file map XML per decodificarne il contenuto.

babel --stacktrace obfuscatedstacktrace.txt --mapin myapp.map.xml --mapin library.map.xml

L’opzione può essere ripetuta per passare, oltre al file con lo stack trace, le seguenti impostazioni key=value:

ImpostazioneValoriDescrizione
modefull (predefinito), compactSeleziona il livello di dettaglio dei frame decodificati.
framesall (predefinito), userall mantiene tutti i frame; user elimina i frame generati da Babel, cioè i bridge del proxy dinamico e i frame anonimi creati in fase di esecuzione attraverso cui passano le loro chiamate, e lascia solo la catena di chiamate del tuo codice sorgente.

Per esempio, per decodificare uno stack trace mantenendo solo la catena di chiamate dell’utente:

babel --stacktrace obfuscatedstacktrace.txt --stacktrace frames=user --mapin myapp.map.xml

File di output

Opzioni di Babel Obfuscator per impostare i nomi dei file di output.

—output <file>

Imposta il percorso del file di output del target offuscato. Se non specifichi questa opzione, il target offuscato viene salvato nella sottocartella BabelOut della cartella dell’assembly originale.

—pdb <file>

Imposta il percorso del file PDB di output. Puoi usare questa opzione quando l’opzione —debug è abilitata.

—pdbpwd <password>

Imposta la password del file con le informazioni di debug. La password serve a cifrare i nomi dei file di codice sorgente memorizzati nel PDB.

—logfile <file>

Invia i messaggi di output di Babel Obfuscator a un file di log.

—mapout [file]

Imposta il nome del file di output per il file map XML. Se non specifichi il parametro facoltativo [file], Babel Obfuscator assegna al file map XML il nome dell’assembly originale, aggiungendo l’estensione .map.xml.

—makeproject [file]

Crea un file di progetto MSBuild a partire dalla riga di comando inserita. Se non specifichi il parametro facoltativo [file], Babel Obfuscator salva il file di progetto nella sottocartella BabelOut.

Plugin

I plugin sono componenti aggiuntivi che estendono le funzionalità di Babel Obfuscator. Permettono di aggiungere o modificare le funzionalità di offuscamento, per una maggiore personalizzazione e un maggiore controllo del processo di offuscamento (vedi Encrypt Plugin).

—plugin <file>

Imposta il percorso del file di un plugin di Babel Obfuscator. Questa opzione può essere specificata più volte.

—argument <key=value>

Imposta un argomento del plugin come coppia chiave-valore. Questa opzione può essere specificata più volte.

Unione e incorporamento di assembly

L’unione di assembly consiste nel combinare più assembly in un unico assembly principale. Babel Obfuscator esegue questa operazione unendo e offuscando tutti gli assembly specificati dopo l’assembly principale nella riga di comando.

—[no]copyattrs [regex]

Quando questa opzione è abilitata, tutti gli attributi a livello di assembly di ogni assembly di input vengono copiati nell’assembly target. Puoi specificare un’espressione regolare facoltativa per unire gli attributi duplicati che vi corrispondono.

—embed <assembly>

Babel Obfuscator può incorporare più assembly di dipendenza nell’assembly target. Gli assembly incorporati vengono compressi e cifrati. L’incorporamento può semplificare la distribuzione e ridurre le dimensioni del software. Puoi usarlo al posto dell’unione quando non serve offuscare completamente l’assembly di dipendenza.

Questa opzione può essere specificata più volte.

babel myapp.exe --embed Library1.dll --embed Library2.dll

—[no]internalize

Quando è abilitata, la visibilità di tutti i tipi pubblici degli assembly uniti viene ridotta a internal (Friend in VB).

—[no]jsonmanifest

Abilita ([no]disabilita) la gestione del manifesto delle dipendenze (impostazione predefinita: abilitata). Quando unisce le dipendenze, Babel Obfuscator può aggiornare il file manifesto .deps.json dell’assembly target.

Ridenominazione

Queste opzioni servono a configurare la ridenominazione dei simboli.

—[no]types (t)

Indica se abilitare la ridenominazione dei tipi.

—[no]events (e)

Indica se abilitare la ridenominazione degli eventi.

—[no]methods (m)

Indica se abilitare la ridenominazione dei metodi.

—[no]parameters (r)

Indica se abilitare la ridenominazione dei parametri dei metodi.

—[no]properties (p)

Indica se abilitare la ridenominazione delle proprietà.

—[no]fields (f)

Indica se abilitare la ridenominazione dei campi.

—[no]xaml [key=value]

Se è abilitata, i simboli usati nelle risorse XAML o BAML vengono rinominati. Questa opzione accetta coppie chiave-valore facoltative, specificate come <key>=<value>.

Le coppie chiave-valore accettate sono:

keys=[on/off] Whether to enable renaming of dictionary keys res=[on/off] Whether to enable renaming of BAML/XAML resources strip=[on/off] Whether to strip line information or white spaces manual=[on/off] Whether to use manual symbol renaming

—[no]virtual [key=value]

Indica se rinominare i membri virtuali, come metodi, proprietà ed eventi. Questa opzione accetta coppie chiave-valore facoltative, specificate come <key>=<value>.

Le coppie chiave-valore accettate sono:

external=[on/off] Whether to obfuscate external virtual calls

—[no]overloaded [key=value]

Quando è abilitata, Babel Obfuscator usa lo stesso nome per due o più metodi dello stesso tipo ogni volta che le regole del CLR lo consentono. Puoi inserire coppie chiave-valore facoltative per scegliere a quali simboli applicare l’overload.

Le coppie chiave-valore accettate sono:

methods=[on/off] Whether to overload methods properties=[on/off] Whether to overload methods parameters=[on/off] Whether to overload parameters

—[no]flatns (n)

Quando è abilitata, tutti i tipi rinominati vengono spostati nel namespace globale. La gerarchia dei namespace viene così appiattita e nell’assembly offuscato non resta alcuna informazione sui namespace.

—[no]unicode [char set]

Se è abilitata, i nomi vengono sostituiti con stringhe Unicode illeggibili. Con la normalizzazione Unicode disabilitata, tutti i nomi offuscati sono stringhe di caratteri minuscoli dell’alfabeto latino. Puoi anche specificare il set di caratteri usato per generare i nomi offuscati.

babel myapp.exe --unicode 0xf000-0xfe00 babel myapp.exe --unicode 10,13,a-z

—namelength <n>

Imposta la lunghezza minima dei nomi dei simboli rinominati. Puoi inserire coppie chiave-valore facoltative per stabilire separatamente la lunghezza minima per tipi, metodi, proprietà, campi ed eventi.

babel myapp.exe --namelength types=12 --namelength methods=3

—nameprefix [prefix]

Imposta il prefisso dei nomi dei simboli rinominati. Puoi inserire coppie chiave-valore facoltative per impostare separatamente il prefisso per tipi, metodi, proprietà, campi, eventi e parametri.

babel myapp.exe --nameprefix types=$Name_ --nameprefix methods=M_

Il valore speciale $Name viene sostituito con il nome originale del simbolo. Di solito il prefisso $Name serve per eseguire il debug dei problemi di ridenominazione.

—[no]xmldoc [file|regex]

Indica se aggiornare la documentazione XML dell’assembly target escludendo tutti i simboli rinominati. Puoi specificare il percorso del file di documentazione XML oppure un’espressione regolare. Se il nome del file o l’espressione regolare corrisponde al nome del file di documentazione XML di un assembly unito, il documento XML dell’assembly unito viene unito a quello dell’assembly target.

Offuscamento del flusso di controllo

L’offuscamento del flusso di controllo trasforma il codice di un metodo, nascondendone il percorso di esecuzione e rendendo il flusso risultante molto più complesso e difficile da capire.

—[no]controlflow

Serve ad alterare il flusso di controllo dei metodi. Puoi inserire coppie chiave-valore facoltative <key>=<value> per configurare la riorganizzazione del codice.

Coppie chiave-valore accettate che producono codice IL verificabile:

goto=[on/off] Whether to insert irrelevant branches switch=[on/off] Whether to enable switch scrambling case=[on/off] Whether to hide case constants if=[on/off] Whether to enable if scrambling call=[on/off] Whether to enable random calls value=[on/off] Whether to use value encryption token=[on/off] Whether to enable emission of method tokens chain=[on/off] Whether to enable chained-state flattening (Ultimate)

Per produrre codice IL non verificabile:

underflow=[on/off] Whether to enable stack underflow

Questa opzione può essere specificata più volte, per esempio:

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

—iterations <n>

Imposta il numero di iterazioni usato dall’algoritmo di offuscamento del flusso di controllo. Con 0 iterazioni l’offuscamento del flusso di controllo viene disabilitato. Al crescere di n, in ogni metodo viene inserito un numero crescente di istruzioni di salto irrilevanti.

—[no]invalidopcodes [mode]

Usa questa opzione per emettere opcode MSIL non validi. In questo modo alcuni strumenti basati sulla reflection non riescono a ispezionare il corpo IL dei metodi.

Se abiliti questa opzione, l’assembly offuscato non è più verificabile dagli strumenti di verifica dell’Intermediate Language (IL). Il codice IL non verificabile non può essere eseguito sui sistemi operativi x64: non abilitare quindi questa opzione se l’assembly offuscato è destinato a piattaforme x64.

Il parametro facoltativo [mode] abilita diverse configurazioni di opcode non validi:

enhanced: Insert additional invalid op-codes

Cifratura e protezione

Opzioni che riguardano le funzionalità avanzate di offuscamento, come la cifratura delle stringhe e del codice.

—[no]msilencryption [regex]

Indica se abilitare la cifratura del codice per i metodi che corrispondono all’espressione regolare facoltativa o alle regole di offuscamento definite nei file di regole XML. Questa opzione può essere specificata più volte.

—[no]stringencryption [name]

Indica se abilitare la cifratura delle stringhe utente. Puoi specificare il parametro facoltativo name per scegliere l’algoritmo di cifratura da usare.

I nomi di algoritmo accettati sono:

hash The strings are arranged into a hash table xor Inline XOR encoded strings stream Authenticated per-string encryption, decrypted lazily; fully managed (AOT/trim/FIPS safe)

—[no]valueencryption [key=value]

Questa opzione abilita la cifratura dei valori costanti inline e degli array. Puoi inserire coppie chiave-valore facoltative <key>=<value> per abilitare o disabilitare la cifratura di determinati tipi.

Le coppie chiave-valore accettate sono:

int32=[on/off] Whether to encrypt Int32 values int64=[on/off] Whether to encrypt Int64 values single=[on/off] Whether to encrypt Single values double=[on/off] Whether to encrypt Double values array=[on/off] Whether to encrypt Arrays

—[no]ildasm

Quando è abilitata, all’assembly target viene aggiunto l’attributo System.Runtime.CompilerServices.SuppressIldasmAttribute, che impedisce al Microsoft MSIL Disassembler, ILDASM (Ildasm.exe), di disassemblare il target offuscato.

—[no]reflection

Indica se abilitare l’emissione di metadati non validi per bloccare gli strumenti basati sulla reflection.

—[no]resourceencryption [key=value]

Indica se abilitare la cifratura delle risorse gestite. Quando è abilitata, tutte le risorse incorporate vengono compresse e cifrate. Puoi inserire coppie chiave-valore facoltative per specificare impostazioni aggiuntive.

Le coppie chiave-valore accettate sono:

encrypt=[on/off] Whether to encrypt resources compress=[on/off] Whether to compress resources protect=[on/off] Whether to protect embedded resources

—[no]proxy [type][;regex]

Indica se abilitare la generazione di chiamate proxy verso metodi esterni o interni. Il parametro facoltativo [type] può assumere uno dei seguenti valori:

external hide calls to external assembly methods internal hide calls to internally defined assembly methods all hide both internal and external method calls

Puoi anche inserire un’espressione regolare che corrisponde alla firma dei metodi da chiamare tramite proxy, per esempio:

babel.exe myapp.exe --proxy external --proxy ;System.Array::.* --proxy ;::GetEnumerator

—[no]tamperingdetection

Indica se abilitare il rilevamento delle manomissioni.

—[no]antidebugging

Indica se abilitare la protezione dal debug.

Generazione del codice

Queste opzioni riguardano alcune ottimizzazioni del codice che Babel Obfuscator può applicare all’assembly target.

—addreference <assembly>

Aggiunge o reindirizza un riferimento a un assembly nell’assembly target. Esempio:

babel myapp.exe --addreference "[System*, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]"

Reindirizza tutti i riferimenti System verso gli assembly portabili. Questa opzione può essere specificata più volte.

—[no]cleanattrs <regex>

Indica se abilitare la rimozione degli attributi indesiderati. Il parametro <regex> è un’espressione regolare che corrisponde al nome completo del tipo degli attributi indesiderati. Questa opzione può essere specificata più volte.

—[no]constremoval

Indica se abilitare la rimozione dei campi costanti. Ogni riferimento a un campo costante viene sostituito con il suo valore costante ogni volta che è possibile.

—[no]deadcode [regex]

Indica se abilitare la rimozione del codice inutilizzato. Quando è abilitata, rimuove tutti i metodi, le proprietà, i campi e gli eventi che nessun percorso del codice raggiunge. Con [regex] puoi specificare un punto di ingresso facoltativo da cui far partire la ricerca.

—[no]debug [source]

Indica se abilitare l’emissione delle informazioni di debug e generare un file PDB di simboli di debug per il target offuscato. Puoi anche specificare un archivio di simboli di debug.

--debug srv*c:\Symbols*http://msdl.microsoft.com/download/symbols

—[no]disgregateremoval

Indica se abilitare la rimozione dei metadati di proprietà ed eventi, lasciando solo i metodi di accesso di proprietà ed eventi.

—[no]enumremoval

Indica se abilitare la rimozione dei tipi System.Enum. Ogni riferimento a un campo di un’enumerazione viene sostituito con il suo valore costante ogni volta che è possibile.

—[no]inlineexpansion

L’espansione inline del codice permette di sostituire la chiamata a un metodo con il codice del metodo stesso, nel punto in cui avviene la chiamata.

—[no]instrument [regex]

Indica se abilitare la strumentazione del codice. Puoi specificare un’espressione regolare facoltativa per indicare, con il nome completo, i membri da strumentare.

I nomi completi dei membri hanno la seguente sintassi

[NamespaceName].[TypeName]::[MethodName]

Esempio:

babel myapp.exe --instrument mynamespace\.mytype::.*

Questa opzione può essere specificata più volte.

—[no]emptymethods

Indica se aggiungere il codice di strumentazione ai metodi con il corpo vuoto.

—moduleinitializer [method]

Aggiunge il codice dell’inizializzatore di modulo. Puoi anche specificare la firma di un metodo statico senza parametri, che verrà chiamato dopo il caricamento del modulo.

[Obfuscation(Feature = "module initializer:priority=120")] public static void DoInitialize120() { Console.WriteLine("DoInitialize120"); }

Qui priority può assumere un valore intero che definisce l’ordine in cui Babel chiama i metodi di inizializzazione. Babel aggiunge i propri metodi di inizializzazione con una priorità predefinita pari a 100. Gli inizializzatori con priorità inferiore a 100 vengono chiamati per primi.

—[no]seal

Quando è abilitata, sigilla tutte le classi non pubbliche che non sono usate come classi base in una gerarchia di ereditarietà. Dichiarare una classe come sigillata può migliorare le prestazioni delle chiamate ai metodi, perché evita al compilatore Just-In-Time (JIT), dove possibile, di percorrere la tabella dei metodi virtuali.

Last updated on