Antworten:
Sie können objdump verwenden. Nach diesem Artikel lautet die Syntax:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
--target
statt -b
. -D
ist "den Inhalt aller Abschnitte zerlegen"; -b bfdname
oder --target=bfdname
erzwingt das Lesen als angegebenes Objektcode-Format (in unserem Fall nicht elf, sondern rohe Binärdatei); -m machine
gibt die zu verwendende Architektur an (in unserer Datei gibt es keinen Header mit Arch-Informationen). -M options
sind Optionen des Disassemblers; addr16,data16
werden verwendet, um "die Standardadressgröße und die Operandengröße anzugeben" (behandeln Sie den Code als i8086 in der universellen x86-Disasm-Engine)
Das GNU-Tool heißt beispielsweise objdump :
objdump -D -b binary -m i8086 <file>
-m i386
oder -Mintel,x86-64
. i8086
ist eine alte Architektur und die Verwendung für modernen Code kann zu unerwarteten Ergebnissen führen. Darüber hinaus ist es heutzutage möglicherweise eine gute Idee , auf anzugeben x86-64
, -M
da viele Computer 64-Bit-Computer sind. Vorbei intel
an -M
Änderungen der Syntax zu Intel-Stil anstelle der Standard - AT & T - Stil, die Sie kann oder auch nicht.
Ich mag ndisasm
zu diesem Zweck. Es wird mit dem NASM-Assembler geliefert, der kostenlos und Open Source ist und in den Paket-Repositorys der meisten Linux-Distributionen enthalten ist.
ndisasm -b16 -o7c00h -a -s7c3eh mbr
Erklärung - von der ndisasm-Manpage
-b
= Gibt den 16-, 32- oder 64-Bit-Modus an. Der Standardwert ist der 16-Bit-Modus.-o
= Gibt die fiktive Ladeadresse für die Datei an. Diese Option bewirkt, dass ndisasm die aufgelisteten Adressen am linken Rand und die Zieladressen von PC-relativen Sprüngen und Aufrufen rechts abruft.-a
= Aktiviert den automatischen (oder intelligenten) Synchronisationsmodus, in dem ndisasm versucht, zu erraten, wo die Synchronisation durchgeführt werden soll, indem die Zieladressen der relativen Sprünge untersucht und zerlegt werden.-s
= Gibt manuell eine Synchronisationsadresse an, sodass ndisasm keinen Maschinenbefehl ausgibt, der Bytes auf beiden Seiten der Adresse umfasst. Daher wird der Befehl, der an dieser Adresse beginnt, korrekt zerlegt.mbr
= Die zu zerlegende Datei.-b specifies 16-, 32- or 64-bit mode. The default is 16-bit mode.
-o is the notional load address for the file. This option causes ndisasm to get the addresses it lists down the left hand margin, and the target addresses of PC-relative jumps and calls, right.
-s specifies a synchronisation address, such that ndisasm will not output any machine instruction which encompasses bytes on both sides of the address. Hence the instruction which starts at that address will be correctly disassembled.
starblue und hlovdal haben beide Teile der kanonischen Antwort. Wenn Sie rohen i8086-Code zerlegen möchten, möchten Sie normalerweise die Intel-Syntax und nicht auch die AT & T-Syntax. Verwenden Sie daher:
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, wird jedoch objdump
normalerweise mit dem Betriebssystem geliefert und kann mit allen Architekturen umgehen, die von GNU-Binutils unterstützt werden (Obermenge der von GCC unterstützten Architekturen), und seine Ausgabe kann normalerweise in GNU eingespeist werden as
(ndisasm's können normalerweise nasm
natürlich eingespeist werden ).
Peter Cordes schlägt vor: „ Das Objekt von Agner Fog ist sehr schön. Es bringt Beschriftungen auf Verzweigungsziele, wodurch es viel einfacher wird, herauszufinden, was der Code tut. Es kann in NASM-, YASM-, MASM- oder AT & T-Syntax (GNU) zerlegt werden. “
Multimedia Mike hat bereits davon erfahren --adjust-vma
; das ndisasm
Äquivalent ist das-o
Option.
sh4
Verwenden Sie dies zum Zerlegen von Code (ich habe zum Testen eine Binärdatei von Debian verwendet) mit GNU-Binutils (fast alle anderen Disassembler sind auf eine Plattform beschränkt, z. B. x86 mit ndisasm
und objconv
):
objdump -D -b binary -m sh -EL x
Das -m
ist die Maschine, und -EL
bedeutet Little Endian (für den sh4eb
Einsatz -EB
statt), die für die Architekturen von Bedeutung ist , die in beiden endianness existieren.
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
, da ich normalerweise versuche, die C-Quelle so zu optimieren, dass sie zu einem guten asm kompiliert.