Forum: Mikrocontroller und Digitale Elektronik Wie finde ich mit IDA die Stelle im Code von der aus auf einen String zugegriffen wird?


von Olli Z. (z80freak)


Lesenswert?

Ich versuche gerade mit IDA ein Programm welches auf einem ARM Prozessor 
läuft und mal in C geschrieben wurde zu analysieren. Das Programm 
befindet sich in einem Flash-Speicher und ich habe das Image davon als 
Datei vorliegen. Ich habe keinen Quellcode, muss also disassemblieren.

In diesem Image finde ich am Ende jede Menge C-Strings. Diese müssen ja 
im Programm irgendwie "verwendet" werden, sprich irgendwo und irgendwann 
wird eine Routine einen Zeiger auf einen dieser Strings setzen und eine 
Unterroutine zum anzeigen bzw. ausgeben dieses Textes aufrufen.

Meine Frage wäre nun, mit welchen Methoden ich das rausbekommen kann wo 
im Programmcode dies geschieht. Grundsätzlich hätte ich auch die 
Möglichkeit das Gerät mit einem Segger-JTAG Debugger laufen zu lassen, 
aber ein Breakpoint wird mir da wohl nicht helfen, da dort ja kein Code 
ausgeführt wird, sondern nur über Speicherbefehle drauf zugegriffen.

Die Idee die ich damit verfolge ist, einen Einstiegspunkt für die 
Analyse des Programmcodes zu haben um von einer Meldung welche ich am 
Bildschirm des Gerätes sehe, rückwärts zum Aufrufstack und damit der 
Funktionsweise des Programms zu kommen.

von des Ass, embler (Gast)


Lesenswert?

Brain v1.0 sollte dafür reichen, auch ohne Patches.

von Bernd K. (prof7bit)


Lesenswert?

Schreib doch einfach mal Code der sowas macht und schau Dir das Kompilat 
an, dann siehst Du wie er üblicherweise 32-Bit Konstanten in Register 
lädt und wonach Du dann suchen musst.

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Hast du Flirt Tabellen für die diversen Arm Compiler? Wenn ja lass die 
einfach mal darüber laufen. Mit etwas Glück kannst du dann Runtime 
Module des Compilers identifizieren.
Der Low Level Weg:
Hexsuche mit den Adressen der Strings. Danach Zurückarbeiten bis du die 
Ausgabe Funktion gefunden hast. Falls du den Decompiler besitzt ist der 
auch einen Versuch wert. Letztendlich ist aber Brain angesagt. Am Anfang 
ist das ja eine reine Codewüste. Gut geeignet wäre auch wenn die Ausgabe 
auf einer ser. Schnittstelle erfolgt erst mal dort mit der Suche zu 
beginnen.

Thomas

von Olli Z. (z80freak)


Lesenswert?

Was bitte sind "Flirt Tabellen" und wo findet man die?
Ja, das mit der Codewüste stimmt wohl. Mein erster Ansatz da 
durchzusteigen war einen Entrypoint zu finden. Ich weiss ja zumindest 
was für eine ARM Architektur in welcher Endianess das ausführt. So kann 
man wenigstens einen guten Teil der Bytematsche als Programmcode 
identifizieren.

Aber selbst wenn man weiss das dort Daten liegen ist es deren Struktur 
auch mit viel "Brain" nicht immer ermittelbar. Es ist ja nicht immer so 
einfach wie bei C-Strings.

Aufschluß darüber würde nur eine "Sichtung" des Programmcodes der diese 
Strukturen behandelt liefern. Aber da wären wir wieder beim 
Einstiegsproblem "wie finde ich den behandelnden Code?"

Die Daten folgen ganz sicher immer irgendwelchen Struct-Anweisungen des 
Quellcodes, oder eben vorgegebenen, Datentypspezifischen Aufbauten. Da 
gilt es dann auch den Startpunkt der Daten zu finden. Mutmaßlich wird 
irgendwo eine Mappingtabelle liegen welche aus Zeigern auf die einzelnen 
Datensätze besteht. Mit viel Glück liegt diese Tabelle direkt vor den 
Datensätzen, muss aber nicht.

Mein Versuch war nun das an gaaanz einfachen Datentypen, wie z.b, dem 
C-String zu untersuchen. Also einen String finden und dessen 
Startadresse dann als Bytewert suchen. Hat aber nichts gebracht. Die 
Frage die ich mir stelle ist ob man überhaupt absolute Zeiger erwarten 
sollte? Oder ob da nicht eher mit Offsets gearbeitet wird, denn mit 
absoluten Zeigern wäre der Code nicht realloziierbar. Ok, muss er 
vielleicht auch nicht... schwierig.

von Uwe (Gast)


