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.
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.
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.