Question:
Comment déterminer ce qui est gravé sur une ROM Arduino?
asheeshr
2013-03-21 19:30:15 UTC
view on stackexchange narkive permalink

J'ai un Arduino Uno Rev3. Je voudrais extraire et savoir quel code est gravé sur la ROM de la carte micro-contrôleur.

  1. Comment extraire le code du tableau?
  2. Comment trouver le code source d'origine qui est entré dans le fichier hexadécimal?
Afin d'améliorer la réponse ci-dessous, avez-vous plus de détails sur ce que vous recherchez dans le code source d'origine?
Fonctionnement de base @borowcm. Votre réponse couvre cela. VOUS n'avez pas choisi cela comme la meilleure réponse, car d'autres pourraient y répondre / y ajouter.
Trois réponses:
#1
+36
mborowczak
2013-03-21 20:18:15 UTC
view on stackexchange narkive permalink

Je vais répondre en deux parties, # 1 est relativement facile, # 2 impossible au niveau que je suppose que vous voulez.

1. Extraire le code hexadécimal de l'Uno:

Bien que les détails dépendent de la révision de l'Uno que vous avez, vous voudrez utiliser avrdude ( disponible pour Linux, fourni avec OS X Logiciel Arduino) et une commande similaire à la suivante qui extrait les informations d'un ATmega168:

  avrdude -F -v -pm168 -cstk500v1 -P / dev / ttyUSB0 -b19200 -D -Uflash: r: program.bin: r  

Consultez la documentation avrdude pour faire correspondre le paramètre de pièce -p spécifique sur votre appareil (ou postez-les et nous pouvons partir de là).

Comme il semble que vous ayez le Uno Rev3, ce tableau a un ATmega328 ( -pm328 ). Le programmeur "communique en utilisant le protocole STK500 d'origine", donc l'indicateur de protocole de communication -c doit être -cstk500v1 la commande dont vous auriez besoin (en supposant que l'Uno est connecté à / dev / ttyUSB0) suit:

  avrdude -F -v -pm328p -cstk500v1 -P / dev / ttyUSB0 -b19200 -D -Uflash: r: program.bin: r  

Ensuite, votre deuxième question.

2. Conversion du code hexadécimal en source d'origine:

Désolé, mais ce n'est pas possible. Bien que vous puissiez obtenir des "décompilateurs" hexadécimaux, le charabia retourné, bien que fonctionnellement correct, ne sera pas lisible par l'homme (certains commerciaux, comme Hex-Rays, pourraient vous donner un certain niveau de lisibilité humaine).

Puisque vous avez affaire à un appareil Atmel, vous pouvez essayer d'utiliser la chaîne d'outils gcc spécifique à avr avr-gcc . Plus précisément, vous aurez besoin de avr-objdump en utilisant l'indicateur de type MCU nécessaire -m atmega328 (avr5) architecture ( Liste complète des architectures disponibles, types de MCU)

  avr-objdump -s -m atmega328 program.hex > program.dump  

Il est également possible, en fonction de votre configuration, que fournir le type d'architecture lui-même (avr5) serait suffisant:

  avr-objdump -s -m avr5 program.hex > program.dump  
#2
+3
Anon Coward
2016-02-19 15:10:31 UTC
view on stackexchange narkive permalink

Sous windows pour un arduino nano, procédez comme suit:

  cd "C: \ Program Files (x86) \ Arduino \ hardware \ tools \ avr \ bin"  

suivi de ceci:

  "C: \ Program Files (x86) \ Arduino \ hardware \ tools \ avr \ bin \ avrdude" -F "-CC: \ Program Fichiers (x86) \ Arduino \ hardware \ tools \ avr / etc / avrdude.conf "-v -v -patmega328p -carduino -PCOM14 -b57600 -D-Uflash: r: c: \ keep \ program.bin: r  

