Archive

Archive for novembre 2010

Java Bytecode Obfuscator con ProGuard

22 novembre 2010 3 commenti

Translate in English with Google translate
Nell’articolo precedente ho parlato delle caratteristiche dell’offuscazione del codice mentre in questo articolo farò qualche esempio utilizzando il progetto open-source ProGuard rilasciato con licenza GPL.

Questo progetto non si occupa solo di offuscare il codice ma esegue eventualmente operazioni di riduzione ed ottimizzazione del codice.

ProGuard: step opzionali di processamento

ProGuard: step opzionali di processamento

Leggi tutto…

Categorie:java

Java Bytecode Obfuscator

20 novembre 2010 1 commento

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.

Leggi tutto…

Categorie:java Tag:

Bytecode injection con javassist

12 novembre 2010 Commenti disabilitati
Translate in English with Google Translate

Lo scopo di questo articolo è di utilizzare una libreria opensource per modificare il bytecode in modo tale da deviare il comportamento di una classe. L’obiettivo può essere quello di apportare una patch, oppure per esigenze di logging o debug del codice oppure per hacking! Prima di tutto dobbiamo partire da una libreria che ci consenta di manipolare il bytecode. Per fare questo possiamo utilizzare diversi progetti:

  1. javassist di JBoss Comunity
  2. ASM del Consorzio ObjectWeb
  3. Byte Code Engineering Library (BCEL) della Apache Software Foundation

Scelgo di usare javassist, progetto molto semplice ed essenziale che mi permette di manipolare il bytecode.
Leggi tutto…

Categorie:java

Crack The Verifier

10 novembre 2010 1 commento

Translate in English with Google Translate
Tempo fa Sun Microsystem lanciò una sfida dal nome Crack The Verifier rivolta alla comunità per testare il Verifier di Java 1.6 Mustang. In questo articolo intendo mostrare quali strumenti poter usare per “provare a rompere” il Verifier. In un articolo precedente ho fatto una introduzione al Verifier, quindi adesso passo agli esempi.

Casi di errore
Il riconoscimento di un errore ad opera del Verifier da luogo alla propagazione di java.lang.VerifyError e tale errore viene solitamente propagato in caso di un baco del compilatore oppure di un tentativo di hacking del file class.

Scegliano il secondo caso e creiamo un file class personalizzato.
In questo modo, possiamo seguire 2 strade:

  1. creare un nuovo file class utilizzando il progetto jasmin
  2. modificare un file class esistenze utilizzando un editor esadecimanle oppure il progetto jasmin + kimera

Leggi tutto…

Categorie:java

Sicurezza in Java: il Verifier

Translate in English with Google Translate

In questo articolo ci concentreremo sul Verifier per capire meglio a cosa serve e come funziona.
Come abbiamo visto in un precedente articolo, l’esecuzione di una classe Java richiede il compimento di 3 operazioni:

  1. caricamento della classe ad opera del ClassLoader
  2. controllo del codice ad opera del Verifier
  3. controllo dei permessi ad opera del SecurityManager

Il Verifier opera a stretto contatto con il ClassLoader, difatti la classe, dopo che è stata caricata dal ClassLoader, viene controllata dal Verifier per assicurarsi che sia corretta. Qualora venga riscontrato un errore, verrà rilanciata una eccezione.
Il compilatore Java non dovrebbe generare un bytecode malformato ma potrebbero verificarsi delle situazioni tali da determinare degli errori, per esempio:

  1. un baco nel compilatore: il compilatore, come tutti i software è soggetto a bachi, per quanto la Sun/Oracle effettui continui controlli. Inoltre bisogna considerare che i compilatori Java sono prodotti anche da altre enti/organizzazioni. Possiamo ricordare: JRockit precedentemente di BEA ora ORACLE, poi IBM J9 della “Big Blue” ed ancora “Apache Harmony” della “Apache Software Foundation” ed altre ancora.
  2. un tentativo di hacking: è sempre possibile modificare un file class usando un editor esadecimale in modo tale da eseguire delle operazioni pericolose oppure è possibile utilizzare un assemblatore che consenta di generare un proprio bytecode.

Leggi tutto…

Categorie:java

Sicurezza in Java: il SecurityManager

6 novembre 2010 Commenti disabilitati

Translate in English with Google Translate
L’esecuzione di una classe Java richiede, ad opera della Java Virtual Machine, il compimento di 3 operazioni preliminari:

  1. caricamento della classe ad opera del ClassLoader
  2. controllo del codice ad opera del Verifier
  3. controllo dei permessi ad opera del SecurityManager

Di default l’esecuzione di una applicazione Java non prevede il controllo ad opera del SecurityManager mentre invece questo controllo è previsto in caso di esecuzione di una Applet.
L’obiettivo del SecurityManager è di verificare che le classi in esecuzione abbiano i permessi per eseguire direttamente o indirettamente i metodi richiamati. Di default i permessi sono definiti nel file java.policy che può essere personalizzato in base alle necessità. In base ai permessi viene concessa l’esecuzione di operazioni potenzialmente pericolose, ossia tutte quelle operazioni che possono svolgersi sul File System, connessioni di rete, sulla JVM ed altro.
Leggi tutto…

Categorie:java