ATmega2560 hex File disassemblieren

OP #7514982
Lesenswert?

Einen wunderschönen Abend meine Kerle,

ich würde gerne wissen, welche Schnittstellen und Befehle eine gekaufte Hardware benutzt. In dem Gerät ist ein Arduino Mega 2560 verbaut. Ich habe die Updatefiles vom Hersteller erhalten, diese sind jedoch schon kompliliert.

Das Updateprogramm überträgt die Hex Datei via AVR Dude.

Ich habe eine alte Version der Software als ino Datei in einer Discord Gruppe gefunden. Wenn ich diese mit der Arduino IDE auf einen blanken Arduino Pro mini spiele, wird er auch von diesem Updatetool als original Hardware erkannt und auf die neue Version geupdated.

Gibt es eine Möglichkeit das File zurück zu übersetzen? Dass da der original Code nicht bei herauskommt ist mir klar, jedoch wüsste ich gerne was auf welchen Ports angeklemmt ist usw.

Das Gerät kann ich leider nicht öffnen, da es 1. noch auf dem Weg aus der USA zu mir ist und 2. auf den Produktfotos ein Garantiesiegel erkennbar ist.

Hier ist noch das Logfile von AVRdude:

1
 
2
avrdude.exe: Version 6.3, compiled on Feb 17 2016 at 09:25:53
3
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
4
             Copyright (c) 2007-2014 Joerg Wunsch
5

6
             System wide configuration file is "C:\Program Files (x86)\RealSimGear Firmware Utility\Data\Loader\avrdude.conf"
7

8
             Using Port                    : \\.\COM3
9
             Using Programmer              : wiring
10
             Overriding Baud Rate          : 115200
11
             AVR Part                      : ATmega2560
12
             Chip Erase delay              : 9000 us
13
             PAGEL                         : PD7
14
             BS2                           : PA0
15
             RESET disposition             : dedicated
16
             RETRY pulse                   : SCK
17
             serial program mode           : yes
18
             parallel program mode         : yes
19
             Timeout                       : 200
20
             StabDelay                     : 100
21
             CmdexeDelay                   : 25
22
             SyncLoops                     : 32
23
             ByteDelay                     : 0
24
             PollIndex                     : 3
25
             PollValue                     : 0x53
26
             Memory Detail                 :
27

28
                                      Block Poll               Page                       Polled
29
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
30
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
31
               eeprom        65    10     8    0 no       4096    8      0  9000  9000 0x00 0x00
32
               flash         65    10   256    0 yes    262144  256   1024  4500  4500 0x00 0x00
33
               lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
34
               hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
35
               efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
36
               lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
37
               calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
38
               signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
39

40
             Programmer Type : Wiring
41
             Description     : Wiring
42
             Programmer Model: AVRISP
43
             Hardware Version: 15
44
             Firmware Version Master : 2.10
45
             Vtarget         : 0.0 V
46
             SCK period      : 0.1 us
47

48
avrdude.exe: AVR device initialized and ready to accept instructions
49

50
Reading | ################################################## | 100% 0.01s
51

52
avrdude.exe: Device signature = 0x1e9801 (probably m2560)
53
avrdude.exe: safemode: hfuse reads as D8
54
avrdude.exe: safemode: efuse reads as FD
55
avrdude.exe: reading input file "Data\RSG Firmware\Binary\RealSimGear-Arduino-3.2.4-G1000XFD1.ino.mega.hex"
56
avrdude.exe: writing flash (9618 bytes):
57

58
Writing | ################################################## | 100% 1.52s
59

60
avrdude.exe: 9618 bytes of flash written
61
avrdude.exe: verifying flash memory against Data\RSG Firmware\Binary\RealSimGear-Arduino-3.2.4-G1000XFD1.ino.mega.hex:
62
avrdude.exe: load data flash data from input file Data\RSG Firmware\Binary\RealSimGear-Arduino-3.2.4-G1000XFD1.ino.mega.hex:
63
avrdude.exe: input file Data\RSG Firmware\Binary\RealSimGear-Arduino-3.2.4-G1000XFD1.ino.mega.hex contains 9618 bytes
64
avrdude.exe: reading on-chip flash data:
65

