Il Reverse engineering, conosciuto anche con il nome di ingegneria inversa, è il processo mediante il quale si esegue l’analisi dettagliata della struttura e del funzionamento di un oggetto, sia esso fisico, software o hardware, al fine di estrarne le specifiche di implementazione e progettazione.

In quest’articolo ci concentreremo sui meccanismi che ne regolano le prassi e sulle implicazioni che questa tecnica presenta tanto nel mondo hacking quanto in ambito cybersecurity.

reverse engineering
  1. Reverse engineering: in cosa consiste
  2. Codice sorgente ed eseguibile: premesse concettuali
  3. Dall’eseguibile all’assembly: la decompilazione
  4. Le fasi del reverse engineering
  5. Ambiti d’applicazione del reverse engineering
  6. Legislazione vigente
  7. Clean room design: cos’è la tecnica della parete cinese
  8. Tecniche per contrastare il reverse engineering illecito

Reverse engineering: in cosa consiste

Il Reverse engineering è una tecnica che, come indica la denominazione stessa, è stata mutuata dall’ambente ingegneristico.
Nonostante ciò, i suoi principi di fondo hanno trovato facile applicazione in molti altri campi: da quello manifatturiero all’economia, approdando, naturalmente, all’informatica.

In quest’ultimo caso, l’ingegneria inversa è utilizzata secondo allo scopo di ricostruire un codice ad alto livello a partire da un codice binario a basso livello.

Ma in cosa consiste questo passaggio?
Analizziamone i dettagli insieme.

Codice sorgente ed eseguibile: premesse concettuali

Per comprendere quanto appena illustrato, bisogna fare un passo indietro e tornare alla definizione di applicazione software o programma informatico che dir si voglia.

Questa non è altro che una porzione di codice scritta in un linguaggio testuale (solitamente C o C++) comprensibile all’uomo, quindi definito di alto livello. Esso prenderà il nome di codice sorgente.

A questo punto, affinché questo codice possa essere interpretato dalla macchina, è necessario che un compilatore attraverso un’analisi

  • Sintattica
  • Lessicale
  • Semantica

lo traduca in eseguibile: composto dalla combinazione di codice oggetto e linker. Quest’ultimo aggiunge al codice oggetto funzioni di libreria che permettono al compilatore di comprenderne parte di quelle contenute al suo interno.

Solo a livello di eseguibile, la macchina è in grado di processare il programma: proprio perché questi altro non è che la traduzione in linguaggio binario del codice sorgente.

Questa la premessa per capire il meccanismo su cui si poggia il Forward engineering, che in senso lato si può intendere come implementazione ex-novo di un programma. Passiamo ora al reverse engineering vero e proprio.

Dall’eseguibile all’assembly: la decompilazione

Spesso, per evidenti ragioni di copyright, il codice sorgente di un software viene creato con licenza proprietaria affinché terzi non possano accedervi.

Pertanto, per potervi risalire, è necessario appunto partire dall’eseguibile per procedere a ritroso fino al linguaggio di alto livello : ecco spiegato il meccanismo generale dell’ingegneria inversa.

Per poter fare ciò, vengono utilizzati appositi strumenti detti decompilatori (detti anche IDA, Interactive disassembler).
Questi, controparte dei complier (compilatori) con cui si lavora durante il Forward engineering, destrutturano l’eseguibile per risalire alle istruzioni implementative del codice sorgente.

Il linguaggio in cui questo eseguibile viene preliminarmente tradotto è un codice simile al linguaggio macchina, una sorta di intermediario tra il linguaggio binario e quello di alto livello.

Di questi codici intermedi si distingue tra:

  • Assembly (o linguaggio assemblatore) utilizzato nelle applicazioni per macchine reali
  • Bytecode, impiegato, invece, in macchine virtuali come la Java Virtual Machine

Le caratteristiche portanti di questa tipologia di linguaggi sono:

  • ogni opcode del linguaggio macchina – ovvero la porzione che descrive l’istruzione da eseguire – viene sostituito con forme mnemoniche.
  • gli indirizzi di memoria possono essere convertiti nella base numerica più consona o sotto forma di identificatori (stringhe di testo)

Lo scopo generale è quello di rendere il linguaggio macchina del compilatore da cui si è partiti nell’analizzare il software in un formato più leggibile e comprensibile per l’uomo.

I problemi più comuni della decompilazione

Una delle problematiche più comuni quando si effettua la decompilazione è la quantità di informazioni perse. La trascrizione in assembly, infatti, non è mai identica, quanto piuttosto isomorfica al codice sorgente.

In altre parole, l’assembly ne rappresenta la struttura generale, ma svariati elementi, tra cui gli identificatori testuali (nomi delle variabili, commenti, macro) vengono solitamente ignorati dal processo e quindi persi.

