GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man nur den Rohinhalt eines ELF-Abschnitts extrahieren?

Ziemlich uneleganter Hack um objdump und dd :

IN_F=/bin/echo
OUT_F=./tmp1.bin
SECTION=.text

objdump -h $IN_F |
  grep $SECTION |
  awk '{print "dd if='$IN_F' of='$OUT_F' bs=1 count=$[0x" $3 "] skip=$[0x" $6 "]"}' |
  bash

Die objdump -h erzeugt eine vorhersagbare Ausgabe, die einen Abschnittsversatz in der elf-Datei enthält. Ich habe die awk gemacht um einen dd zu generieren Befehl für die Shell, seit dd unterstützt keine Hexadezimalzahlen. Und den Befehl an die Shell übergeben.

In der Vergangenheit habe ich das alles manuell gemacht, ohne Skripte zu erstellen, da es selten benötigt wird.


Verwenden Sie den -O binary Ausgabeformat:

objcopy -O binary --only-section=.text foobar.elf foobar.text

Gerade mit avr-objcopy verifiziert und .text eines AVR-ELF-Bildes Abschnitt.

Beachten Sie, dass, wenn Ihr Abschnitt, wie Tim unten betont, das ALLOC-Flag nicht hat, Sie möglicherweise --set-section-flags .text=alloc hinzufügen müssen um es extrahieren zu können.


objcopy --dump-section

Eingeführt in Binutils 2.25 und erzielt einen ähnlichen Effekt wie -O binary --only-section .

Verwendung:

objcopy --dump-section .text=output.bin input.o

https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html dokumentiert es als:

--dump-section Abschnittsname=Dateiname

Platzieren Sie den Inhalt des Abschnitts mit dem Namen Abschnittsname in der Datei Dateiname und überschreiben Sie alle Inhalte, die möglicherweise zuvor dort waren. Diese Option ist das Gegenteil von --add-section. Diese Option ähnelt der Option --only-section, außer dass sie keine formatierte Datei erstellt, sondern nur den Inhalt als rohe Binärdaten ausgibt, ohne dass Verschiebungen angewendet werden. Die Option kann mehrfach angegeben werden.

Minimales lauffähiges Beispiel

main.S

.data
    .byte 0x12, 0x34, 0x56, 0x78
.text
    .byte 0x9A, 0xBC, 0xDE, 0xF0

Zusammenbauen:

as -o main.o main.S

Daten extrahieren:

objcopy --dump-section .data=data.bin main.o
hd data.bin

Ausgabe:

00000000  12 34 56 78                                       |.4Vx|
00000004

Text extrahieren:

objcopy --dump-section .text=text.bin main.o
hd text.bin

Ausgabe:

00000000  9a bc de f0                                       |....|
00000004

Getestet in Ubuntu 18.04 amd64, Binutils 2.30.


Linux
  1. Linux-Befehl:Wie findet man nur Textdateien?

  2. Wie entpacke ich den Inhalt einer RPM?

  3. Wie extrahiert man Text mit OCR aus einem PDF unter Linux?

  4. Wie kann ich den Dateiinhalt rekursiv anzeigen?

  5. Wie kann ich den gesamten Text in einem PDF rastern?

So listen Sie den Inhalt eines Pakets in Linux auf

So zeigen Sie den Inhalt eines Archivs oder einer komprimierten Datei unter Linux an

So extrahieren Sie E-Mail-Adressen aus einer Textdatei unter Linux

So fügen Sie Text am Anfang einer Datei in Linux hinzu

So installieren Sie die neueste Version des Nano-Texteditors

So löschen Sie ausgewählten Text im vi-Editor