Voici la sortie du code de saisie ci-dessus:

  avrdude2.exe: Version 6.0.1, compilée le 30 mars 2015 à 14:56:06 Copyright ( c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch Le fichier de configuration à l'échelle du système est "C: \ Program Files (x86) \ Arduino \ hardware \ tools \ avr / etc / avrdude.conf "Utilisation du port: COM14 Utilisation du programmeur: arduino Overriding Baud Rate: 57600 AVR Part: ATmega328P Chip Erase delay: 9000 us PAGEL: PD7 BS2: PC2 RESET disposition: impulsion RETRY dédiée: SCK mode programme série: oui mode programme parallèle: oui Timeout: 200 StabDelay: 100 CmdexeDelay: 25 SyncLoops: 32 ByteDelay: 0 PollIndex: 3 PollValue: 0x53 Memory Détail: Bloquer la page d'interrogation Type de mémoire interrogée Mode Délai Taille Indx Taille paginée #Pages MinW MaxW ReadBack ----------- ---- ----- ----- ---- - ----- ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 non 1024 4 0 3600 3600 0xff 0xff flash 65 6128 0 oui 32768128256 4500 4500 0xff 0xff lfuse 0 0 0 0 non 1 0 0 4500 4500 0x00 0x00 hfuse 0 0 0 0 non 1 0 0 4500 4500 0x00 0x00 efuse 0 0 0 0 non 1 0 0 4500 4500 0x00 0x00 verrouillage 0 0 0 0 non 1 0 0 4500 4500 0x00 0x00 étalonnage 0 0 0 0 non 1 0 00 0 0x00 0x00 signature 0 0 0 0 non 3 0 00 0 0x00 0x00 Type de programmeur: Arduino Description: Version du matériel Arduino: 2 Version du micrologiciel: 1.16 Vtarget: 0.0 V Varef: 0.0 V Oscillator : Off Période SCK: 0.1 usavrdude2.exe: périphérique AVR initialisé et prêt à accepter les instructionsLecture | ################################################ | 100% 0.02savrdude2.exe: Signature de l'appareil = 0x1e950favrdude2.exe: safemode: lfuse se lit comme 0avrdude2.exe: safemode: hfuse se lit comme 0avrdude2.exe: safemode: efuse se lit comme 0avrdude2.exe: lecture de la mémoire flash: lecture | ################################################ | 100% 9.49savrdude2.exe: écriture du fichier de sortie "c: \ keep \ program.bin" avrdude2.exe: safemode: lfuse se lit comme 0avrdude2.exe: safemode: hfuse se lit comme 0avrdude2.exe: safemode: efuse se lit comme 0avrdude2.exe : safemode: Fusibles OK (H: 00, E: 00, L: 00) avrdude2.exe terminé. Merci.  

et voici le fichier résultant: -

  C: \ Program Files (x86) \ Arduino \ hardware \ tools \ avr \ bin>dir c: \ keep \ program.bin Le volume du lecteur C n'a pas d'étiquette. Le numéro de série du volume est le répertoire EE8C-DFB9 de c: \ keep
19/02/2016 19:00 32 670 program.bin 1 Fichier (s) 32 670 octets 0 Dir (s) 41 416 818 688 octets libres  

J'ai renommé mon "avrdude.exe" en "avrdude2 .exe "et a écrit un shim nommé" avrdude.exe "qui appelle le vrai après avoir sorti ce que fait l'arduino pour construire sur mon périphérique cible.

La commande d'origine que mon système utilisait pour construire était: -

  C: \ Program Files (x86) \ Arduino \ hardware \ tools \ avr \ bin \ avrdude "- CC: \ Program Files (x86) \ Arduino \ hardware \ tools \ avr / etc / avrdude.conf "-v -v -patmega328p -carduino -PCOM14 -b57600 -D -Uflash: w: C: \ Users \ user \ AppData \ Local \ Temp \ build4588201597642272956.tmp / TFT_Baja2.cpp.hex: i  

Fait intéressant: le vidage hexadécimal comprenait des fragments d'un autre code que j'avais écrit ... cela en suggère des très intéressants problèmes de confidentialité et de sécurité pour quiconque expédie des arduinos qui ont déjà été utilisés pour d'autres choses ...

Si vous utilisez des cartes autres qu'une nano, mon shim était:

  #! perluse strict; foreach (@ARGV) {$ _ = qq ("$ _") if (/ \ s /)}; # DOS veut des guillemets autour des paramètres embarqués dans l'espace! Foreach (@ARGV) {$ _ = '- v' if ($ _ eq '-q');} # aller verbeux au lieu de silentmy $ parms = join ("", @ ARGV); ouvrir (OUT, ">>", "C: \\ keep \\ avrdude.log") || warn "Impossible d'écrire: $!"; imprimer "\ n". &db_now (). "$ 0 $ parms \ n"; close (OUT); my $ rc = ʻavrdude2.exe $ parms`; open (OUT, ">>", "C: \\ keep \\ avrdude.log"); imprimer $ rc; close (OUT); print $ rc; # Retourne "now ()" dans le format par défaut de mysql.sub db_now {my ($ sec, $ min, $ hour, $ mday, $ mon, $ year, $ wday, $ yday, $ isdst) = heure locale (); return sprintf ("% 04d-% 02d-% 02d% 02d:% 02d:% 02d", 1900 + $ an, $ mon + 1, $ mday, $ hour, $ min, $ sec);}  

compilé dans un windows .exe en utilisant:

  perlapp avrdude.pl  

profitez-en!

#3
  0
user24335
2018-05-11 13:08:12 UTC
view on stackexchange narkive permalink

Il existe un moyen de recompiler avec cette application open source, appelée RetDec:

https://github.com/avast-tl/retdec

Hélas, il ne prend pas en charge AVR.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...