GLOSSARIO
Bytecode : File binari Java (vedi Java),una forma eseguibile in
liguaggio Java che diversamente dagli altri linguaggi di programmazione come il
C e Pascal, può essere eseguito su qualsiasi pc attraverso JVM ( vedi Java
Virtual Machine). E' chiamato anche codice interpretato, o pseudo-codice o
p-code.
CFG : Grafo del controllo di flusso. E’ costruito nella
fase di front-end della compilazione [1].
Cifrare : detto
anche encrypt, è una tecnica che permette di assicurare la riservatezza di un
messaggio. Quella a chiave pubblica (crittosistema a chiavi pubbliche) si basa
sul fatto che ogni persona prima di scambiare messaggi cifrati si procura due
chiavi generate nello stesso tempo: una chiave pubblica e una chiave privata.
La chiave pubblica è resa disponibile a chiunque voglia inviare informazioni
protette. Il mittente cifra con la chiave pubblica del destinatario. Il
destinatario decifra con la propria chiave privata.
Classe : In
Java, un tipo che definisce l'implementazione di un particolare tipo di
oggetto. Una definizione di classe definisce le variabili e i metodi di istanza
e di classe, oltre a specificare le interfacce implementate dalla classe e la
superclasse immediata della classe. Se la superclasse non è specificata
esplicitamente, sarà implicitamente Object
Clichè :
Problematica che indica la presenza di comuni idiomi di programmazione in un
programma.
Compilare :
Processo che permette di tradurre un linguaggio sorgente ad alto livello in un
linguaggio comprensibile alla macchina controllandone anche la correttezza
sintattica [1].
Compilatori
just in time : Un compilatore che
converte l'intero bytecode nel codice in linguaggio macchina nativo durante
l'esecuzione di
un programma Java. Questo dà luogo a un miglioramento
della velocità di esecuzione rispetto al codice interpretato da una macchina
virtuale Java.
Costo della trasformazione : Misura l’overhead in termini di tempo/spazio del
programma trasformato rispetto al programma originale.
Debugging :
Metodi per la ricerca e la correzione di errori in altri programmi e che
consente al programmatore di osservare il funzionamento del programma passo per
passo, di esaminare i dati e di verificare le condizioni, per esempio i valori
delle variabili
Decompilare
: Procedimento inverso a quello della compilazione, che permette di restituire
il codice sorgente in un determinato linguaggio evoluto ad alto livello
partendo dal file eseguibile.
Deoffuscare :
Processo inverso all’offuscamento, che tenta di rimuovere gli offuscamenti nel
bytecode trasformato nell’intento di comprendere il contenuto del programma
sorgente.
DFA : Automa
a stati finiti deterministico [1]
Dissasemblare :
Processo che consente di convertire codice
macchina in codice sorgente in linguaggio assembly. La maggior parte dei
debugger possiede qualche tipo di disassembler interno che consente al
programmatore di visualizzare un programma eseguibile in termini di linguaggio
Garbage collection :
La rilevazione e il recupero automatico della memoria che non viene più
utilizzata. Il sistema runtime Java recupera lo spazio in modo che i
programmatori non debbano preoccuparsi di eliminare esplicitamente gli oggetti.
Java : Versatile linguaggio di programmazione, orientato
agli oggetti, che sviluppa degli Applet (vedi Applet) autonomi, è eseguibili
all'interno del browser (vedi browser); molto utilizzato in ambiente Internet.
Le applicazioni java, invece, per essere eseguite non non necessitano del browser
Java class file :
File che contengono una sequenza di byte chiamata bytecode ovvero il set di
istruzioni della java virtual machine.
Linguaggi Object-Oriented : Tecnica concepita negli anni sessanta che si propone
di semplificare il processo di scrittura del software attraverso la
incapsulazione dei dati e dei metodi di accesso agli stessi entro singoli
componenti software chiamati “oggetti” [1].
Language breaking :
Trasformazione di un programma in cui si introducono sequenza di istruzioni
machine virtuali (o codice nativo) che non hanno nessuna corrispondenza diretta
con alcun costrutto del linguaggio sorgente.
Metodo : Una
funzione definita in una classe.
Metrica : Ramo del
software engineering che si occupa di indicare una misura diretta o indiretta
di qualche attributo di entità d’interesse. Nel nostro campo la metrica viene
creata con l’intento di aiutare la costruzione di software leggibile, sicuro e
mantenibile.
Metrica (lunghezza del
programma): E(P) aumenta col numero di
operatori e d operandi in P
Metrica (Cyclomatic Complexity): E(F) aumenta col numero di predicati in F.
Metrica (complessità annidata): E(F) aumenta con il
numero di livelli annidati di predicate condizionali in F.
Metrica (complessità del flusso dei dati): (F) aumenta col numero di
riferimenti a basic block in F.
Metrica (Complessità fan-in/out):
(F) aumenta col numero di parametri formali di F, e con il numero di strutture
dati globali lette o aggiornate da F.
Metrica (Complessità delle
strutture dati): E(P) aumenta con la
complessità delle strutture dati statiche dichiarate in P . La complessità di una vaiabile scalare è costante. La complessità di un
array aumenta col numero di dimensioni e con la complessità del tipo degli elementi
. La complessità di un record aumenta con il numero e la complessità dei suoi
campi
Metrica (Metrica 00): vedi tabella 1
Offuscare :
Metodi e tecniche atte a convertire un programma in un altro equivalente in
modo che sia difficile capirne il contenuto e di farne il Reverse engineering
Overhead :
Elaborazione secondaria che deve essere eseguita prima che possa essere
compiuto il compito principale.
Potenza della trasformazione : Misura di quanto la trasformazione di un programma
cambia la complessità dello stesso programma.
Predicato opaco :
Espressione booleana il cui esito è ben conosciuto dall’offuscatore ma
difficile da dedurre per il deoffuscatore.
Qualità della trasformazione : Combinazione della potenza, della resilienza e del
costo di una trasformazione di un programma.
Resilienza della trasformazione : Misura di della resistenza di una trasformazione di
un programma ad un attacco di un deoffuscatore automatico, tale misura può
andare da trivial (debole) a one-way (irreversibile).
Reverse engineer : Programmatore esperto che cerca di risalire al codice sorgente che ha
generato il codice oggetto in esame.
Rifattorizzazione :
Tecnica per ristrutturare i programmi objectc oriented la cui struttura risulta
compromessa o deteriorata.
Trasformazione offuscante : tipo di trasformazione di un programma sorgente che
conserva il comportamento del programma originale.
Trasformazione one-way :
Trasformazione di un programma facile da effettuare ma irreversibile, nel senso
che non è possibile ritornare al programma originale in alcun modo.
Thread
(lightweight process) : E’ un particolare
processo che condivide le risorse allocate al task a cui appartiene con gli
altri eventuali thread che compongono il task.
E’ uato per creare
applicazioni concorrenti.
Variabile opaca :
Variabile che possiede una qualche proprietà che è conosciuta a priori
dall’offuscatore, ma che è difficile per il deoffuscatore da dedurre.