Dall'hex allo sketch!

Salve a tutti!!

Dopo una recente perdita di dati a causa della dipartita dell'hard disk del mio computer, ho perso irrimediabilmente alcuni sketch. Per fortuna ho ancora un Arduino contenente il codice di uno di questi sketch e mi chiedevo se fosse possibile "riesumarlo".

Ho letto da qualche parte che dall'ATmega è possibile estrarre l'hex che poi è possibile convertire a sua volta in assembly il che, se ho capito bene, è il linguaggio a basso livello.

Non c'è modo per riportare il codice allo stato di sketch oppure a qualche cosa di comprensibile?

Grazie mille!!

NO, purtroppo l'unica cosa che puoi fare è estrarre il codice macchina e ... sperare di riuscire ad ottenere un disassemblato ... considerando che, ad incasinare il tutto, c'è di mezzo anche l'ottimizzazione che può aver fatto sul codice il compilatore.

Direi che ... NON è una strada percorribile ... mi spiace ... :~

Guglielmo

GianfrancoPa:
Salve a tutti!!

Dopo una recente perdita di dati a causa della dipartita dell'hard disk del mio computer, ho perso irrimediabilmente alcuni sketch. Per fortuna ho ancora un Arduino contenente il codice di uno di questi sketch e mi chiedevo se fosse possibile "riesumarlo".

Attiva un account dropbox e sincronizza la cartella contenente i tuoi sketch, a pro futuro :wink:

Ho letto da qualche parte che dall'ATmega è possibile estrarre l'hex che poi è possibile convertire a sua volta in assembly il che, se ho capito bene, è il linguaggio a basso livello.

Corretto.

Non c'è modo per riportare il codice allo stato di sketch oppure a qualche cosa di comprensibile?

