Vorrei smontare l'MBR (primi 512 byte) di un disco x86 avviabile che ho. Ho copiato l'MBR in un file utilizzando
dd if=/dev/my-device of=mbr bs=512 count=1
Qualche suggerimento per un'utilità Linux in grado di smontare il file mbr
?
Risposte:
Puoi usare objdump. Secondo questo articolo la sintassi è:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
--target
invece di -b
. -D
è "smontare il contenuto di tutte le sezioni"; -b bfdname
o --target=bfdname
forzerà la lettura come formato di codice oggetto specificato (non elf ma binario grezzo nel nostro caso); -m machine
specificherà l'architettura da usare (nel nostro file non c'è intestazione con info sull'arco). -M options
sono opzioni di disassemblatore; addr16,data16
sono utilizzati per "specificare la dimensione dell'indirizzo predefinito e la dimensione dell'operando" (trattare il codice come uno i8086 nel motore disasm universale x86)
Lo strumento GNU si chiama objdump , ad esempio:
objdump -D -b binary -m i8086 <file>
-m i386
o -Mintel,x86-64
. i8086
è una vecchia architettura e utilizzarla per il codice moderno può produrre risultati inaspettati. Inoltre, specificare x86-64
di -M
potrebbe essere una buona idea al giorno d'oggi poiché molte macchine sono a 64 bit. Passare intel
a -M
modifica la sintassi in stile Intel invece dello stile AT&T predefinito, che potresti o meno desiderare.
Mi piace ndisasm
per questo scopo. Viene fornito con l'assembler NASM, che è gratuito e open source e incluso nei repository dei pacchetti della maggior parte delle distribuzioni Linux.
ndisasm -b16 -o7c00h -a -s7c3eh mbr
Spiegazione - dalla pagina di manuale di ndisasm
-b
= Specifica la modalità a 16, 32 o 64 bit. L'impostazione predefinita è la modalità a 16 bit.-o
= Specifica l'indirizzo di caricamento figurativo per il file. Questa opzione fa sì che ndisasm ottenga gli indirizzi che elenca sul margine sinistro e gli indirizzi di destinazione dei salti e delle chiamate relativi al PC, a destra.-a
= Abilita la modalità di sincronizzazione automatica (o intelligente), in cui ndisasm tenterà di indovinare dove deve essere eseguita la sincronizzazione, esaminando gli indirizzi di destinazione dei relativi salti e chiamandolo disassembla.-s
= Specifica manualmente un indirizzo di sincronizzazione, in modo tale che ndisasm non restituisca alcuna istruzione della macchina che includa byte su entrambi i lati dell'indirizzo. Quindi l'istruzione che inizia a quell'indirizzo verrà correttamente smontata.mbr
= Il file da smontare.-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 e hlovdal hanno entrambi parti della risposta canonica. Se vuoi disassemblare il codice i8086 grezzo, di solito vuoi la sintassi Intel, non anche la sintassi AT&T, quindi usa:
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
Se il tuo codice è ELF (o a.out (o (E) COFF)), puoi utilizzare la forma abbreviata:
objdump -D -Mintel,i8086 a.out # disassembles the entire file
objdump -d -Mintel,i8086 a.out # disassembles only code sections
Per il codice a 32 o 64 bit, ometti il ,8086
; l'intestazione ELF include già queste informazioni.
ndisasm
, come suggerito da jameslin , è anche una buona scelta, ma di objdump
solito viene fornito con il sistema operativo e può gestire tutte le architetture supportate da GNU binutils (superset di quelle supportate da GCC), e il suo output può solitamente essere inserito in GNU as
(di solito ndisasm può essere alimentato nasm
, ovviamente).
Peter Cordes suggerisce che “ L'objconv di Agner Fog è molto carino. Mette etichette sulle destinazioni dei rami, rendendo molto più facile capire cosa fa il codice. Può essere disassemblato nella sintassi NASM, YASM, MASM o AT&T (GNU). "
Multimedia che Mike ha già scoperto --adjust-vma
; l' ndisasm
equivalente è l' -o
opzione.
Per disassemblare, ad esempio, sh4
codice (ho usato un binario da Debian per testare), usalo con binutils GNU (quasi tutti gli altri disassemblatori sono limitati a una piattaforma, come x86 con ndisasm
e objconv
):
objdump -D -b binary -m sh -EL x
Il -m
è la macchina e -EL
significa Little Endian (per l' sh4eb
uso al suo -EB
posto), che è rilevante per le architetture che esistono in entrambe le endianness.
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
, dal momento che di solito sto cercando di modificare il sorgente C per compilare in asm buono.