Lesenswert?

ARM Architektur benutzt normalerweise Offsets für Konstanten... auch für 
strings...
Guck doch mal ob dein Debugmodul im ARM Watchpoints unterstützt... 
welcher µC oder Prozessor oder SOC ist es denn?

von Georg (Gast)


Lesenswert?

Olli Z. schrieb:
> Die
> Frage die ich mir stelle ist ob man überhaupt absolute Zeiger erwarten
> sollte?

Da gibt es viel zu viele Adressiermöglichkeiten. Z.B. kann die 
Basisadresse der Daten in irgendeinem Register stehen und der Offset zum 
String woanders - nur eine von vielen Möglichkeiten. Man kann Binärwerte 
suchen aber nicht alle möglichen Summen von Binärwerten.

Ein erfahrener Programmierer (Assembler UND C) kann natürlich alles 
disassemblieren und dann zu verstehen versuchen, das ist aber sehr 
mühsam.

Eine realistische Möglichkeit: mit einem Logikanalysator (einem 
richtigen, nicht ein USB-Modul aus China) auf die Stringadresse triggern 
und die gespeicherten 1000 zuvor ausgeführten Befehle zu untersuchen. 
Habe ich vor Jahren genacht, also Trigger auf Datenadresse und vorher 
ausgeführtes Programm aufzeichnen.

Georg

von Bauform B. (bauformb)


Lesenswert?

Olli Z. schrieb:
> Grundsätzlich hätte ich auch die
> Möglichkeit das Gerät mit einem Segger-JTAG Debugger laufen zu lassen,
> aber ein Breakpoint wird mir da wohl nicht helfen, da dort ja kein Code
> ausgeführt wird, sondern nur über Speicherbefehle drauf zugegriffen.

Manche CPUs können per Hardware einen Breakpoint auf Daten setzen (Data 
Watchpoint and Trace Unit); Segger sollte das unterstützen.

von Thomas Z. (usbman)


Lesenswert?

Welche IDA Version hast du den? Flirt Tabellen sind Pattern Listen um 
Runtime Bibliotheken im binary zu erkennen. Es sind Tools bei IDA dabei 
womit man diese erstellen kann, IDA liefert auch ein paar gängige mit. 
Das funktioniert mehr oder weniger gut.
Wie man startet hängt sehr von den Infos ab die du hast generell ist es 
z.b eine gute Idee als erstes alle Hardware Register mit sinnvollen 
Namen zu ersetzen. Danach startup und Main identifizieren. Ein weiterer 
Schritt ist dann die Interrupt Funktionen anzusehen.
Flirt funktioniert bei x86 exe Files ganz gut. Wie das bei ARM ist kann 
ich nicht sagen. Für Keil C51 hab ich mir die Flirt Tabellen selbst 
gebaut. Besitzt du das Decompiler Modul um Psydo C zu generieren?

Literaturhinweis falls du sowas öfters machst:
The IDA Pro book von Chris Eagle gibt's in Online-Bibliotheken und bei 
Amazon.

Thomas

von Markus M. (adrock)


Lesenswert?

Wenn es ARM und evtl. Thumb2 Befehlssatz ist, ist die Wahrscheinlichkeit 
groß, dass es relativ oder über irgendeine Adresstabelle adressiert 
wird.

Falls relativ adressiert müsste der Disassembler ja dafür ein Label 
anlegen nach dem Du dann auch suchen kannst. Voruassetzung ist 
natürlich, das Du schon den ganzen Code als solchen identifiziert hast 
und keine undefinierten "Blobs" mehr im Disassembler Output hast.

Falls Adresstabelle, müsstest Du dann nach der Adresse in den Daten 
suchen.

Also nehmen wir an der Text steht an Adresse 0x00123456, müsstest Du mal 
den ganzen Dump nach eben 0x00123456 durchsuchen, evtl. noch swappen wg. 
little/big endian.

Kenne mich aber mit ARM auf ASM Ebene nicht wirklich gut aus...

: Bearbeitet durch User
von . . (Gast)


Lesenswert?

Wenn Du das Ding mit IDA disassembiert bekommen hast, dann suchst Du im 
Fenster "IDA-View" den String. Wenn Du Glück hast, und IDA das Zeug 
korrekt zugeordnet hat, dann ist vor dem String ein Label (symbolischer 
Name einer Adresse). Geh mit der Maus drauf, drück x-Taste (oder rechte 
Maustaste und "Jump to xref to operant..." wählen) und es wird sich ein 
Fenstern mit den Adressen im Code öffnen, die dieses Label verwenden.

von Olli Z. (z80freak)


Angehängte Dateien:

Lesenswert?

