Algoritmi del flusso di controllo
Babel Obfuscator offre diversi algoritmi del flusso di controllo, che puoi abilitare singolarmente. La maggior parte produce IL verificabile e funziona su tutti i runtime supportati; due (token e underflow) no, e sono descritti alla fine di questa pagina.
Algoritmi verificabili
| Algoritmo | Che cosa fa |
|---|---|
goto | Inserisce diramazioni irrilevanti, che rendono il flusso di controllo più lungo e meno lineare. |
if | Riscrive le istruzioni if in forme più complesse, introducendo condizioni aggiuntive. |
switch | Ricostruisce un metodo attorno a uno o più dispatcher switch, così i suoi blocchi non vengono più eseguiti nell’ordine del sorgente (è la tecnica nota come appiattimento, o flattening). |
case | Nasconde i valori costanti che guidano il dispatcher switch, che così non compaiono più nel codice come semplici numeri. |
call | Aggiunge variabili che determinano il salto successivo all’interno del corpo dello switch e che sono prodotte da chiamate ad altri metodi. |
value | Protegge ulteriormente i selettori dello switch con la funzionalità di cifratura dei valori. |
chain | Chained State: un algoritmo di appiattimento avanzato, rafforzato contro il deoffuscamento automatico. Disponibile a partire dall’edizione Ultimate. Vedi Chained State. |
goto e if costano poco e possono essere applicati su larga scala. La famiglia switch (switch, case, call, value) e chain appiattiscono un metodo e sono le trasformazioni più forti, con un costo maggiore in fase di esecuzione: vedi Prestazioni e tuning.
Chained State Ultimate
chain è un algoritmo di appiattimento, come switch, ma è progettato specificamente per resistere agli strumenti automatici capaci di ricostruire un normale metodo appiattito. Produce IL verificabile e funziona su tutti i runtime supportati. Abilitalo con --controlflow chain=on. Ha una pagina dedicata: Chained State.
Opzioni non verificabili
L’algoritmo token inserisce nel flusso di controllo token di metadati non validi, mentre l’algoritmo underflow aggiunge al corpo del metodo punti in cui lo stack gestito può andare in underflow. Entrambi rendono l’IL non verificabile.
Gli algoritmi token e underflow non sono compatibili con la natura verificabile degli assembly .NET e .NET Core e possono causare errori in fase di esecuzione. Babel Obfuscator li disabilita automaticamente quando gli assembly sono destinati a .NET o .NET Core.
Opcode non validi
L’opzione Emit Invalid Opcodes aggiunge istruzioni MSIL non valide accanto a quelle inserite da ogni algoritmo, il che può rendere più difficile per i decompilatori ricostruire il codice originale. Se la abiliti, l’assembly diventa non verificabile e il CLR è costretto a eseguire l’applicazione come processo a 32 bit.
Non abilitare Emit Invalid Opcodes se l’applicazione deve essere eseguita come processo a 64 bit, o se è destinata a .NET Core o .NET Framework, dove l’assembly deve contenere IL verificabile per poter essere eseguito. In questi casi lascia l’opzione disattivata.