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.