Newsgroup: it.comp.lang.c
Titolo: FAQ 12 - E' possibile ottenere il sorgente dal codice macchina ?

Io direi:
con un disassemblatore si ottiene il listato assembler(!) , col "reverse
engineering" si può tentare una ricostruzione del codice sorgente originale
ma a causa delle ottimizzazioni del compilatore e del fatto che le variabili
hanno un nome tipo v1,v2,v3.... è quasi meglio usare l'assembler!
domanda:
- si può fare sempre?
risposte articolate con motivazioni e integrazioni sono ben gradite! ;-)
--
Marco Coppo - University Of Sheffield
Flat 12 Room 6 - Broad Lane Court
160 Broad Lane - Sheffield S1 4BU
South Yorkshire - UK

 - si può fare sempre?
Io direi di si.
Sempre che l'architettura in oggetto non abbia cose strane, alla fine tutte
le istruzioni devono passare dalla CPU per essere eseguite, e questo
comporta che devono essere caricate in RAM e pertanto da qualche parte
devono anche essere disponibili per essere lette e tradotte.
Il che vuole dire che tutti i programmi possono essere disassemblati, con
più o meno facilità.
Una volta che si ha l'assembler, risalire al C può essere difficile.
Sicuramente se si lasciano perdere velleità riguardo gli standard, è
senz'altro possibile avere tutto codice ASM inline :-)
Più verosimilmente, un de-compilatore potrebbe riconoscere le funzioni di
libreria di un compilatore (e quindi un de-compilatore "mirato"), e almeno
quelle ripristinarle con i nomi giusti, dato che per quel che ne so non sono
soggette ad ottimizzazioni durante il linkaggio.
Per quanto riguarda tutto il resto, è senz'altro possibile ricostruire gran
parte del programma, accettando il fatto che alcune ottimizzazioni
renderebbero il codice molto diverso da quello scritto in origine.
Per i nomi delle variabili e funzioni, se non sono inclusi da qualche parte,
si avranno per forza nomi del tipo:
V1, V1...
F1, F2...
E bisognerà riadattarli a mano.
Altro punto di debolezza: alcuni compilatori ottimizzano le chiamate a
funzione! Nessuno può ricostruire una funzione in-lined, e neppure le macro
(forse quelle della libreria, ma dubito), e anche per il passaggio dei
parametri potrebbero esserci delle sorprese.
In definitiva, è sempre possibile de-compilare un programma, ma il codice
ottenuto sarà probabilmente una schifezza, e quasi quasi sarà meglio
leggersi l'assembler.
In casi rari (nessuna ottimizzazione, nomi inclusi, ecc), sarà però
possibile riottenere il codice sorgente originale o uno molto simile.
In nessun caso, però, è detto che ricompilando otterrò lo stesso eseguibile.
Ovvero, potrebbe essere vero se uso lo stesso compilatore, se ho
effettivamente ottenuto il sorgente originale, commenti a parte mi ero
dimenticato di dire, e se uso gli stessi identici parametri di compilazione.
(suppongo anche: stessa piattaforma)
--
Alessandro Monti

leggersi l'assembler.
Se si subordina il giudizio di "decompilabilita'" all'utilita' del
codice "pseudo-sorgente" ottenuto (e per cos'altro senno' ?), si ha
sicuramente un risultato assolutamente insoddisfacente. Tanto
insoddisfacente da giudicare la decompilabilita' di un programma
impossibile.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------

 impossibile.
Sono punti di vista. Comunque tentare non costa niente, e chissà che in
futuro dei decompilatori non riescano ad ottenere dei risultati decenti.
--
Alessandro Monti

futuro dei decompilatori non riescano ad ottenere dei risultati decenti.
Forse con l'introduzione dell'IA ci possono riuscire...