Inoltre, non è detto che l’eseguibile consti di solo codice sorgente: può essere infatti composto anche da dati d’esecuzione che ne complicano ulteriormente la lettura.

Le fasi del reverse engineering

Quello del reverse engineering insomma, è un procedimento tutt’altro che semplice nella sua esecuzione materiale.

Lasciato l’aspetto prettamente tecnico,possiamo, però, provare a tracciarne uno schema generale di strutturazione

  • Traduzione del codice sorgente in linguaggio assembly
  • Reverse engineering: il programma viene analizzato e viene redatta un’apposita documentazione circa la ricostruzione della sua organizzazione e del suo funzionamento
  • Miglioramento della struttura, tale da renderlo più facilmente leggibile e modificabile
  • Modularizzazione; le porzioni di codice inerenti a una stessa funzionalità vengono riorganizzate in modo da eliminare inutili ridondanze
  • Reingegnerizzazione: il codice così ottenuto viene reimplementato al fine di migliorarne o aggiungerne funzionalità o per una migliore integrazione nell’ambiente d’esecuzione

Ambiti d’applicazione del reverse engineering

Data la sua versatilità, il reverse engineering si dimostra essere un’arma a doppio taglio per la sicurezza informatica. Se da un lato, infatti, viene utilizzato per irrobustire un applicativo da potenziali attacchi hacker, dall’altro è impiegato dagli stessi criminali informatici per manipolare illegalmente i software.

Qui di seguito ne illustriamo brevemente i principali domini applicativi, tutti in ogni caso facenti capo o all’ambito dello sviluppo o di test.

  • Malware analysisGrazie al reverse engineering è possibile, attraverso un’analisi dinamica (o black box) un malware al fine di implementare nuove misure di sicurezza contro di esso.
  • Gestione dei bug nei software proprietari
    per migliorarne funzionalità e misure di sicurezza. Uno degli esempi che si può citare è il caso dell’azienda Intel. Questa ha dato vita all’iStare (Intel security threat analysis and reverse engineering) ,che analizza e testa le vulnerabilità dei microchip ancor prima che vengano immessi sul mercato.
  • Traslare in un linguaggio di programmazione più attuale il codice di un’Applicazioni legacy
  • Recupero di codici sorgente perduti
  • Personalizzazione di sistemi embedded
  • Eliminazione delle protezioni degli shareware (cracking)

Secondo la legislazione italiana, l’applicazione del reverse engineering è considerata legale soltanto a scopo di interoperabilità con altri sistemi.

Con interoperabilità nell’ambito informatico s’intende il miglioramento dell’interazione tra sistemi differenti. In altre parole, effettuare un’operazione di ingegneria inversa su un software è considerato legale soltanto al fine di farlo operare meglio sui sistemi implementati con tecnologie più all’avanguardia.

E’ regolata dall’art. 64 della legge 633 del 22 aprile 1941, come modificata dall’art. 5 del D. Lgs. 518/1992  che individua la tutela attribuibile del software nel quadro delle norme sul diritto d’autore. Il software, dunque, viene trattato alla stregua di un’opera letteraria.

Clean room design: cos’è la tecnica della parete cinese

Date le premesse legislative, il clean room design, che prende anche il nome di tecnica della parete cinese, è la tecnica di applicazione del reverse engineering strutturata in modo tale da non commettere alcuna violazione di copyright.

In linea generale essa si articola nelle seguenti fasi:

  • individuazione un ambiente di lavoro controllato;
  • analisi del sistema da reimplementare;
  • scrittura delle specifiche;
  • invio delle specifiche a un legale che constati che queste non siano coperte da copyright;
  • implementazione delle specifiche da parte un team diverso da quello che ha effettuato l’analisi preliminare.

Tecniche per contrastare il reverse engineering illecito

Come si ha avuto modo di constatare, il reverse engineering è applicabile legalmente soltanto a condizioni ben circoscritte e controllate.

Per sfuggire al pericolo che possano essere violate le norme di copyright su software proprietari vengono messe in campo alcune strategie volte a compromettere volutamente la leggibilità del codice sorgente.

Tra queste annoveriamo:

  • Offuscamento: che consiste nel complicare il codice in fase di programmazione rendendone più difficile la comprensione degli algoritmi;
  • Crittografia: questo sistema sfrutta un algoritmo matematico che, tramite l’utilizzo di una chiave (sequenza di caratteri), è in grado di cifrare informazioni
  • Cifratura che sfrutta la crittografia a chiave segreta. In sostanza, con questa tecnica viene cifrato il codice eseguibile
  • Firma digitale: grazie a questo sistema è possibile documentare l’integrità del codice. Purtroppo, però, assicura che l’applicazione non sia stata contraffatta solo nel momento precedente l’esecuzione dell’applicazione.