Home > java > Java Bytecode Obfuscator

Java Bytecode Obfuscator

20 novembre 2010

Translate in English with Google Translate
Un offuscatore è un software in grado di rendere difficile la leggibilità del codice sorgente. Java è un linguaggio interpretato ma il codice sorgente subisce una serie di passaggi prima di essere eseguito.Viene compilato dal compilatore della JVM, tramite il comando javac,  e viene prodotto un codice intermedio detto bytecode che viene interpretato dalla JVM, tramite il comando java, per poi essere compilato a runtime dal compilatore JIT nel linguaggio macchina relativo al processore in uso.

Il bytecode è un file binario pertanto è di difficile lettura e, anche se è possibile utilizzare un editor esadecimale, solitamente viene letto utilizzando:

  1. disassemblatore Sun/Oracle javap -c che consente di visualizzare il linguaggio macchina della JVM
  2. decompilatore che consente di ricostruire il codice sorgente.


In Java un offuscatore ha l’obiettivo di modificare il bytecode introducendo una serie di istruzioni tali da rendere difficile la decompilazione ma garantendo le funzionalità e non generando overhead.
Un offuscatore deve presentare 3 caratteristiche:

  1. potenza: indica la capacità di complicare la comprensione del funzionamento del codice
  2. resistenza: indica la capacità di resitere agli attacchi di ricostruzione del codice originario.
  3. costo: indica il livello di overhead introdotto dalle modifiche al bytecode

La potenza dell’offuscazione introduce un livello di complessità che si concretizza in:

  1. complessità dei cicli: indica il livello di complessità che viene introdotto attraverso cicli annidati inseriti nel codice di offuscazione.
  2. complessità del flusso di controllo: indica il livello di complessità introdotto attraverso le istruzioni GOTO che innescano un spaghetti code a fronte di un codice sequenziale privo di salti
  3. complessità delle variabili: questa complessità è associata a 4 fattori:
    1. variabili duplicate: variabili con nomi uguali ma con diverso significato (all’interno di diversi metodi).
    2. variabili extra: variabili con nome diversi con stesso significato (all’interno dello stesso metodo).
    3. variabili non descrttive: variabile rinominata in modo non parlante
    4. variabili cifrate: il contenuto delle variabili viene cifrato in modo da non rendere possibile la lettura.
  4. lunghezza del programma: il LOC (lines of code) incide sulla comprensione del codice.  Infatti maggiori sono le linee di codice e maggiori saranno le difficoltà nel comprenderle.

La resistenza indica la capacità di resistere agli attacchi di de-offuscazione cioè ai tentativi di ricostruzione del codice originario a partire dal codice offuscato attraverso degli algoritmi di semplificazione del codice.  La resistenza dell’offuscatore deve prevedere un algoritmo tale da non permettere una facile de-offuscazione.

I costi si riferiscono al consumo di risorse richieste affinchè sia possibile offuscare il codice. Tali costi si riferiscono a:

  1. memoria: distinguiamo 2 tipologie di allocazioni di memoria utilizzate dalle operazioni di offuscazione:
    1. le operazioni ricorsive: tendono ad occupare molto spazio nello stack della JVM
    2. le operazioni di allocazione di oggetti: tendono a creare molti oggetti nell’head della JVM
  2. spazio disco: lo spazio del disco deve essere sempre capace di contenere l’elaborazione completa frutto dell’offuscazione e l’offuscazione non deve richiedere ingenti spazi disco.
  3. processore:  l’offuscazione del codice inserisce delle operazioni che possono comportare maggiore o minore tempo di elaborazione rispetto all’elaborazione iniziale.  L’overhead aggiuntivo costituisce un elemento negativo che degrada l’applicazione.

In un articolo successivo vedremo un esempio di offuscazione del codice partendo da un progetto open-source.
Una lista di offuscatori la possiamo trovare qui

Categorie:java Tag:
  1. Non c'è ancora nessun commento.
  1. 3 dicembre 2010 alle 2:23 PM
I commenti sono chiusi.
%d blogger cliccano Mi Piace per questo: