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 :
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
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.