Forum: Mikrocontroller und Digitale Elektronik Assembler aus Hex-Dump


von Patrick L. (crashdemon)


Lesenswert?

Hallo Leute,

ich möchte gerne ein wenig Reverse-Enginnering betreiben. Dazu möchte 
ich ein Hex-Dump wieder in Assembler konvertieren. Konkret möchte ich 
das für einen ATtiny1634 machen!

Wenn ich einen Hex-Dump habe scheine ich mit dem folgenden Befehl an den 
Assemble-Code zu kommen:

avr-objdump -m avr -j .sec1 -d hex_dump.hex > hex_converted.asm

(http://rn-wissen.de/wiki/index.php/Assembler-Dump_erstellen_mit_avr-gcc)

Dazu hätte ich ein paar Fragen. Ist als Architektur "avr" richtig?? Ich 
habe auch schon Beispiele gesehen bei dehnen avr4 oder avr2 standen?

Gibt es eine vergleichsweise bequeme Möglichkeit aus dem Assembler-Code 
wieder C-Code zu bekommen? (Mir ist klar, dass ein Compiler schon viel 
Optimert und deswegen der C-Code nicht gerade schön ausehen wird).

Ich möchte IDA Pro für eine weitere Analyse benutzen. Das Tool 
unterstützt ja grundsätzlich die AVR Architektur. Leider gibt es den µC 
nicht zu Auswahl! Ist dass ein Problem, weil ich immer angenommen habe, 
dass das Instruction Set bei allen Atmegas, Attinys gleich ist?

Außerdem, nach welchen kriterien teilt der Compiler den Code in 
Sektionen auf? (-j .sec1)

von Patrick L. (crashdemon)


Lesenswert?

Patrick L. schrieb:
> Dazu hätte ich ein paar Fragen. Ist als Architektur "avr" richtig?? Ich
> habe auch schon Beispiele gesehen bei dehnen avr4 oder avr2 standen?

Ok, ierzu habe ich schon selber eine Antwort gefunden: 
http://www.nongnu.org/avr-libc/user-manual/using_tools.html

von holger (Gast)


Lesenswert?

>Gibt es eine vergleichsweise bequeme Möglichkeit aus dem Assembler-Code
>wieder C-Code zu bekommen?

Schon mal versucht aus Hamburgern wieder eine Kuh zu machen?

von Patrick L. (crashdemon)


Lesenswert?

holger schrieb:
> Schon mal versucht aus Hamburgern wieder eine Kuh zu machen?

Hehe, neh. Mir ist schon klar, dass der C-Code nicht besonders lesbar 
dadurch wird.... Aber ist zumindest schonmal ein Anfang!

von Klaus (Gast)


Lesenswert?

Patrick L. schrieb:
> holger schrieb:
>> Schon mal versucht aus Hamburgern wieder eine Kuh zu machen?
>
> Hehe, neh. Mir ist schon klar, dass der C-Code nicht besonders lesbar
> dadurch wird.... Aber ist zumindest schonmal ein Anfang!

Naja. "Nicht besonders lesbar" dürfte - vorläufig - die Untertreibung 
des Jahres sein.

Es gibt dabei ein prinzipielles Problem, dass unlösbar ist. Als 
einfach(st)es Beispiel wähle ich mal folgendes:

Angenommen, Du siehst im Assemblercode, das zwei 8-Bit-Werte addiert 
werden und bei Überlauf dieser in eine weitere Addition einfliesst. Ist 
das nun im Quellcode eben diese Addition von zwei uint_8 gewesen, die 
aus einem Grund, der in der Anwendung liegt, bei Überlauf die zweite 
Addition von zwei uint_8 um eins erhöht oder handelt es sich um eine 
16-Bit-Addition? Das ist - maschinell jedenfalls - nicht entscheidbar.

Gerade bei Entscheidungsstrukturen ist prinzipiell nicht entscheidbar ob 
diese ganz oder zum Teil - und im letzteren Fall, zu welchem Teil - 
diese eine in der Anwendung liegende Struktur abbilden oder eine, die 
sich (bzw, der Compiler) aus der "Emulation" der Datentypen herleitet.

Mehr noch, gibt es Fälle in denen eine Entscheidung an sich oft als 
Arithmetische oder logische Operation formuliert wird. Ob das nun schon 
im Quelltext so war oder erst durch Optimierung entstanden ist, lässt 
sich auch nicht - maschinell, wie gesagt - nicht entscheiden.

D.h. man muss schon ungefähr wissen, was man sucht bzw. herausfinden 
will und vor allem, nach welchem Entwurf die SW - wenn auch nur 
möglicherweise - implementiert wurde. Und dieses "ungefähr wissen" kann 
eben nur der Mensch.

von Klaus (Gast)


Lesenswert?

Klaus schrieb:
> Und dieses "ungefähr wissen" kann
> eben nur der Mensch.

Oder eine ziemlich ausgefuchste Anwendung mit einer Riesen-Datenbank im 
Hintergrund, für die der normale Arbeitnehmer erst einmal - unter 
Verzicht auf Komfort wie Essen, Wohnung, Familie etc. - so schlappe 500 
Jahre arbeiten muss. :-)

von Dr.PillePalle (Gast)


Lesenswert?

nennt sich disassemblieren

(spielen mit kleinen weißen Fretchen die auf dem Teppich tanzen)

Nein ,man benutze einen Disassembler dazu ...

zBsp. http://www.johannes-bauer.com/mcus/avrdisas/

Viel Spass damit

von Patrick L. (crashdemon)


Lesenswert?

Klaus schrieb:
> Naja. "Nicht besonders lesbar" dürfte - vorläufig - die Untertreibung
> des Jahres sein.

Ja gut; einfach ist es nicht gerade dass ist schon wahr.

> Es gibt dabei ein prinzipielles Problem, dass unlösbar ist. Als
> einfach(st)es Beispiel wähle ich mal folgendes:
>
> Angenommen, Du siehst im Assemblercode, das zwei 8-Bit-Werte addiert
> werden und bei Überlauf dieser in eine weitere Addition einfliesst. Ist
> das nun im Quellcode eben diese Addition von zwei uint_8 gewesen, die
> aus einem Grund, der in der Anwendung liegt, bei Überlauf die zweite
> Addition von zwei uint_8 um eins erhöht oder handelt es sich um eine
> 16-Bit-Addition? Das ist - maschinell jedenfalls - nicht entscheidbar.

Verstehe ich, da natürlich viel von der Optimerung des Compilers 
anhängt.

> Gerade bei Entscheidungsstrukturen ist prinzipiell nicht entscheidbar ob
> diese ganz oder zum Teil - und im letzteren Fall, zu welchem Teil -
> diese eine in der Anwendung liegende Struktur abbilden oder eine, die
> sich (bzw, der Compiler) aus der "Emulation" der Datentypen herleitet.

[...]

> Mehr noch, gibt es Fälle in denen eine Entscheidung an sich oft als
> Arithmetische oder logische Operation formuliert wird. Ob das nun schon
> im Quelltext so war oder erst durch Optimierung entstanden ist, lässt
> sich auch nicht - maschinell, wie gesagt - nicht entscheiden.

[...]

> D.h. man muss schon ungefähr wissen, was man sucht bzw. herausfinden
> will und vor allem, nach welchem Entwurf die SW - wenn auch nur
> möglicherweise - implementiert wurde. Und dieses "ungefähr wissen" kann
> eben nur der Mensch.

Naja die Adressen der Interrupt-Vekoren sind ja zumindest schonmal fest. 
Da wird dann je nach umfang des Codes in der ISR in entsprechenden 
Funktionen gesprungen.