66
Reading | ################################################## | 100% 1.17s
67

68
avrdude.exe: verifying ...
69
avrdude.exe: 9618 bytes of flash verified
70

71
avrdude.exe: safemode: hfuse reads as D8
72
avrdude.exe: safemode: efuse reads as FD
73
avrdude.exe: safemode: Fuses OK (E:FD, H:D8, L:FF)
74

75

76
avrdude.exe done.  Thank you.

Danke und schönen Abend.

Angehängte Dateien:
#7515355
Lesenswert?

Jens G. schrieb:

Ja, aber es sind eben nicht DIE Namen.

Natürlich nicht. Aber man kann anhand von Peripherizugriffen (deren Namen sollten eindeutig sein) erkennen, /welche/ Peripherie überhaupt genutzt wird (Timer, SPI, I2C etc.) und dann analysieren können, /wie/ diese Peripherie genutzt wird. Bei UARTs beispielsweise lässt sich die Baudrate bestimmen.

Natürlich, Variablennamen, Funktionsnamen oder gar Quelltextkommentare kann so ein Tool nicht wieder herstellen.

#7515563
Lesenswert?

Ob S. schrieb:

Und oft ist nichtmal das wieder direkt assemblierbar (also in dem Sinne, das wieder das originale Binary dabei herauskommt), sondern bedarf meistens noch einiger Nacharbeit, bevor wenigstens das geht.

Nur so yur Info: Ursprünglich hatte der TO "dekompilieren" im Threadtitel verwendet; darunter wird man im Netz eher weniger Informationen finden. Wie weit das Resultat verwendbar ist, war nicht teil meiner Antwort. Damit habe ich keinerlei Erfahrungen.

#7515605
Lesenswert?

Rahul D. schrieb:

nicht dem Dateinamen nach.

Lies exakt, was ich zitiert habe. Nochmal etwas umfangreicher:

Tim H. schrieb:

Ich habe die Updatefiles vom Hersteller erhalten, diese sind jedoch schon kompliliert.

Das Updateprogramm überträgt die Hex Datei via AVR Dude.

Ich habe eine alte Version der Software als ino Datei in einer Discord Gruppe gefunden. Wenn ich diese mit der Arduino IDE auf einen blanken Arduino Pro mini spiele, wird er auch von diesem Updatetool als original Hardware erkannt und auf die neue Version geupdated.

(Hervorhebung von mir)

#7515621
Lesenswert?

Harald K. schrieb:

Ich habe eine alte Version der Software als ino Datei in einer Discord Gruppe gefunden. Wenn ich diese mit der Arduino IDE auf einen blanken Arduino Pro mini spiele, wird er auch von diesem Updatetool als original Hardware erkannt und auf die neue Version geupdated.

Schön. Bezieht sich aber auf den alten Kram. Die Frage war, die aktuelle Datei zu disassemblieren. Es könnte ja (mit Sicherheit) Änderungen zur alten Version geben.

#7515677
Lesenswert?

Tim H. schrieb:

... Dass da der original Code nicht bei herauskommt ist mir klar, jedoch wüsste ich gerne was auf welchen Ports angeklemmt ist usw.

Woran willst du das erkennen? Der disassemblierte Code sagt dir nur, wo im Programm auf die Ports zugegriffen wird, kann dir aber nicht verraten, was an dem Port angeklemmt ist - es sei denn, du kannst die Zugriffe auf Grund des Programmablaufes zuordnen. Das kann dir des Disassembler aber nicht abnehmen.

Gast #7516029
Lesenswert?

Sebastian S. schrieb:

Wenn Du ein direkter Nachfahre vom alten Sisyphos bist, extrem Fit in der Programmierung auf Assemblerebene und echt Ahnung davon hast, wie üblicherweise Programmiert wird, dann könnte es klappen.

