Non è poi difficilissimo... basta seguire il corso dell'esecuzione, tenere traccia del contenuto dello stack, e tutto torna... certo, con un po' di lavoro...Originariamente inviato da Xaratroom
Mai due variabili in un'istruzione assembly, quindi:
a = b
mov <registro>,b
mov a,<registro>
ma non puoi usare un registro a caso perchè potrebbe già essere usato
quindi l'istruzione potrebbe essere arriccchita da una push e una pop
Se il disassemblatore è come si deve (e ti assicuro che se ne trovano, basta scavare), è in grado di individuare variabili globali e addirittura locali delle procedure. E certe volte anche i valori restituiti.E, se tradurre da assembly a c un'istruzione così semplice può essere un po' elaborato
(perchè non è così semplice far capire al pc cosa deve fare in un caso simile) immagina un'istruzione come assegnare ad una variabile un'espressione...
...poi basta ricordare tutte le regole di scope e lifetime che hanno le variabili, cosa che in assembly non esiste, o "gli innumerevoli" tipi di dato
Le espressioni, invece, danno qualche problemino in più, anche perchè le istruzioni possono cambiare anche di molto se si trattano numeri interi o floating-point. Ma anche qui basta lavorarci.
In realtà i disassemblatori buoni sono in grado, ad esempio, di ricostruire i riferimenti incrociati, e quindi di capire quali istruzioni sono destinazione di quali salti. E quindi sono in grado di creare etichette, seppur spartane, invece di indirizzi, tipoinoltre non vi sono nomi o etichette di salto in un decompilato, ma i relativi "indirizzi"(se così li possiamo chiamare), quindi si deve specificare un nome, se non appropriato, almeno leggibile dal programmatore (trovare in un codice variabili con nomi del tipo: a,b,c,d,e...,a1,a2,a3,a4)
Naturalmente non è impossibile ma "è improbabile"....
Così come per le variabili, ti vengono fuori nomi tipo arg_0, var_2...codice:(istruzioni...) loc_10003000FF: (istruzioni...) JMP loc_10003001A0 (istruzioni...) Jxx loc_10003000FF loc_10003001A0: (istruzioni...)
Il che, pur limitatamente, aiuta un bel po'.