L’inversione del processo di progettazione e sviluppo che porta allo studio approfondito di un software.
Molte volte assistiamo a progetti che vengono abbandonati dai loro stessi creatori e che creano notevoli problemi di sicurezza in quanti continuano a usarne le funzionalità. In altri casi si assiste all’assenza di documentazione in merito, che rende molto difficile la comprensione e la manutenzione software da parte di terzi. Per risolvere questi inconvenienti, si fa ricorso ad una tecnica che prevede la ricostruzione del software mediante l’attenta analisi del suo funzionamento.
Il suo nome è reverse engineering e, come tutte le tecniche, presenta una doppia anima: una legittima e una malevola.
Ma come sempre, andiamo con ordine e affrontiamo per gradi l’argomento.

- Cos’è il reverse engineering?
- Come funziona il reverse engineering?
- Applicazioni del reverse engineering
Cos’è il reverse engineering?
Quando si parla di reverse engineering, si fa riferimento al processo che prevede la ricostruzione completa di un prodotto già esistente. Il fine ultimo è quello di smontarlo, comprenderne la struttura, l’architettura e il funzionamento, in modo da replicarlo altrove e tentare perfino di migliorarlo.
La tecnica di reverse engineering trae le sue origini dall’ingegneria meccanica, in cui lo studio attento di un pezzo fisico diviene fondamentale per comprenderne le funzionalità. Per ottenere questo risultato, si fa spesso ricorso a tutta una serie di strumenti specifici, come:
- scansione 3D
- tomografia
- misurazione a ultrasuoni.
Ciò serve a capire fin nel profondo il funzionamento di una macchina o di un dispositivo meccanico. Si tratta, a conti fatti, di un processo inverso a quello di progettazione, poiché parte dal componente finito e ne studia il funzionamento, al fine di replicarlo.
La tecnica di reverse engineering, in italiano ingegneria inversa, ha trovato terreno fertile anche nell’ambito informatico.
Invertendo il processo di sviluppo e produzione di un software, programmatori e ingegneri software sono in grado di osservarne attentamente il funzionamento da dietro le quinte. Quest’operazione si realizza partendo direttamente dal codice sorgente di un programma già pronto. Poiché esso rappresenta l’anima stessa del software, gli esperti sono in grado di leggerlo, comprenderne i costrutti e ricostruirne l’intera architettura.
Ma il processo di reverse engineering permette anche di rilevare bug sfuggiti agli sviluppatori originali e di apporvi le dovute correzioni.
Molto spesso si fa ricorso al reverse engineering per effettuare il porting di un software da una piattaforma all’altra.
Non è raro assistere a programmi e applicazioni scritti per funzionare su un determinato sistema operativo, che vengono successivamente convertiti e adattati per funzionare su altri. Nell’arco dei quarant’anni dell’informatica moderna, abbiamo visto molteplici software nativi per ambiente Windows, ricevere dei porting anche per Mac e, in tempi recenti, anche per Linux.
Tuttavia, è bene far notare come la buona riuscita di un porting effettuato mediante reverse engineering, dipenda in toto da due fattori:
- l’abilità degli sviluppatori
- il tempo loro concesso per completare l’opera.
Se anche solo uno di questi due fattori viene meno, allora il prodotto finale sarà colmo di problemi.
Un caso del genere è quello legato al porting di Doom da ambiente DOS alla piattaforma 3DO. Per incontrare la data di rilascio fissata a dicembre 1996, all’unica sviluppatrice disponibile sul progetto, Rebecca Heineman, vennero concesse solo dieci settimane per completarlo. Sfruttando le sue abilità di programmatrice ed esperta di reverse engineering, Heineman riuscì a ottenere una versione funzionante e completa di Doom per 3DO, ma priva dell’ottimizzazione necessaria per girare bene. Il prodotto finale fu un flop così disastroso, che costò a The 3DO Company la bancarotta.
Come funziona il reverse engineering?
Dalla descrizione effettuata nel pragrafo precedente, si può giustamente credere che esista un processo univoco per realizzare il reverse engineering di un software. Sfortunatamente non è così, in quanto esistono tre differenti processi. Trattasi di:
- Recupero/ricostruzione del codice sorgente originale;
- Comprensione delle regole di un protocollo di comunicazione;
- Creazione di un modello;
Osserviamoli nel dettaglio uno per volta.
Recupero/ricostruzione del codice sorgente
Il codice sorgente rappresenta il cuore stesso di un software. Il computer lo elabora e lo traduce da un linguaggio di alto livello comprensibile all’uomo (C, C++, Java, Python, Lua), ad uno di basso livello (Assembly), convertendolo infine in stringhe binarie eseguibili direttamente dal processore.
Nel caso in cui si è sprovvisti del codice sorgente originale, la traduzione deve essere necessariamente invertita.
Facendo ricorso ad un decompilatore, gli sviluppatori sono in grado di ottenere un codice scritto in linguaggio ad alto livello, partendo direttamente dalle stringhe binarie. C’è da dire che non sempre è possibile ottenere per intero il codice sorgente con questo metodo, per cui si fa ricorso ad un disassemblatore. Questo software si occupa di convertire le stringhe binarie in linguaggio di basso livello Assembly, che viene successivamente analizzato manualmente dagli sviluppatori.
Tuttavia, non sempre è possibile ricostruire per intero il codice sorgente, per via di istruzioni decompilate in maniera erronea o per stringhe binarie che mandano in eccezione il disassemblatore. In realtà, questa non è una criticità come si possa pensare, in quanto lo scopo finale del processo di reverse engineering è la comprensione del funzionamento di un software.
Comprensione delle regole di un protocollo di comunicazione
Questo caso possiede una doppia anima: una etica e una non etica. Nel primo caso, il reverse engineering viene impiegato per la scrittura di driver per sistemi operativi di cui non esistono documentazioni complete. Lo strumento impiegato allo scopo è lo sniffer, un software che analizza il traffico di dati presente in una rete. Grazie ad esso gli sviluppatori accedono alle regole di un protocollo di comunicazione, potendo anche rilevare eventuali anomalie nello scambio di dati tra due dispositivi. In tal modo è possibile ricostruire il funzionamento del protocollo di comunicazione e scrivere di conseguenza un driver di rete per lo stesso.
Tra gli sniffer maggiormente impiegati per il reverse engineering e usi legittimi, troviamo:
- Ethereal;
- Wireshark;
- CloudShark;
Nel secondo caso, lo sniffer può essere usato dagli attori malevoli per catturare i pacchetti di rete scambiati su una rete e analizzarli a fondo.
In tal modo, questi possono sfruttare il risultato delle analisi per comprendere il funzionamento di una rete, individuarne le vulnerabilità e sfruttarle a loro vantaggio per insinuarsi al suo interno. Per questi casi, gli attori malevoli tendono a fare molto leva su sniffer come:
- Sniffit;
- BUTTSniffer;
- Ettercap;
Creazione di un modello software
Più che di reverse engineering, in questo specifico caso si parla prevalentemente di reengineering. Questo perché il codice sorgente di un software precedentemente ricostruito, viene modificato e trasferito in un modello per ulteriori elaborazioni e analisi. Il modello risultante è grafico e viene realizzato con il linguaggio di modellazione UML (Unified Modeling Language). Ciò permette agli sviluppatori di integrare ulteriori elementi, o di creare nuovi progetti in maniera agevole, partendo proprio dalle porzioni già esistenti di quello esaminato. In più è possibile anche scrivere una documentazione specifica in merito.
Applicazioni del reverse engineering
In base a quanto discusso, si evince che il reverse engineering gode di una notevole versatilità, ma che al tempo stesso è un’arma a doppio taglio.
Questo perché può essere impiegato sia in modo legittimo, che illegittimo. Non sono infatti rari i casi di attori malevoli che impiegano la tecnica per l’analisi di un software e scoprirne i punti critici da sfruttare. Dall’altra parte, gli esperti di cybersecurity sfruttano il reverse engineering per irrobustire la sicurezza alla base di un software considerato vulnerabile.
Tra le applicazioni legittime del reverse engineering più diffuse oggigiorno, si citano:
- Analisi e manutenzione di un software proprietario, con conseguente ulteriore sviluppo;
- Analisi dei protocolli di comunicazione impiegati all’interno di una rete;
- Analisi di software malevolo come trojan, worm, malware e ransomware, al fine di sviluppare contromisure efficaci;
- Recupero e aggiornamento di software abandonware;
- Scoperta e correzione di eventuali bug presenti in un software;
- Esame di formati di file non standardizzati per comprenderne il funzionamento;
- Portabilità di un software da una piattaforma ad un altra ed eventuale miglioramento della compatibilità;
- Realizzazione di documentazioni software;
Il reverse engineering è una tecnica che può fornire agli sviluppatori informazioni molto importanti circa il funzionamento e la logica alla base di un software. Nel momento in cui si è ottenuto un modello, è possibile intervenire direttamente sullo stesso per migliorarlo o per renderlo compatibile con un’altra piattaforma.
Tuttavia, è bene ricordare ancora una volta che anche questa tecnica presenta un secondo volto, rappresentato dall’applicazione in ambito malevolo. La violazione di proprietà intellettuale, la creazione di software dannoso e la scoperta di vulnerabilità per condurre attacchi, sono solo alcune delle conseguenze che derivano dalla sua applicazione illegittima. Pertanto, è essenziale sottolineare come l’uso del reverse engineering debba essere regolamentato, al fine di bilanciare l’innovazione tecnologica e la protezione del diritto d’autore.