Ist er aber wahrscheinlich nicht, sonst hätte er die Eingangsfrage nicht gestellt.

#7516054
Lesenswert?

Tim H. schrieb:

Einen wunderschönen Abend meine Kerle

Ja Kerl, dann lade Dir doch mal GHIRA runter (kostenlos, Open Source) und schau Dir an, was mit Ausführung herauskommt. Das kannst Du dann mit dem "alten Code" vergleichen (oder auch nicht) und Deine Schlüsse ziehen.

IDA pro ist aus meiner Sicht besser (kostet aber auch €) - aber auch damit wirst Du keinen tollen C-/ C++-Code mit sprechenden Variablen-Namen herausbekommen.

#7516113
Lesenswert?

Ich bin auch Haralds Tipp nachgegangen. Es gibt zwar kein Ubuntu Rundumsorglospaket für Ghidra, aber man muss anscheinend nur vorher noch Open-JDK installieren und kann den Rest von Github runterladen.

https://github.com/NationalSecurityAgency/ghidra https://www.makeuseof.com/how-to-install-ghidra-linux/

Gleich mit Reklame für die NSA: "If you are a U.S. citizen ... consider applying for a career with us."

Früher habe ich öfters Disassembler benutzt, erst für den 6502, um die Programme aus Funkschau und mc zu studieren. Die musste man damals noch als Hex-Code abtippen. Später auch mal Atari ST (68k) und ein DOS-Programm

Und den 6809-Code meines Musiksynthesizers, der war aber etwas groß. Erst dieses Jahr habe ich jemanden auf Github entdeckt, der den 6809 genauer untersucht hat und sogar einen Programmfehler beseitigt hat, ein echter Künstler: https://github.com/ijsf/wersi-mk1-ex20-re https://wer.si/ "fixing firmware bugs from 1987 in 2017" https://bitlog.it/20170102_fixing_firmware_bugs_from_1987_in_2017.html Den Fehler hatte ich damals auch gesehen, aber nicht untersucht. Auf der MIDI-Schnittstelle fehlte ein end-of-transmission Zeichen, damit funktionierte die SysEx-Übertragung nicht.

#7516174
Lesenswert?

Das einzige DOS-Programm, das ich mir damals näher angeschaut habe steht noch hier zum Download bereit: https://www.mobimail.de/afu.htm#prmon Der Quelltext war damals natürlich nicht erhältlich. Soweit ich noch weiß ein TSR-Programm "terminate-and-stay-resident", eine Art Multitasking unter DOS. Ich vermisse den "Kopierschutz", er fragte sein Rufzeichen ab, das im Programm irgendwo stand. Das lief eine Weile am Arbeitsplatz, wir waren in der Abteilung von 11 Kollegen insgesamt acht Funkamateure. Irgendwann sprach der Entwicklungsleiter ein Machtwort "das verschwindet vom Rechner", als er in der Pause uns beim "Lemminge" spielen ertappt hatte.

(Firma: 1984now) #7516193
Lesenswert?

Christoph db1uq K. schrieb:

Das einzige DOS-Programm, das ich mir damals näher angeschaut habe steht noch hier zum Download bereit: https://www.mobimail.de/afu.htm#prmon Der Quelltext war damals natürlich nicht erhältlich. Soweit ich noch weiß ein TSR-Programm "terminate-and-stay-resident", eine Art Multitasking unter DOS.

Naja, nicht gleich "Multitasking". So ein DOS-TSR hat sich einfach nur in die Vektoren bestimmter Systemaufrufe (alle die es benötigte, um seinen Job zu machen) "eingehängt".

Also mitnichten Multitasking. Es hat einfach entweder vor oder nach dem Nutzcode der laufenden Anwendung irgendwas tun können. Ob vorher oder nachher, konnte es selber bestimmen (durch die Art des Einhängens in den Vektor). Naja, das TSR konnte sich darüber hinaus auch noch in Vektoren einhängen, die in der aktuellen DOS-Anwendung überhaupt nicht benutzt wurden. Also doch irgendwie ein wenig "echtes" Multitasking.

