Lecture contenu arduino

Existe-t-il une méthode pour lire le contenu d'une carte Arduino programmée pour analyser son sketch et le retravailler éventuellement où est-ce impossible?

Quelle carte et qu’espérer vous extraire ?
Le sketch c++ a été compilé et vous n’avez que du langage machine…

Eh non.

Tout ce que tu peux faire c'est récupérer le fichier binaire et faire des copies sur des micros vierges, si le micro n'a pas été verrouillé.
Quant à récupérer le code source impossible à part peut être certains moyens peu orthodoxes et sans garanti de succès :
boule_de_cristal

Il est toujours possible de faire une décompilation, mais d'une la modification d'un programme est la plus pars du temps illégale.
De deux le source produit sera assez différent et je pense que tu risque de mettre plus de temps à l'analyser que de réécrire un programme from scratch.

Le but serait de connaitre le raisonnement utilisé pour réaliser une certaine action .. pas un copiage pur et simple
La réécriture et les modifications suivra
Comment fait-on cette décompilation?

Ba tu cherche un décompilateur sur google qui transforme le binaire pour ton processeur et le langage source que tu veux produire.
Ce genre de chose nécessite un certains niveau dans le langage visé en plus de beaucoup de temps.
Je te souhaite bon courage, voir bonne chance pour arriver à tes fins.

Bonsoir jo_6466

Si tu décris l'action, on pourrait t'expliquer comment la reproduire.

Cordialement
jpbbricole

c'est quand même plus amusant de chercher à résoudre un problème que de copier une solution...

quel est donc ce problème qui vous semble insurmontable ?

Je n'ai pas de projet particulier à décompiler
Je voulais juste savoir s'il était possible d'extraire hors d'une carte arduino son contenu dans le but de visionner son contenu afin de le comprendre

Suivant le processeur et ses mécanismes de sécurité il est possible d’aller lire la mémoire flash ou l’EEPROM

Par exemple sur AVR avec avrdude Pololu - 5.8. Reading and writing from EEPROM and flash

Sur une carte arduino tout est dans un ATmega328P
Meme s'il fallait le dessouder, la décompilation est faisable?

Sans même le désouder ou le sortir de son slot (sur UNO), on peut lire son contenu (flash et EEPROM) avec avrdude du moment que les fusibles de protections n'ont pas été activés

Je te remercie ... je vais me documenter sur ce AVRDude
Je reviendrai si nécessaire
Bonne journée

en gros

  • vous prenez votre IDE

  • vous vous assurez dans les préférences de l'IDE que vous avez tous les messages

  • vous ouvrez l'exemple blink et vous le chargez dans un Arduino UNO

  • vous vérifiez que la LED clignote à la fréquence correcte pour vous assurer que le programme était chargé

ensuite pour extraire le contenu et voir l'assembleur

vous commencez par utiliser avrdude pour aller lire la mémoire flash:

~/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude -carduino -C ~/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf -v -V -patmega328p -P/dev/cu.usbmodem14201 -b115200 -D -Uflash:r:test.hex:i

ici j'ai utilisé /dev/cu.usbmodem14201 pour le port car c'est là où est connecté mon UNO sur mon Mac et les chemins vers avrdude ou la config, vous pouvez les voir dans la console de compilation à la fin quand il a fait l'opération de chargement

vous verrez défiler dans votre terminal de ligne de commande

         Using Port                    : /dev/cu.usbmodem14201
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: reading flash memory:

Reading | ################################################## | 100% 4.19s

avrdude: writing output file "test.hex"

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK (E:00, H:00, L:00)

avrdude done.  Thank you.

une fois que cette commande a été exécutée vous avez un ficher test.hex qui a été créé et qui contient ce qui avait dans la mémoire flash

il faut convertir ce .hex en .elf de façon à pouvoir ensuite décompiler.

ça se fait avec la commande objcopy. on lui dit que le format d'entrée est ihex et qu'on veut un format de sortie elf32-avr

~/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/bin/objcopy -I ihex -O elf32-avr test.hex test.elf

vous obtenez ainsi un ficher test.elf

ce fichier est bien sûr illisible tel quel pour le commun des mortels, et donc on veut générer une version ASCII des commandes assembleurs. On va donc désassembler le .elf pour générer de l'assembleur. la commande objdump sait faire cela avec l'option -D

~/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/avr/bin/objdump -D test.elf

et vous obtenez un gros dump de toutes les sections

test.elf:     file format elf32-avr


Disassembly of section .sec1:

00000000 <.sec1>:
       0:	0c 94 5c 00 	jmp	0xb8	;  0xb8
       4:	0c 94 6e 00 	jmp	0xdc	;  0xdc
       8:	0c 94 6e 00 	jmp	0xdc	;  0xdc
       c:	0c 94 6e 00 	jmp	0xdc	;  0xdc
      10:	0c 94 6e 00 	jmp	0xdc	;  0xdc
      14:	0c 94 6e 00 	jmp	0xdc	;  0xdc
...
    7fee:	ee 27       	eor	r30, r30
    7ff0:	ff 27       	eor	r31, r31
    7ff2:	09 94       	ijmp
    7ff4:	ff ff       	.word	0xffff	; ????
    7ff6:	ff ff       	.word	0xffff	; ????
    7ff8:	ff ff       	.word	0xffff	; ????
    7ffa:	ff ff       	.word	0xffff	; ????
    7ffc:	ff ff       	.word	0xffff	; ????
    7ffe:	04 04       	cpc	r0, r4

ensuite il ne vous reste plus qu'à comprendre ce que ça fait :smile: :innocent:

1 Like

Ahahaha ... merci de m'avoir ouvert la voie de façon très claire ... mais comme tu dis, le final ne sera pas à ma portée je le crains
Je te remercie tout de même de m'avoir aidé!!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.