Progettare un Decompilatore - Introduzione

 


Introduzione

La decompilazione è una forma di ingenieria inversa (reverse engineering) di programmi per computer. Il suo scopo è di convertire un file binario compilato in un file sorgente. Si può voler far questo per varie ragioni, come per esempio per capire come funziona un programma, o per cercare di modificare un programma per migliorarlo o per fissare dei bachi.

La decompilazione è stata disponibile per molti anni, probabilmente sin dal tempo in cui gli ingenieri hanno incominciato a compilare programmi da linguaggi di alto livello in formati a più basso livello, come il linguaggio assembler o codice macchina.

Vari tentativi sono stati fatti per creare decompilatori di file eseguibili binari. Quest pagina ha alcuni esempi.

Ci sono anche molti più compilatori disponibili per ambienti "managed", ovvero che usano byte-code, come Java e C#. Una lista esaustiva è disponibile alla Program Transformation Wiki.

In queste pagine ci focalizzeremo sulla decompilazione di binari eseguibili, ovvero da codice macchina a codice sorgente, poichè questo è molto più difficile che decompilare byte-code Java o C#.

Vari linguaggi e compilatori possono produrre codice macchina, compresi alcuni compilatori Java, C# e Visual Basic. Perciò il decompilatore dovrà sapere quale linguaggio è stato usato per compilare il programma, e dovrà avere il supporto per generare il corrispondente linguaggio. Ad ogni modo, i problemi più difficili nella decompilazione sorgono quando si usano linguaggi meno restrittivi, come C, Pascal e C++.

Molti degli algoritmi possono essere usati per tutti i linguaggi, perciò gli esempi presentati saranno principalmente scritti in linguaggio C. Quando mostreremo un algoritmo, useremo il C o il C++, poichè questi sono i linguaggi più disponibili sia su Linux che su Windows e Mac OS.

Indipendentemente dal linguaggio desiderato, un decompilatore deve principalmente trattare 3 tipi di entità:

  • Oggetti codice (funzioni, statements)
  • Oggetti dati (variabili globali e locali)
  • Tipi di dati (tipi delle variabili, prototipi delle funzioni).

Il problema ricorrente di un decompilatore è di cercare di identificare una o più di queste entità in una sequenza di byte presente in un file binario. Per far questo, è utile sapere come gli strumenti di sviluppo (ma che potremmo anche chiamare "strumenti di ingenieria diretta", cioè l'opposto dell'ingenieria inversa) sono usati per scrivere un programma, poichè questo è il processo che cercheremo di invertire.


Avanti: Strumenti di sviluppo

 
Traduzioni

  Albanese
di Radka Maric

  Estone
di Adrian Pantilimonu

  Francese
di Natalie Harmann

  Inglese

  Macedone
di Katerina Nestiv

  Portoghese per
www.homeyou.com/~edu/

  Russo
di Sandi Wolfe

  Ucraino
di Anna Matesh