webentwicklung-frage-antwort-db.com.de

Wie zerlege ich rohen 16-Bit-x86-Maschinencode?

Ich möchte den MBR (die ersten 512 Byte) einer bootfähigen x86-Festplatte, die ich habe, zerlegen. Ich habe den MBR mit in eine Datei kopiert

dd if=/dev/my-device of=mbr bs=512 count=1

Irgendwelche Vorschläge für ein Linux-Dienstprogramm, das die Datei mbr disassemblieren kann?

86
sigjuice

Sie können objdump verwenden. Laut dieser Artikel lautet die Syntax:

objdump -D -b binary -mi386 -Maddr16,data16 mbr
100
hlovdal

Das GNU Tool heißt objdump, zum Beispiel:

objdump -D -b binary -m i8086 <file>
26
starblue

Ich mag ndisasm für diesen 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.

20
asveikau
ndisasm -b16 -o7c00h -a -s7c3eh mbr

Erklärung - von der ndisasm-Manpage

  • -b = Gibt den 16-, 32- oder 64-Bit-Modus an. Der Standard ist der 16-Bit-Modus.
  • -o = Gibt die fiktive Ladeadresse für die Datei an. Diese Option bewirkt, dass ndisasm die Adressen abruft, die am linken Rand aufgelistet sind, und die Zieladressen von PC-bezogenen Sprüngen und Aufrufen (rechts).
  • -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 "disassembliert" aufgerufen werden.
  • -s = Gibt manuell eine Synchronisationsadresse an, sodass ndisasm keine Maschinenanweisungen ausgibt, die Bytes auf beiden Seiten der Adresse enthalten. Daher wird der Befehl, der an dieser Adresse beginnt, korrekt zerlegt.
  • mbr = Die zu disassemblierende Datei.
19
jameslin

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

12
mirabilos

Versuchen Sie diesen Befehl:

Sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
7
Jason