Come ti ha detto Guglielmo.... no! :roll_eyes: =(
Purtroppo il tuo sketch arduinico è perso per sempre. Se il programma era importante, non ti resta che estrarre appunto il firmware e da quello, con un disassemblatore, recuperare almeno il programma assembly. Ma se non conosci quel linguaggio, te ne farai ben poco. :cold_sweat:

Grazie mille per la celere risposta e per i preziosi consigli!

Purtroppo niente assembly... :frowning:

Viva Dropbox!! :smiley:

Se volessi dare un'occhiata al file HEX relativo ad un mio programma, dove lo trovo?
Dovrei per forza estrarlo dopo la scrittura o lo posso avere in locale?

per sicurezza io i miei sketch importanti e di lavoro li copio tutti sul google drive e su chiavette usb... meglio "ridondare" quam deficere :smiley:

paulus1969:
Se volessi dare un'occhiata al file HEX relativo ad un mio programma, dove lo trovo?
Dovrei per forza estrarlo dopo la scrittura o lo posso avere in locale?

Ce l'hai anche in locale.
A seconda del SO, l'IDE crea una cartella temporanea in cui mette tutto quello che riguarda lo sketch, dalle lib ai file oggetto e per finire anche l'hex finale.
Per sapere dove hai questo file, dalle preferenze dell'IDE attiva la compilazione verbosa e poi compila, nei messaggi iniziali che vedrai sul terminale dell'IDE c'è anche il percorso di questo file.

Questo file contiene lo stesso codice che si recupera dall'ATmega?

killrob:
per sicurezza io i miei sketch importanti e di lavoro li copio tutti sul google drive e su chiavette usb... meglio "ridondare" quam deficere :smiley:

Anch'io, ho un utente su Dropbox apposta, poi ho la Timemachine del Mac che mi fa i backup in automatico. Ed infine ho un HD esterno come cloud domestico su cui riverso periodicamente un archivio della cartella :wink:

GianfrancoPa:
Questo file contiene lo stesso codice che si recupera dall'ATmega?

Se le versioni corrispondono, sì. E' identico.
Difatti puoi disassemblare anche l'hex generato dall'IDE.

leo72:
Ce l'hai anche in locale.
...

Grazie. Provo...

EDIT
Trovato!!!!
Credo sia il file denominato nomeprogramma.cpp.hex

Sto provando a disassemblare uno sketch usando il programma avr-objdump.exe, ma da quel che ho capito richiede il file .elf e non il .hex. Se dall'ATmega recupero l'hex, cosa mi serve disassemblare l'elf?

Cosa posso fare per disassemblare l'hex?

Probabilmente perché il tool che hai usato tu supporta solo .elf.
Tempo fa su Linux usai vavrdisasm, che supporta anche i file .hex
Non so su Windows cosa potresti usare.... :~

EDIT:
qui ci sono i sorgenti:

Non so se riesci a compilarlo anche su Windows

Googlando ho letto che invece dovrebbe poterlo fare. Prova con qualcosa di simile, adattandolo al tuo caso:

avr-objdump -j .sec1 -d -m avr5 foo.hex

Uhm, mi sa proprio che non sono in grado... in ogni caso, se dal file hel estraggo quanto segue (piccola porzione)

     4fe:	71 e0       	ldi	r23, 0x01	; 1
     500:	0e 94 e6 25 	call	0x4bcc	; 0x4bcc <_ZNK6String6equalsEPKc>
     504:	88 23       	and	r24, r24
     506:	09 f1       	breq	.+66     	; 0x54a <_Z10ReadSerialv+0xf8>
     508:	8d e3       	ldi	r24, 0x3D	; 61
     50a:	96 e0       	ldi	r25, 0x06	; 6
     50c:	62 e0       	ldi	r22, 0x02	; 2
     50e:	70 e0       	ldi	r23, 0x00	; 0
     510:	40 e0       	ldi	r20, 0x00	; 0
     512:	0e 94 64 1c 	call	0x38c8	; 0x38c8 <_ZN11EEPROMClass5writeEih>
     516:	8d e3       	ldi	r24, 0x3D	; 61
     518:	96 e0       	ldi	r25, 0x06	; 6
     51a:	63 e0       	ldi	r22, 0x03	; 3
     51c:	70 e0       	ldi	r23, 0x00	; 0
     51e:	40 e0       	ldi	r20, 0x00	; 0
     520:	0e 94 64 1c 	call	0x38c8	; 0x38c8 <_ZN11EEPROMClass5writeEih>
     524:	8d e3       	ldi	r24, 0x3D	; 61
     526:	96 e0       	ldi	r25, 0x06	; 6
     528:	64 e0       	ldi	r22, 0x04	; 4
     52a:	70 e0       	ldi	r23, 0x00	; 0
     52c:	40 e0       	ldi	r20, 0x00	; 0
     52e:	0e 94 64 1c 	call	0x38c8	; 0x38c8 <_ZN11EEPROMClass5writeEih>
     532:	84 ee       	ldi	r24, 0xE4	; 228
     534:	94 e0       	ldi	r25, 0x04	; 4
     536:	6c e2       	ldi	r22, 0x2C	; 44
     538:	71 e0       	ldi	r23, 0x01	; 1
     53a:	0e 94 55 25 	call	0x4aaa	; 0x4aaa <_ZN5Print7printlnEPKc>
     53e:	87 e1       	ldi	r24, 0x17	; 23
     540:	95 e0       	ldi	r25, 0x05	; 5
     542:	60 e0       	ldi	r22, 0x00	; 0
     544:	71 e0       	ldi	r23, 0x01	; 1
     546:	0e 94 dd 26 	call	0x4dba	; 0x4dba <_ZN6StringaSEPKc>
     54a:	87 e1       	ldi	r24, 0x17	; 23
     54c:	95 e0       	ldi	r25, 0x05	; 5
     54e:	6f e3       	ldi	r22, 0x3F	; 63
     550:	71 e0       	ldi	r23, 0x01	; 1
     552:	0e 94 e6 25 	call	0x4bcc	; 0x4bcc <_ZNK6String6equalsEPKc>
     556:	88 23       	and	r24, r24
     558:	b1 f0       	breq	.+44     	; 0x586 <_Z10ReadSerialv+0x134>

dall'hex estraggo le medesime informazioni?

leo72:
Googlando ho letto che invece dovrebbe poterlo fare. Prova con qualcosa di simile, adattandolo al tuo caso:

avr-objdump -j .sec1 -d -m avr5 foo.hex

provo!

Certo .. cosa t'aspetti che esca ??? :astonished: :astonished: :astonished:

E ripeto, se c'ha messo le mani il compilatore per ottimizzare il codice ... seguirlo è un vero problema !

Guglielmo

leo72:
Googlando ho letto che invece dovrebbe poterlo fare. Prova con qualcosa di simile, adattandolo al tuo caso:

Se invece di perdere tempo con Google avessi fatto avr-objdump -H ... ]:smiley: ]:smiley: ]:smiley:
... avresti avuto un bel help, da cui avresti scoperto che con avr-objdump -i ... ti da i formati supportati, tra cui anche l'hex :grin: :stuck_out_tongue: :grin: :stuck_out_tongue: :grin:

Guglielmo

Che il compilatore c'abbia messo le mani.... è certo! :smiley:
Tutti i firmware sono compilati di default per ottimizzare la dimensione finale, quindi... apriti cielo... :sweat_smile:

gpb01:
Se invece di perdere tempo con Google avessi fatto avr-objdump -H ... ]:smiley: ]:smiley: ]:smiley:

Mea culpa, mea MAXIMA culpa.... =( =(

ps:
ho le attenuanti.. sono sulla carretta windows di lavoro e qui manco so da che parte si mettono le mani per aprire un terminale, non mi fare bestemmiare dai :stuck_out_tongue_closed_eyes: