Assembler aus Hex-Dump

OP #4411420
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)
Gast #4411517
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.
Gast #4411522
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. :-)
OP #4411533
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.
OP #4411541
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
Gast #4411554
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.
OP #4411566
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!
Gast #4411635
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.
Gast #4411652
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.
#4411683
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
Angehängte Dateien:
Gast #4411770
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.

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