Newsgroup: it.comp.programmare
Titolo: Decompilazione

Salve,
senza entrare troppo nei dettagli tecnici, vorrei sapere se � tecnicamente 
sempre possibile ricavare un sorgente partendo dall'eseguibile.
Ovvero, se ad esempio l'eseguibile fa uso di funzioni definite in librerie 
esterne, � possibile far in modo che nel sorgente prodotto appaia il nome 
della funzione invocata e la libreria dove � contenuta?
Esaminando un eseguibile con un editor esadecimale, ci si trovano tutte le 
informazioni che servono?
E per interpretare correttamente le stringhe esadecimali, bisogna sapere ad 
esempio l'architettura del sistema operativo per il quale l'eseguibile � 
stato realizzato?
Mi pare ci siano in corso progetti mirati allo sviluppo di decompilatori 
simili, ma ho l'impressione che durante la compilazione si perdano troppe 
informazioni e il decompilatore sarebbe costretto a ricostruire un sorgente 
che probabilmente non rispecchia l'originale, ma al massimo potrebbe solo 
essere equivalente. 

 essere equivalente.
Questo accade da sempre e a meno di non includere il sorgente nel
compilato, usando la modalita' di debug del compilatore, non c'e'
soluzione.

 potrebbe solo essere equivalente.
Sicuramente "decompilare" non consente di recuperare lo stesso tipo di 
conoscenza che si avrebbe disponendo del sorgente originale, per quanto 
questo possa essere mal scritto.
Possono essere tool utili per reverse engineering (consentito entro 
certi limiti) o per analizzare il codice di worm, virus etc. senza dover 
analizzare il codice assembler.
-- 
Valter Minute
(the reply address of this message is invalid)
(l'indirizzo di reply di questo messaggio non � valido)

 soluzione.
Ma attualmente il massimo che si � ottenuto qual �?
Per caso � un tipo di progetto che desta poco interesse o � troppo complesso 
e molti rinunciano? 

 analizzare il codice assembler.
Sfrutto quanto dici per agganciarmi ad una discussione che forse non � 
proprio OT rispetto al thread: l'euristica degli antivirus.
Sarebbe possibile svilupparne una che praticamente annulli la necessit� di 
fare riferimento ad un database?
Chiaramente l'antivirus in questione non dovrebbe bloccare tutto, ma se non 
altro informare del comportamento e lasciare all'utente la scelta (ad 
esempio viene rilevato un keylogger, l'utente valuta se il programma in 
questione � un programma per la teleassistenza o se lo stanno spiando a sua 
insaputa).
 

 a sua insaputa).
Credo che questo tipo di implementazione avrebbe vita breve. Pensa a un 
software che ti chiede conferma ogni volta che attivi una connessione 
TCP (potrebbe essere il metodo di propagazione!), ogni volta che viene 
scritto un file (ci potrebbe essere un exploit nel parsing del formato 
dati!) etc.
Inoltre esistono tante tecniche diverse per fare la stessa cosa. Il 
keylogger pu� installare un hook di sistema o hooks in ogni applicazione 
(o magari solo in quella che gli interessa!), rimpiazzare il driver di 
tastiera etc.
Per certe tecniche il sistema pu� fornire un certo livello di protezione 
(impedendo l'esecuzione di codice non caricato dal suo loader, ad 
esempio, o la modifica di segmenti codice, l'esecuzione di codice sullo 
stack etc.), ma, per quanto possa essere sofisticata la logica, 
difficilmente sar� pi� furba degli umani che scrivono quel genere di 
software.
Inoltre aggiornare un db di "firme" (e trovare la firma) � relativamente 
banale. Trovare il modo di intercettare un nuovo meccanismo di infezione 
decisamente meno. E rischi che prima di aver aggiornato il tuo 
fantastico motore euristico il virus si sia pappato met� dei PC del globo :)


 complesso e molti rinunciano?
Ma a me pare piuttosto che sia un problema di poca utilita' pratica: se 
hai i sorgenti di un programma, hai i sorgenti.
Se non li hai, probabilmente non li devi avere.
Se il programmatore vuole distribuire i sorgenti, li rilascia assieme al 
programma.
Se non vuole, non li rilascia.

 a sua insaputa).
Aspetta: questi problemi si affrontano in modo diverso da quello che 
stai cercando di percorrere.
Un keylogger, tanto per seguire l'esempio che hai citato, e' un processo 
indipendente, che puoi identificare nella process list, ed inoltre va ad 
annidarsi a basso livello per intercettare i tasti che vengono premuti, 
quindi per identificarlo e' possibile andare a vedere se la gestione a 
basso livello della tastiera e' stata cambiata da un processo man in the 
middle.
Per quanto riguarda la comunicazione verso l'esterno, niente di piu' 
facile: basta mettersi a sniffare la rete e analizzare i pacchetti che 
il programma manda e soprattutto dove li manda.
Se il programma di teleassistenza, invece di limitarsi a dialogare col 
suo server, si mette a chiamare l'indirizzo 
hackers.ru
 non occorre tutta 
questa sapienza di informatica per capire che c'e' qualcosa che non va...

 Se non vuole, non li rilascia.
Dimentichi il caso pi� ovvio: il programmatore non li rilascia e io non li 
dovrei avere, per� li voglio eheh.
Potrebbe essere utile ad esempio per fare il porting su Linux di programmi 
closed source disponibili sono per Windows, o magari di driver.
O addirittura di videogiochi, ma mi sa che forse la cosa diventa meno 
fattibile. 

 questa sapienza di informatica per capire che c'e' qualcosa che non va...