#7516580
Lesenswert?

Das war mein erster Versuch mit Ghidra, als Mikrocontroller ein "avr_8/gcc" eingestellt, der war wohl etwas zu allgemein. Es gibt noch einen avr_256, der dürfte für den Atmega2560 genauer passen. Das Postscript-File hat jetzt sagenhafte 3220 Seiten, aber wieder ab S. 87 nur Müll. Hier Seiten 1-86 als PDF gedruckt.

Jetzt sehen schon die Interrupt-Vektoren besser aus. Man sieht dass nicht sehr viele benutzt sind. Die meisten enden wie es Atmel schon vorschlägt mit einem jmp RESET.

Unfein, dass mitten im Programmcode auch Texte untergebracht sind, wenn ich recht sehe. Das macht man nicht.

Unterprogramme erkennt man am push zu Beginn und pop ret (bzw. reti für Interrupts) am Ende, davon gibt es einige.

Hier die benutzten Interuptvektoren: Reset code:0000 0c 94 7c 01 jmp FUN_code_017c INT0 code:0000 02 0c 94 16 09 jmp FUN_code_000916 INT1 code:0002 0c 94 16 09 jmp FUN_code_0916 TIMER2_OVFcode:0004 0c 94 ea 08 jmp FUN_code_08ea TIMER1_COMPAcode:0006 0c 94 be 08 jmp FUN_code_08be TIMER1_OVF code:0008 0c 94 92 08 jmp FUN_code_0892 SPI_STC code:000a 0c 94 66 08 jmp FUN_code_0866 USART_UDRE code:000c 0c 94 3a 08 jmp FUN_code_083a

Angehängte Dateien:
#7516639
Lesenswert?

Hab ich ja gemacht, hier die fünf Auswahlmöglichkeiten. Die breiten jmp-Befehle gibt es bei den "default" AVR8 nicht, daher schon in der Interrupttabelle die Fehler.

In der Interruptliste habe ich ein paar vergessen, im PDF stehen sie alle auf den ersten Seiten. Also Pin-Interrupts INT, USART und Timer sind benutzt.

Angehängte Dateien:
#7516698
Lesenswert?

Ja da gibt es aber nur zwei, den 2560 und 2561 (und ein paar x-Mega256, aber für die gibt es eine eigene Auswahlmöglichkeit): https://www.microchip.com/en-us/parametric-search.html/716 Das hätte ich vorher sehen sollen, dann hätte ich gleich den "atmega256" gewählt. Man sieht den Unterschied auch am "Size", "default" ist 16, die beiden anderen 24. Egal. Um z.B. die Baudrate zu finden, muss man schon ziemlich tief im Text wühlen. Die USART-Register sind im Hauptprogramm nicht speziell bezeichnet.

zum Suchen braucht man noch das Datenblatt zum Atmega2560: https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf

#7516796
Lesenswert?

Christoph db1uq K. schrieb:

Unfein, dass mitten im Programmcode auch Texte untergebracht sind, wenn ich recht sehe. Das macht man nicht.

Sieht aber nicht nach Text (0x20..0x7E) aus. Könnten Daten (16Bit) sein oder der Dissassembler ist aus dem Tritt geraten. Daten inmitten Code habe ich beim AVR-GCC noch nicht gesehen. Der AVR-GCC versucht, konstante Daten in den ersten 64kB zusammen zu fassen, nach der Vektortabelle.

Wie kommt man eigentlich auf die verrückte Idee, plain Text als PDF auszugeben?

#7517021
Lesenswert?