Danke erstmal für die vielen tollen Tipps und Hinweise! Ich kann mich 
garnicht bei allen einzeln bedanken, daher seht mir nach das ich es 
"global" mache :-)

Ich habe das Image nochmal durchforstet und noch etliche Stellen, die 
ich anfangs für Daten hielt in Programmcode umgewandelt. Nun hatte der 
String, welchen ich gesucht habe (siehe "lookup_string.png") plötzlich 
wie beschrieben von IDA Pro ein Label erhalten! (siehe "label.png")

Darauf konnte ich jetzt ein xrefto (X) machen (siehe "xrefto.png") und 
diesem zur Codestelle (siehe "usage.png") folgen:

Dort lese ich (als ARM Assembler Anfänger) heraus (habs unter der Zeile 
mit Hash kommentiert):
1
ROM:0026A72E loc_26A72E                              ; CODE XREF: ROM:0026A722↑j
2
ROM:0026A72E                 LDR     R0, [SP,#0x44]
3
# Lade den aktuellen Wert des Stackpointers + 0x44 in das Register R0
4
5
ROM:0026A730                 ADR     R1, aFgsDnl     ; "/fgs.dnl"
6
# Lade Register R1 mit dem relativen Offset zum Label 'aFgsDnl'
7
# Da das nächste Kommando nur zwei Byte entfernt ist, muss es sich hier also um einen 16-Bit Thumb-Code handeln. Daher kann der Offset auf das Label maximal 1020 Byte entfernt von dieser Adresse sein.
8
# Und in der Tat liegt das Label auf 0x0026A8D4 und das sind 420 Byte weiter :-)
9
10
ROM:0026A732                 BL      sub_22D484
11
# Aufruf einer Subroutine, die am Ende mit BX LR wieder hier hin zurückkehrt. LR wurde for dem Branch dahin mit der Adresse des nächsten Kommandos geladen (weil ARM ja sowas wie ein RET nicht kennt...)
12
13
ROM:0026A736                 ADDS    R7, #1
14
# Addiere dem Register R7 den Wert 1 hinzu und aktualisiere die Flags
15
16
ROM:0026A738                 BNE     loc_26A73C
17
# Ist das Ergebnis der obigen Addition ungerade (NE) dann springe hier hin...
18
19
ROM:0026A73A                 B       loc_26A5A4
20
# Ansonsten geht es hier weiter...

von Olli Z. (z80freak)


Lesenswert?

P.S. Ich wollte nur mal etwas mehr in IDA reinschnüffeln, aber ich sehe 
schon das man sich damit deutlich mehr beschäftigen muss... daher werde 
ich mir mal o.g. Buch zulegen (als Kindle Download) und versuchen damit 
etwas schlauer und versierter im Umgang mit dem Tool zu werden.

von Toma T. (tomy75)


Lesenswert?

Hello Olli z.

I need source code  in C+from FW files Ford convers+
I have IDA

Can you help me please?

Thenx

Tom

von Kaj (Gast)


Lesenswert?


von Bernd K. (prof7bit)


Lesenswert?

Kaj schrieb:
> Du kannst dir auch mal Ghidra angucken:
> https://ghidra-sre.org/

Unter welchem Stein habe ich nur die letzte Zeit gelebt daß mir das 
entgangen ist? Dieses Tool ist ja der Hammer! Danke für den Tipp!

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

Bernd K. schrieb:
> Unter welchem Stein habe ich nur die letzte Zeit gelebt daß mir das
> entgangen ist?
Wenn man nicht gerade 24/7 zig Security-Ticker suchtet, kann einem das 
schon entgehen. :D

von Olli Z. (z80freak)


Lesenswert?

In der Tat ist das ein richtig interessantes Tool und eine echte 
Alternative zum recht hochpreisigen IDA. Muss ich mir bei Gelegenheit 
mal anschauen.

von Bernd K. (prof7bit)


Lesenswert?

Ob der Name "Ghidra" (und auch das Logo) wohl etwas mit dem 3-köpfigen 
Drachen und Übermonster King Ghidorah (Ghidrah, Ghidora, Greater Hydra, 
etc...) der elektromagnetische Entladungen speit (hier Einsen und 
Nullen) und dem abgeschlagene Köpfe nachwachsen(!), bekannt aus Godzilla 
und anderer Fantasy-Nerd-Literatur (D&D?) zu tun hat? Ist es generell in 
der NSA gepflegte Symbolik sich mit der archaischen Übermacht von 
unverwundbaren martialischen Übergöttern zu umgeben, sich derer zu 
bedienen oder gar sich mit ihnen gleichzusetzen? Immerhin verkörpert 
speziell dieses Fabelwesen das Böse in seiner reinsten und mächtigsten 
Form!

: Bearbeitet durch User
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.