webentwicklung-frage-antwort-db.com.de

Zerlegen einer flachen Binärdatei mit objdump

Kann ich eine flache Binärdatei mit objdump zerlegen?

Ich bin vertraut mit dem Disassemblieren einer strukturierten ausführbaren Binärdatei wie einer ELF-Datei unter Verwendung von:

objdump -d file.elf

Aber wenn ich eine flache Binärdatei habe, von der ich weiß, dass sie unter der Adresse 0xabcd1000 geladen werden soll, kann ich objdump bitten, sie zu disassemblieren? Ich habe versucht, Optionen wie '--start-address = 0xabcd1000' anzugeben, aber objdump gibt nur an, dass es das Format nicht erkennt.

Ich habe andere Ideen, wie man die Datei zerlegt, aber ich wollte wissen, ob objdump eine einfache Lösung bieten könnte.

29
Multimedia Mike

Ich habe die Lösung für meine eigene Frage in einem anderen Forum gefunden. Es sieht ungefähr so ​​aus:

objdump -b binary --adjust-vma=0xabcd1000 -D file.bin

Ich habe das getestet und es funktioniert.

36
Multimedia Mike

starblue und hlovdal haben beide Teile der kanonischen Antwort. Wenn Sie unformatierten i8086-Code zerlegen möchten, benötigen Sie normalerweise die Intel-Syntax und nicht die AT & T-Syntax. Verwenden Sie dazu Folgendes:

objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin    # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin  # for 64-bit code

Wenn Ihr Code ELF (oder a.out (oder (E) COFF)) ist, können Sie die Kurzform verwenden:

objdump -D -Mintel,i8086 a.out  # disassembles the entire file
objdump -d -Mintel,i8086 a.out  # disassembles only code sections

Lassen Sie für 32-Bit- oder 64-Bit-Code das ,8086; Der ELF-Header enthält diese Informationen bereits.

ndisasm, wie von jameslin vorgeschlagen, ist ebenfalls eine gute Wahl, aber objdump wird normalerweise mit dem Betriebssystem geliefert und kann mit allen von GNU binutils (Obermenge der von GCC unterstützten), und seine Ausgabe kann normalerweise in GNU as eingegeben werden (ndisasm's können normalerweise in nasm aber natürlich).

Peter Cordes schlägt vor, dass Agner Fog's objconv sehr nett ist. Hiermit werden Labels auf Zweigzielen platziert, was es viel einfacher macht, herauszufinden, was der Code bewirkt. Es kann in NASM-, YASM-, MASM- oder AT & T (GNU) -Syntax zerlegt werden. “

Multimedia Mike bereits über --adjust-vma Erfahren; Das Äquivalent zu ndisasm ist die Option -o.

Um beispielsweise sh4 - Code zu disassemblieren (ich habe eine Binärdatei von Debian zum Testen verwendet), verwenden Sie diese mit GNU binutils (fast alle anderen Disassembler sind auf eine Plattform beschränkt, wie z x86 mit ndisasm und objconv):

objdump -D -b binary -m sh -EL x

Der -m Ist die Maschine, und -EL Bedeutet Little Endian (für sh4eb Verwenden Sie stattdessen -EB), Was für Architekturen relevant ist, die in beiden Endianen existieren.

17
mirabilos