En cours Arduino - Importer code interne

phil135
Compagnon
15 Septembre 2012
1 332
france, essonne, nord
  • Auteur de la discussion
  • #1
bonjour,
y a-t-il une possibilité pour relire le logiciel flashé dans un arduino ?

mon imprimante 3d est basée sur une GT2560 (un arduino customisé avec des entrées-sorties pour imprimante 3d) et le doute m'étreint quant à ce que j'ai finallement mis dedans... mais qui fonctionne bien
 
speedjf37
Compagnon
15 Octobre 2009
1 879
indre et loire
Bonjour,

A défaut de relire le code (le binaire est illisible pour un humain), on peut avec un terminal série avoir des infos ( éventuellement la version si Marlin ou grbl ).

Utiliser l'IDE Arduino ou tout terminal sériée , paramétrer la vitesse -> reset de l'Arduino -> message sur le terminal

exemple grbl:

JF
 
petit_lulu
Compagnon
11 Janvier 2015
584
gers
salut,
A défaut de relire le code (le binaire est illisible pour un humain)
lire le binaire c'est pas complique pour un humain, le "decoder" c'est (beaucoup) plus complique.:eek: :-D
ca me rappel ma jeunesse quand je codai des programmes a la main, directement en "code machine" pour un µP 6502 et VIA 6522...:smt021 :hang::smileyvieux:

par contre il existe des desassembleur pour arduino (et d'autre processeurs meme), ca "decode" le binaire du programme mais ca reste encore "imbuvable" car aucun commentaires...
 
phil135
Compagnon
15 Septembre 2012
1 332
france, essonne, nord
  • Auteur de la discussion
  • #5
hmmm
est-ce que je comprends ou est-ce que je fantasme:

on peut lire le programme en binaire dans l'arduino (comment ?)
puis ensuite de-assembler ce binaire (un nom d'outil ?)

--> ce "code source" est-il alors utilisable dans l'atelier logiciel ? en vue de programmer une carte de rechange notamment (et tant pis pour les commentaires)
 
M4vrick
Compagnon
12 Août 2015
1 068
La mémoire de l'arduino (la mémoire dans laquelle est stocké le programme) ne fonctionne qu'en binaire. Donc ce qu'on envoi dans l'arduino est un fichier binaire, ce qu'on appelle un fichier compilé.
Ce qu'on peut relire est identique : un fichier binaire compilé.

Ce fichier peut etre réutilisé sur une autre carte arduino identique tel quel.

Par contre on ne récupère jamais le code source d'origine dans le format "Arduino", au mieux on peut décompiler avec certains outils pour récupérer le code brut. Mais c'est un gros travail ensuite pour pouvoir le mettre en forme et pouvoir le réutiliser ou le modifier.
 
speedjf37
Compagnon
15 Octobre 2009
1 879
indre et loire
ca me rappel ma jeunesse quand je codai des programmes a la main, directement en "code machine" pour un µP 6502 et VIA 6522...:smt021 :hang::smileyvieux:

par contre il existe des desassembleur pour arduino (et d'autre processeurs meme), ca "decode" le binaire du programme mais ca reste encore "imbuvable" car aucun commentaires...
J'ai commencé à programmer en HexaDécimal dur mon 6502 avec des interrrupteurs !!!!!

J'ai professionnellement désassemblé du binaire 6809 pour le modifier (remplacer des afficheurs obsolètes) et reprogrammer des cartes embarquées. (nous avions des sources partielles).

Désassemblé du 68000 pour recoder l'interface 'C' <-> assembleur (les registres dans la pile) pour un nouveau compilateur.

Ce n'est possible que si le binaire n'est pas verrouillé (protégé) comme sur des PIC microchip (fusible pour le code ,eeprom etc).

Sur Arduino il y a aussi des fusibles de protection;

JF
 
speedjf37
Compagnon
15 Octobre 2009
1 879
indre et loire
je vois l'idée
mais en fait j'ai un peu touillé le code marlin qui est dans cet arduino, sans trop (du tout) gérer les versions
l'autre solution est l’archéologie du disque dur, avec le risque d'erreur que ça comporte
si modif dans les options peut se voir dans l'interface (certains menus s'adaptent).
pour les modifs de paramètres idem pour certains

JF
 
petit_lulu
Compagnon
11 Janvier 2015
584
gers
@speedjf37, quand on parle d'un operande en adressage indirect indexe X ou en page zero indexe Y, ca fait sourir (ou pleurer) les jeunes de maintenant !!! :eek::smt022
comme quoi, tout fou le camp !!! :smileyvieux:
j'ai commence avec un VIC20, ancetre du C64.

je programmais mes EEPROM avec un ordinateur alice pour ensuite la mettre en ROM dans mes montages, toute une epopee !

aller, c'est l'heure de ma piqure....
 
phil135
Compagnon
15 Septembre 2012
1 332
france, essonne, nord
ok bravo :smt038 ça fait un peu ancien combattant, mais j’admire

mais pour mon pb, je comprends un peu plus haut que je peux "reprendre" le binaire dans la GT2560 et ensuite envoyer ce binaire dans une neuve (?)
habituellement je fait une compilation-flashage "tout en un clic" , mais en fait on peut donner un binaire déjà compilé ?
 
Otatiaro
Compagnon
6 Mai 2007
911
Metz (57)
Salut,

Comme expliqué au dessus, si tu veux copier le programme binaire, normalement tu ne devrais pas avoir de problème (je ne connais pas trop les sécurités des AVR, mais très probable que rien ne soit mis en place pour protéger la lecture).

Si par contre l'objectif c'est d'aller voir ce que fait le programme, et éventuellement le modifier, là c'est une autre paire de manches, il va falloir soit se mettre sérieusement à l'assembleur (c'est plus trop à la mode, surtout sur Atmel), soit trouver une programme qui va essayer d'analyser le binaire pour essayer de faire quelque chose qui ressemble au code source original, c'est ce qu'on appelle la décompilation (l'inverse de compiler, qui prend le code source et génère le code binaire).