Nach Best-Practice sollten  ISRs ja möglichst kopakt sein. Das wäre ja 
schonmal eine Stelle sein an der man ansetzen könnte, oder nicht?

Außerdem sich ja auch die Hardwareregister mit denen Komponenten 
konfiguriert werden bekannt (SPI, USART, TIMER, WD, ...). Dann weiß man 
ja schonmal grob wie Peripherie konfiguriert ist.

von Patrick L. (crashdemon)


Lesenswert?

Dr.PillePalle schrieb:
> nennt sich disassemblieren
>
> (spielen mit kleinen weißen Fretchen die auf dem Teppich tanzen)
>
> Nein ,man benutze einen Disassembler dazu ...
>
> zBsp. http://www.johannes-bauer.com/mcus/avrdisas/

Macht dass nicht auch schon avr-objdump? 
(http://ccrma.stanford.edu/planetccrma/man/man1/avr-objdump.1.html)

Beim Hex-Dump habe ich auch keine Debug-Informationen was die ganze 
Sache erschwert!

Gibt es eine möglichkeit herauszufinden, aus wo welche Sections 
beginnen?

http://rn-wissen.de/wiki/index.php?title=Avr-gcc/Interna#Speicherverwaltung

von Andy P. (Gast)


Lesenswert?

Patrick L. schrieb:
> Dr.PillePalle schrieb:
>> nennt sich disassemblieren
>>
>> (spielen mit kleinen weißen Fretchen die auf dem Teppich tanzen)
>>
>> Nein ,man benutze einen Disassembler dazu ...
>>
>> zBsp. http://www.johannes-bauer.com/mcus/avrdisas/
>
> Macht dass nicht auch schon avr-objdump?
> (http://ccrma.stanford.edu/planetccrma/man/man1/avr...)
>
> Beim Hex-Dump habe ich auch keine Debug-Informationen was die ganze
> Sache erschwert!
>
> Gibt es eine möglichkeit herauszufinden, aus wo welche Sections
> beginnen?
>
> http://rn-wissen.de/wiki/index.php?title=Avr-gcc/I...

Manno das ist kein Quantencomputer sondern ein kleiner AVR. 
Disassemblieren, Code lesen, Stück für Stück verstehen, Dabei 
Registernamen durch sinnvolle Variablennamen ersetzen und so irgendwann 
zur Gesamtfunktion kommen. Und bei einem AVR ist es auch von Vorteil, 
wenn man den Schaltplan rund um den AVR in den Händen hält.
Um mal ein Beispiel für zu lösende Fragen zu geben:
Ob die Software auf 0x0000 oder 0x0018 wegen davor liegender 
interruptvektoren beginnt oder ob bei 0x1c00 ein Bootloader liegt, Lässt 
sich auch von weniger geübten Assembler-Programmierern durch einen 
scharfen Blick auf den disassemblierten Code beantworten.

von Patrick L. (crashdemon)


Lesenswert?

Andy P. schrieb:
> Manno das ist kein Quantencomputer sondern ein kleiner AVR.
> Disassemblieren, Code lesen, Stück für Stück verstehen, Dabei
> Registernamen durch sinnvolle Variablennamen ersetzen und so irgendwann
> zur Gesamtfunktion kommen.

Da stimme ich voll und ganz mit dir überein.

> Und bei einem AVR ist es auch von Vorteil,
> wenn man den Schaltplan rund um den AVR in den Händen hält.

Hab ich; und so komplex ist die Beschaltung auch nicht. Ein bisschen 
PWM, USART ein Paar Taster + Leds.

> Um mal ein Beispiel für zu lösende Fragen zu geben:
> Ob die Software auf 0x0000 oder 0x0018 wegen davor liegender
> interruptvektoren beginnt oder ob bei 0x1c00 ein Bootloader liegt, Lässt
> sich auch von weniger geübten Assembler-Programmierern durch einen
> scharfen Blick auf den disassemblierten Code beantworten.

Jop, das denke ich auch!

von holger (Gast)


Lesenswert?

>Hab ich; und so komplex ist die Beschaltung auch nicht. Ein bisschen
>PWM, USART ein Paar Taster + Leds.

Dann kann man das Programm auch neu schreiben.
Wird weniger Zeit benötigen als der Hirnpfurz den
du da gerade hast.

von Patrick L. (crashdemon)


Lesenswert?

holger schrieb:
> Dann kann man das Programm auch neu schreiben.
> Wird weniger Zeit benötigen als der Hirnpfurz den
> du da gerade hast.

Darum geht es ja gar nicht. Es geht um die Herausforderung möglichst 
viel über den Code herauszufinden. Seh es als eine akademische Aufgabe 
an!

von holger (Gast)


Lesenswert?

>Darum geht es ja gar nicht. Es geht um die Herausforderung möglichst
>viel über den Code herauszufinden. Seh es als eine akademische Aufgabe
>an!

Dummerweise hast du von tuten und blasen keine Ahnung.
Das wird also nix.

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Beitrag "Re: Gerät mit AT90S4414 retten"
da wird ein Beispiel gezeigt, wie so ein re-assemblierter Text aussieht

Das Programm heisst ReAVR von Johannes Assenbaum, ist leider nur noch 
auf einer wenig vertrauenswürdigen Downloadseite zu finden. 3.5 war wohl 
die letzte Version.

Andere empfehlen IDA
https://www.hex-rays.com/products/ida/processors.shtml

Die Freeware-Version IDA 5.0 kann auch AVR, so steht es im Hilfetext. 
Auf der Webseite habe ich diese Info nicht gefunden, ich musste es erst 
installieren. Die Demoversion kann nur x86.

Dann hab ich noch ein Java-Programm gefunden
http://community.atmel.com/projects/simple-avr-disassembler

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Christoph K. schrieb:
> ReAVR von Johannes Assenbaum

Die Version 3.2-beta habe ich hier, funktioniert fehlerfrei. Bei Bedarf 
PM.

von Klaus (Gast)


Lesenswert?

Patrick L. schrieb:
> Klaus schrieb:
>> Naja. "Nicht besonders lesbar" dürfte - vorläufig - die Untertreibung
>> des Jahres sein.
>
> Ja gut; einfach ist es nicht gerade dass ist schon wahr.
> [...]
> Naja die Adressen der Interrupt-Vekoren sind ja zumindest schonmal fest.
> Da wird dann je nach umfang des Codes in der ISR in entsprechenden
> Funktionen gesprungen.
>
> Nach Best-Practice sollten  ISRs ja möglichst kopakt sein. Das wäre ja
> schonmal eine Stelle sein an der man ansetzen könnte, oder nicht?

Mit dem RETI-Befehl ist das Ende ohnehin einfach zu erkennen.

> Außerdem sich ja auch die Hardwareregister mit denen Komponenten
> konfiguriert werden bekannt (SPI, USART, TIMER, WD, ...). Dann weiß man
> ja schonmal grob wie Peripherie konfiguriert ist.

Das weiß man dann sogar ganz genau. Witzig wird es wenn die 
Konfiguration geändert wird.

Das sind Ansatzpunkte. Ohne Zweifel sind das nützliche Ansatzpunkte. So 
macht das jeder, der dazu Anlass hat. Bis dahin ist die Sache trivial.
Aber damit fängt der Spaß überhaupt erst an.

Ich sage ja nicht, dass es gar nicht geht oder das es extrem schwierig 
ist. Es hat eben nur seine Eigenheiten. Und mir schien, dass man 
jemanden warnen sollte, der danach fragt wie man den C-Code wieder 
herstellen kann.

Viel Erfolg.

von Lukas (Gast)


Lesenswert?

Interessanter würde ein C-Code noch, wenn das ursprüngliche Programm 
schon in Assembler geschrieben wurde.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.