Pu� anche dialogare con 
assistenza.it
 e farlo ugualmente a tua insaputa (nel 
senso che non sai che c'� un programma che ti spia). 

Non pretendo tanto, va bene anche un codice equivalente.
'Equivalente' che vuol dire?
Devi considerare che la stragrande maggioranza del software, oggi, �
object-oriented, ma classi ed oggetti sono ancora astrazioni valide
solo in fase di compilazione. Decompilando perderesti tutta la
struttura originaria e avresti davanti solo un gran casino. Insomma,
sarebbe come avere, di uno shuttle, tutti i pezzi della dimensione di
1 centimetro quadrato e volessi ricostruirlo senza istruzioni :)

 dovrei avere, per� li voglio eheh.
Dubito che in questo caso tu saresti disposto a pagare per un decompilatore
:-)
In altre parole chi investe tempo a scrivere un decompilatore che poi sar�
utilizzato da chi non vuol pagare codice/software in modo legale?
Enrico

 utilizzato da chi non vuol pagare codice/software in modo legale?
Un sostenitore del software libero.
Potrebbe essere un progetto GNU. 

 senso che non sai che c'è un programma che ti spia).
Un programma che mi spia, finche' non manda le informazioni
all'esterno non ha fatto niente.
E per mandare informazioni all'esterno deve comunicare con la rete.
E se io controllo il traffico di rete vedo se c'e' un programma che
cerca di dialogare con l'esterno.
Se il tuo programma di assistenza dialoga solo con 
assistenza.it
, e tu
sostieni che spia, allora sono quello di 
assistenza.it
 che spiano, non
un hacker russo che ti ha messo un trojan.

 fattibile.
Hai provato con dosbox e wine?

 1 centimetro quadrato e volessi ricostruirlo senza istruzioni :)
Esatto, mi chiedevo proprio quali fossero le informazioni mantenute, ma dato 
che il codice comprensibile alla cpu � estremamente pi� scarno di quello 
usato dal programmatore, la perdita di informazioni sul design � eccessiva.
E se il decompilatore fosse in grado di "comprenderne" il funzionamento e di 
ricostruirne una struttura?
"Capire" che quelle n funzioni sono correlate e che quindi potrebbero far 
parte della stessa classe?
E che quella classe potrebbe derivare da quelle n classi?
Mi sa che saremmo di fronte ad un caso di intelligenza artificiale 
cosiddetta forte :-) 

 Hai provato con dosbox e wine?
Per gioco non intendevo il solitario di windows, ma qualcosa di 
"leggermente" pi� complesso. 

 un hacker russo che ti ha messo un trojan.
Ma se il nome del server non � cosi chiaro da far capire se � sicuro o no?
Comunque in effetti il punto � che i casi sono troppi e gli algoritmi per 
quanto "intelligenti", sempre limitati. 

 potrebbe solo essere equivalente.
C'� IDA, interactive disassembler, di Ytzak Guilfanov. Fino alla 
versione 3 era freeware, ora � alla 5.qualcosa e si paga. Fa "quasi" 
quello che dici tu, ma ottieni solo listati in assembler.
E' molto utile per capire come un programma fa una cosa, ma usare i 
listati assembler che crea come sorgente da sviluppare... BRRRRRR!
Meglio non pensarci :-)
Fra parentesi, per ottenere da IDA dei listati completi devi sbrogliarti 
da solo parecchie situazioni dubbie che il programma ti lascia aperte, 
come zone di memoria che potrebbero contenere codice oppure no, 
variabili che potrebbero o no essere preinizializzate, jumptables, 
chiamate di funzione. Devi dare tu i nomi alle funzioni e alle 
variabili. Alla fine se � un programma molto grosso fai prima a 
riscrivertelo da solo :-)

 "leggermente" più complesso.
Qualcosa tipo Heroes of Might & Magic III che necessita di DirectX 9c
per esempio? Ci gira!

 per esempio? Ci gira!
Qualcosa con qualche poligono in pi�...
http://www.youtube.com/watch?v=coDmu6jcCow
 


Per quella roba li' ci vuole una scheda grafica AGP ben carrozzata, a 
prescindere dal sistema operativo!

 prescindere dal sistema operativo!
Ce l'ho e infatti funziona, ma ovviamente solo su Windows 

 prescindere dal sistema operativo!
AGP?
Si dev'essere rotto il newsgroup, manda i messaggi di 8 anni fa  :^)


Se lo dici cos� sembra che poi software liber e GNU = ladri...
il software libero � un bel movimento, per� non "deve" essere portato 
avanti a spese di chi, lavorando, con il software ci vive.
Ergo: io realizzo l'applicazione X, lavoro 1 anno.. poi la devo vendere..
Perch� deve arrivare qualcuno e ... decompilando il programma "copiarlo" 
e distribuirlo gratis ?
Invece io credo che il software libero debba funzionare in altro modo.. 
e cio� io e altri 1000 volontari programmiamo una funzione di quel 
progetto, totale per ciascuno: 2 giorni ...
a quel punto la cosa ha senso..
ma decompilare per ... ridistribuire gratis � al limite della legalit�..
IMHO
(te lo dice uno che da poco � passato a Linux e ancora si domanda come 
faccia ad esser tutto gratuito (non che mi piaccia pagare..per�...))


Meglio 2 xbox 360 in parallelo ;)

 faccia ad esser tutto gratuito (non che mi piaccia pagare..per�...))
riuscire a creare dei driver per delle periferiche closed presuppone un
minimo di "fantasia"
ma entriamo in un zona esposta a flame a cui non voglio aderire
-- 
Saper dimenticare � un arte difficile, a me riesce naturale, rendendomi
un uomo fortunato che vive sempre nel futuro.

cosiddetta forte :-) 
Chiamiamola pure "fantasia sfrenata" :)

 Chiamiamola pure "fantasia sfrenata" :)
Quell'intelligenza artificiale forte era un eufemismo per dire follia :-D