Si par contre il existe des protections contre la lecture activées sur ton Atmel, c'est mort, pour le relire il faut l'envoyer à une boite très spécialisée qui va ouvrir physiquement le boitier, et inspecter avec un microscope électronique à balayage chaque cellule de flash pour connaitre son état, pour finalement essayer d'en extraire le code binaire, coût de l'opération, quelques milliers d'euros au bas mot.
Et ça n'est possible que si le constructeur n'a pas mis de protection physique (plaque en métal qui recouvre les cellules de flash, etc.).

Et sinon pour le HS de l'assembleur, j'en ai fait il y a longtemps sur PIC16 (mais peut-on parler d'assembleur avec 35 - de mémoire - instructions seulement ?).
Et j'en fais encore aujourd'hui, sur Cortex-M, pour notre RTOS maison qui est maintenant open-source : https://github.com/eznovsas/OpSy
Dès que c'est très spécifique au processeur, ce n'est pas la vocation de C ou C++ de les intégrer, donc ça reste de l'assembleur inline.

Thomas.
 
jpbbricole
Compagnon
26 Mai 2016
1 927
Corsier-sur-Vevey (Vaud)
Bonjour phil135
mon imprimante 3d est basée sur une GT2560
C'est toi qui a téléchargé ce firmware?
Si c'est une imprimante 3D, il y a de fortes chances que ce soit Marlin qui est dans ses entrailles, donc les sources sont disponibles de par là, pas besoin de désassembler le contenu du programme.
Comme préconisé par @speedjf37, connectes ta carte GT2560 au PC, ouvres le moniteur de l'IDE Arduino sur le port COM de la carte, mets la vitesse à 250000 et fait un reset de la carte, tu auras déjà quelques informations, envoies la commande $M503<Enter> pour lister le paramétrage.

Cordialement
jpbbricole
 
simon74
Compagnon
3 Mai 2016
963
Savoie
Extraire le binaire d'un arduino, en general, est faisable. Apres, pour le decrypter en language facilement lisible par un etre humain, plus difficile.

Premier chose, c'est de disasssembler ce binaire. avr-objdump pourrait etre utile, mais si y a des tables d'addresses, ect, il va te falloir un disassembler plus performant. Une fois que t'as ca, tu vas pouvoir, avec pas mal de temps et effort, trouver les fonctions de libraire - memcpy(), printf(), ect. En scrutant les points d'entree des fonctions, tu pourras decrypter leurs parametres, les donner des noms (aleatoires, bien sur), et doucement decrypter le fonctionallité du logiciel.

Si t'arrive a choper une copie de IDA Pro, ca fait le plupart du "heavy lifting"

Mais en aucun cas tu pourras automatiquement extraire le source de ton programme.
 

Dernières discussions

Haut