Chained State Ultimate
Chained State (chain) è la trasformazione del flusso di controllo più forte di Babel Obfuscator. Come l’algoritmo switch, appiattisce un metodo (flattening): lo ricostruisce attorno a un dispatcher, così i suoi blocchi non vengono più eseguiti nell’ordine del sorgente. È però progettato specificamente per resistere agli strumenti automatici capaci di annullare un normale appiattimento.
Perché Chained State
Il normale appiattimento con switch è efficace contro un lettore umano, ma una nota classe di deoffuscatori automatici riesce spesso a ricostruire il metodo originale: analizzano staticamente il dispatcher, ricavano l’ordine in cui i blocchi dovevano essere eseguiti e riscrivono il metodo in una forma vicina al sorgente. Contro questi strumenti, il semplice appiattimento può essere annullato in un solo passaggio automatico.
Chained State colma questa lacuna. Il dispatcher è costruito in modo che l’ordine originale non possa essere ricavato con la sola analisi statica: un attaccante deve eseguire davvero il metodo per seguirne il flusso. Nei test interni contro un comune deoffuscatore automatico del flusso di controllo, il codice appiattito con switch è stato ricostruito fino a riottenere il metodo originale, mentre lo stesso codice appiattito con chain è rimasto intatto. Il risultato è un metodo appiattito che resiste sia alla lettura manuale sia al recupero automatico.
Chained State è un rafforzamento dell’appiattimento, non un suo sostituto. Puoi abilitarlo da solo oppure insieme agli altri algoritmi del flusso di controllo.
CompatibilitÃ
Chained State emette solo IL ordinario e verificabile e non aggiunge tipi di supporto, reflection o dipendenze di runtime. Per questo funziona senza modifiche su tutta la gamma .NET:
- Da .NET Framework 4.x a .NET 10, .NET Core e Mono / Xamarin.
- Applicazioni sottoposte a trimming (ILLink) e NativeAOT: non c’è codice dinamico che possa smettere di funzionare con la compilazione ahead-of-time.
- .NET MAUI, compresi Android e iOS.
Poiché la trasformazione resta entro i limiti dell’IL verificabile, non costringe l’assembly a un processo a 32 bit e può essere combinata senza rischi con il resto della tua configurazione di offuscamento.
Prestazioni
Chained State ha lo stesso tipo di costo in fase di esecuzione dell’appiattimento con switch (un metodo appiattito esegue un dispatcher a ogni chiamata) e in pratica il suo overhead per chiamata si discosta di pochi punti percentuali da quello del normale switch. Come per ogni appiattimento, riservalo ai metodi che proteggono davvero la tua proprietà intellettuale e tienilo lontano dai percorsi eseguiti più di frequente e critici per le prestazioni. Vedi Prestazioni e tuning per il confronto completo e per sapere come limitarlo con le regole.
Abilitare Chained State
Riga di comando
babel myapp.exe --controlflow chain=onPuoi combinarlo con gli altri algoritmi, per esempio:
babel myapp.exe --controlflow switch=on --controlflow case=on --controlflow chain=onTask Babel di MSBuild
<PropertyGroup>
<ControlFlowObfuscation>chain=true;true</ControlFlowObfuscation>
</PropertyGroup>
<Babel ControlFlowObfuscation="$(ControlFlowObfuscation)" />Babel Desktop
Nel gruppo Flusso di controllo del pannello delle proprietà , abilita l’offuscamento del flusso di controllo (ControlFlowObfuscation) e seleziona chain tra gli algoritmi.
Chained State è disponibile a partire dall’edizione Ultimate (e nelle edizioni Server / Data Center). Con l’edizione Enterprise il motore non applica l’algoritmo chain.