1. Introduzione alla decompilazione

Che cosa è la decompilazione?

La decompilazione è una forma di reverse engineering dei programmi informatici. Il suo scopo è quello di convertire un file binario compilato in un file sorgente. La decompilazione può essere effettuata per diversi motivi, ad esempio per capire come funziona un programma o per cercare di modificarlo per migliorarlo o risolvere un bug.

L’importanza della decompilazione è stata sottostimata durante la carriera del programmatore “medio”. Tuttavia penso che chiunque voglia programmare in maniera più creativa dovrebbe attingere anche dal codice decompilato. Una persona stimata mi ha detto che i decompilatori sono come i moderni browser del web: esplori i programmi e l’interfaccia che loro mettono a disposizione. Mi piace particolarmente questa visione della decompilazione e spero di trasmettere lo stesso messaggio anche ai lettori.

La decompilazione esiste da molti anni, parliamo di uno sviluppo iniziale che partì dal 1960; probabilmente da quando si è iniziato a compilare programmi da linguaggi di alto livello a formati di livello inferiore come l’assembly e il codice macchina.

Sono stati fatti diversi tentativi di scrivere decompilatori binari eseguibili. Nella pagina relativa ai “decompilatori binari disponibili” sono riportati alcuni esempi di decompilatori attualmente disponibili. Esistono ancora più decompilatori per ambienti interpretati che utilizzano il bytecode, come Java e C#. Esistono altri decompilatori, ai limiti dei moderni compilatori, che permettono di trasformare il codice tramite una rappresentazione intermedia.

In queste pagine ci concentreremo sulla decompilazione di eseguibili binari, o dal codice macchina al codice sorgente, poiché questa operazione risulta molto più difficile che decompilare il codice byte di Java o C#.

Diversi linguaggi e compilatori possono produrre codice macchina, compresi alcuni compilatori Java, C# e Visual Basic (vedremo in seguito meglio la differenza tra codice interpretato e codice compilato). Pertanto, il decompilatore dovrà sapere quale linguaggio è stato usato per compilare il programma e dovrà avere il supporto per generare tale linguaggio. Tuttavia, la maggior parte dei problemi di decompilazione si presenta quando si utilizzano linguaggi meno restrittivi, ovvero C, Pascal o C++.

La maggior parte degli algoritmi può essere utilizzata per tutti i linguaggi, quindi utilizzeremo per lo più esempi scritti in C. Quando mostreremo un algoritmo, utilizzeremo C o C++, poiché sono i linguaggi più diffusi con cui un’analista deve relazionarsi.

Indipendentemente dal linguaggio di destinazione, possiamo dire che un decompilatore tratta principalmente 3 tipi di entità:

  • Oggetti di codice (funzioni, istruzioni) anche chiamati code objects
  • Oggetti dati (variabili globali e locali) anche chiamati data objects
  • Tipi (tipi di variabili, prototipi di funzioni) anche chiamati types.

Il problema costante di un decompilatore è cercare di dedurre una o più delle tre entità di cui sopra da una sequenza di byte presenti nel file binario. Come vedremo in seguito, dedurre queste informazioni è abbastanza complesso dal momento che non si riescono a ricostruire le informazioni perse durante la compilazione. È possibile tuttavia costruire alcune euristiche per cercare di recuperare parzialmente il tipo di informazioni. Queste euristiche costituiscono i princìpi su cui ci baseremo per costruire il nostro decompilatore didattico.

Per avere una panoramica più globale e cercare di capire perché è un problema difficile, è utile sapere come vengono utilizzati gli strumenti di sviluppo durante la scrittura di un programma, poiché è questo il processo che stiamo cercando di invertire.

Biografia

Sono uno specialista in materia di sicurezza informatica, scrittore, contributore per il progetto Monero, una criptovaluta che è focalizzata nel proteggere le informazioni sulle transazioni. Il libro che ho pubblicato Mastering Monero è diventato una delle migliori risorse per padroneggiare Monero. Più informazioni su di me

Seguimi su Twitter o scrivimi una e-mail. Le donazioni sono molto apprezzate, mi permettono di continuare a lavorare e a scrivere.

Mastering Monero Book