Ich möchte den MBR (die ersten 512 Bytes) 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 zerlegen kann 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 :
quelle
-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 anzugebenx86-64
,-M
da viele Computer 64-Bit-Computer sind. Vorbeiintel
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.quelle
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.quelle
-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:
Wenn Ihr Code ELF (oder a.out (oder (E) COFF)) ist, können Sie die Kurzform verwenden:
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 jedochobjdump
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 werdenas
(ndisasm's können normalerweisenasm
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
; dasndisasm
Ä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 mitndisasm
undobjconv
):Das
-m
ist die Maschine, und-EL
bedeutet Little Endian (für densh4eb
Einsatz-EB
statt), die für die Architekturen von Bedeutung ist , die in beiden endianness existieren.quelle
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.Versuchen Sie diesen Befehl:
quelle