Wenn ich Ghidra zum Drucken auffordere habe ich nur die Möglichkeit auf meinen Laserdrucker zu drucken, kann aber auch "in Datei drucken". Da wird als einzige Möglichkeit ein .ps vorgeschlagen, und das wird riesig. Das kann ich sicher alles irgendwo konfigurieren. Bisher habe ich es einfach so gemacht wie es ohne Nachlesen klappte, das ist sicher nicht optimal. Mit Okular noch in ein PDF gedruckt, und nur die ersten 86 Seiten. Ich finde 300 kByte sind noch recht klein. Die Daten sind ja nebendran noch als ASCII gezeigt, wo es geht. Dazwischen auch gelegentlich der Dateiname als ASCII-Text. Ich hatte auch einen Fehler in Ghidra vermutet, vielleicht auch mein Konfigurationsproblem.

#7565979
Lesenswert?

Tim H. schrieb:

Einen wunderschönen Abend meine Kerle,

Hallo,

ich würde gerne wissen, welche Schnittstellen und Befehle eine gekaufte Hardware benutzt. In dem Gerät ist ein Arduino Mega 2560 verbaut. Ich habe die Updatefiles vom Hersteller erhalten, diese sind jedoch schon kompliliert.

um die Ursprungsfrage aufzugreifen ... Das Gerät ist relativ simpel konstruiert. Es stellt per USB eine serielle Schnittstelle bereit und schickt dort bei Betätigung der Eingabetasten eine Textzeile, welche Taste gedrückt wurde.

Drehst du den HDG-Knopf nach rechts, kommt z.B. ENC_HDG_UP, drehst du ihn nach links, dann ENC_HDG_DN. Drückst du den HDG-Knopf, kommt BTN_HDG_SYNC=1 und lässt du ihn los, dann BTN_HDG_SYNC=0.

In regelmäßigen Zeitabständen schickt das Gerät noch Leerzeilen als Heartbeat und ab und zu noch einen Info-Banner. Mit einem seriellen Terminal kann man sich das alles anschauen, ganz ohne die Firmware reverse engineeren zu müssen.

In diesem X-Plane-Treiber sind alle Kommandos für das G1000 eingetragen: https://github.com/hamarituc/realsimgear/.

Die Mappings für weitere Geräte kann man aus dem macOS-Treiber für X-Plane unter https://help.realsimgear.com/en/articles/7971491-downloads-for-x-plane ableiten. Dort ist eine Datei CommandMapping.ini enthalten, die alles enthält, was du brauchen solltest.

Wie die Ansteuerung von Ausgaben funktioniert, weiß ich leider (noch) nicht. Dazu fehlt mir die Hardware. Für das G1000 sind Ausgaben nicht relevant.

Ich habe mir die Firmware und den Treiber in Ghidra angeschaut. Ich vermute, dass man mit <0, <1, <2 ... LEDs an- und ausschalten kann (z.B. an einer GMA340-Aufschaltanlage. Mit {Z0 bis {Z1.0 kann man jeweils "Analogausgänge" (z.B. Helligkeit der Anzeigen, etc.) ansteuert. A bis Z wären die entsprechenden Kennbuchstaben für den Kanal. Mit | dürfte sich der Status der Kanäle abfragen lassen. Zudem gibt es noch die Kommandos !c, !o0 und !o1, auf die ich mir aber keinen Reim machen kann.

#7566062
Lesenswert?

Wf88 schrieb:

Harald K. schrieb:

Ja, aber Open Source. Als Anwender davon muss man also keine Ängste verspüren.

Aha, nur weil der Code mit rausgerotzt wurde, ist es also frei von Verdacht? Gabs da schon ein grosses Code-Checken von einer Gruppe aus einigen Erfahrenen Programmiereren?

Dann betreib es in einer VM ohne Netzwerkzugang, wenn du dich so fürchtest.

Aber wahrscheinlich sind da gleich ein paar Breakout-Exploits drin um deine Geheimnisse trotzdem heimfunken zu können.

Gast #7566456
Lesenswert?

Wf88 schrieb:

Gabs da schon ein grosses Code-Checken von einer Gruppe aus einigen Erfahrenen Programmiereren?

Wo gibt es denn so etwas? In der Phantasiewelt? Open Source ist schnell entwickelte Bastelsoftware ohne Ziel. Da wirken evolutionäre Mechanismen und was heraus kommt ist Zufall.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren