Decompilatori: approccio per principianti
Questo corso raccoglie una serie di appunti che ho collezionato durante lo studio dello sviluppo di decompilatori. Include alcuni appunti anche sul formato dei file binari come PE ed ELF.
Lo studio dello sviluppo dei decompilatori fa parte delle discipline informatiche che riguardano il linguaggio e la struttura di esso all’interno di un moderno calcolatore. Esistono diverse risorse, come il dragon book, per i compilatori: la letteratura è piena di libri, articoli e paper accademici, ma poco si sa in realtà dei decompilatori. Ci chiediamo: è possibile utilizzare le stesse tecniche viste per la compilazione ed invertirle per ottenere il codice sorgente? In questa serie di appunti che ho trascritto, scopriremo che sapremo qualche volta ottenere il codice sorgente, altre volte no.
Questi appunti sono stati ispirati dal corso princìpe in materia di progettazione del decompiler (Decompiler Design) di Giampiero Caprino. Voglio personalmente ringraziarlo per aver scritto e creato quelle pagine. Parte del corso segue la stessa struttura utilizzata dall’autore del corso originale, ma è più aggiornata e affronta alcune tematiche più elementari per rendere la lettura piacevole. Il contenuto è anche preso da una serie di paper citati all’interno della sezione Letteratura che vi invito a leggere.
Sono richieste da parte del lettore conoscenze in ambito low-level, come la scrittura di codice assembly e la relativa comprensione, insieme ad alcune conoscenze di teoria dei Linguaggi (come il concetto di compilazione, interprete, esecuzione di un programma). Re-introdurremo alcuni concetti di programmazione dove necessario.
Indice
- Capitolo 1: Introduzione alla decompilazione
- Capitolo 2: L’ambiente di compilazione
- Capitolo 3: Strumenti di reverse engineering
- Capitolo 4: Un semplice e intuitivo decompilatore
- Capitolo 5: I problemi della decompilazione
- Capitolo 6: Architettura standard di un decompilatore
- Capitolo 7: Formati file eseguibili
- Capitolo 8: Identificare le istruzioni e i dati
- Capitolo 9: Riconoscere i blocchi elementari
- Capitolo 10: Grafico del controllo di flusso
- Capitolo 11: Analisi del flusso
- Capitolo 12: Creazione di dichiarazioni
- Capitolo 13: Analisi del flusso dei dati
- Capitolo 14: Propagazione delle espressioni
- Capitolo 15: I dati sullo stack
- Capitolo 16: Funzioni con stack frame
- Capitolo 17: Funzioni senza frame
- Capitolo 18: Registri salvati
- Capitolo 19: Recuperare i tipi
- Capitolo 20: Decompilare istruzioni switch
- Capitolo 21: Codice vs dati: un altro tentativo
Extra
- Appendice A: Letteratura Aggiuntiva
- Appendice B: Decompilatori disponibili
Attualmente il corso presenta più di 15.000 parole. Vuoi saperne di più su quello che faccio? Hai trovato un errore sul testo? Contattami via e-mail.