2009-11-15 19 views
74

Vorrei smontare l'MBR (primi 512 byte) di un disco x86 avviabile che ho. Ho copiato il MBR in un file utilizzandoCome si disassembla codice x86 grezzo?

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

Qualche suggerimento per un programma di utilità Linux che può smontare il file mbr?

risposta

89

È possibile utilizzare objdump. Secondo this article la sintassi è:

objdump -D -b binary -mi386 -Maddr16,data16 mbr 
+0

puoi spiegare quali sono le opzioni specificate? – Hawken

+10

o '--target' invece di' -b'. '-D' è" smontare il contenuto di tutte le sezioni "; '-b bfdname' o' --target = bfdname' imporrà la lettura come formato oggetto-codice specificato (non elf ma raw binary nel nostro caso); '-m machine' specificherà l'architettura da usare (nel nostro file non c'è un'intestazione con informazioni arch). '-M options' sono opzioni del disassemblatore; 'addr16, data16' sono usati per" specificare la dimensione dell'indirizzo e la dimensione dell'operando di default "(trattare il codice come i8086 nel motore di disaster universale x86) – osgx

18

mi piace ndisasm per questo scopo. Viene fornito con l'assemblatore NASM, che è gratuito e open source e incluso nei repository di pacchetti della maggior parte delle distro di Linux.

+0

Mi piace questa risposta meglio. Più facile da usare, e potrei installare nasm su OS X - objdump non c'era, e non voglio costruirlo dal sorgente. –

+0

@ H2CO3 Il NASM di solito è preinstallato su OS-X ... – Hawken

26

Lo strumento GNU si chiama objdump, ad esempio:

objdump -D -b binary -m i8086 <file> 
+0

È inoltre possibile impostare diverse opzioni per l'architettura e la sintassi. Ad esempio, '-m i386' o' -Mintel, x86-64'. 'i8086' è una vecchia architettura e usarlo per il codice moderno può dare risultati inaspettati. Inoltre, specificare 'x86-64' a' -M' potrebbe essere una buona idea al giorno d'oggi dal momento che molte macchine sono a 64-bit. Passare 'intel' a' -M' cambia la sintassi in stile Intel invece dello stile AT & T predefinito, che potresti o non vorresti. – GDP2

7

sudo dd if =/dev/sda bs = 512 count = 1 | NDISASM -b16 -o7c00h -

16
ndisasm -b16 -o7c00h -a -s7c3eh mbr 

Spiegazione - da NDISASM pagina di manuale

  • -b = Specifica 16-, la modalità a 32 o 64 bit. L'impostazione predefinita è la modalità a 16 bit.
  • -o = Specifica l'indirizzo di caricamento teorico per il file. Questa opzione fa sì che ndisasm per ottenere gli indirizzi che elenca il margine sinistro e gli indirizzi di destinazione di salti e chiamate relativi al PC, giusto.
  • -a = Abilita la modalità di sincronizzazione automatica (o intelligente), in cui ndisasm tenta di indovinare dove deve essere eseguita la sincronizzazione, esaminando gli indirizzi di destinazione dei salti relativi e chiamandola smonta.
  • -s = Specifica manualmente un indirizzo di sincronizzazione, in modo tale che ndisasm non genererà alcuna istruzione di macchina che comprende byte su entrambi i lati dell'indirizzo. Quindi l'istruzione che inizia a quell'indirizzo sarà correttamente smontata.
  • mbr = Il file da smontare.
+0

cosa fa questo rispetto al semplice ndisasm? Puoi spiegare le opzioni – Hawken

+4

Puoi spiegare cosa significano e cosa fanno queste opzioni? Capire una risposta è meglio che ottenerne una. – ArtB

+0

'-b specifica la modalità a 16, 32 o 64 bit. L'impostazione predefinita è la modalità a 16 bit. '-o è l'indirizzo di carico teorico per il file. Questa opzione induce ndisasm per ottenere gli indirizzi che elenca lungo il margine sinistro e gli indirizzi di destinazione di salti e chiamate relativi al PC, . '' S specifica un indirizzo di sincronizzazione, in modo che ndisasm non restituisca alcun output istruzione macchina che comprende i byte su entrambi i lati dell'indirizzo. Quindi l'istruzione che inizia a quell'indirizzo sarà correttamente smontata. –

8

starblue e hlovdal entrambi hanno parti della risposta canonica. Se si vuole disassemblare codice i8086 cruda, di solito si vuole sintassi Intel, non AT & sintassi T, anche, in modo da utilizzare:

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 codice è ELF (o a.out (o (E) COFF)), è possibile utilizzare il formato breve:

objdump -D -Mintel,i8086 a.out # disassembles the entire file 
objdump -d -Mintel,i8086 a.out # disassembles only code sections 

per 32-bit o 64-bit di codice, omettere il ,8086; l'intestazione ELF include già queste informazioni.

ndisasm, come suggerito da jameslin, è anche una buona scelta, ma objdump solito viene fornito con il sistema operativo e possono trattare tutte le architetture supportate da binutils GNU (sovrainsieme di quelli supportati da GCC), e la sua uscita può generalmente essere alimentato in GNU as (i ndisasm possono solitamente essere inseriti nello nasm, naturalmente).

Peter Cordes suggerisce che "Agner Fog's objconv è molto bello. Mette le etichette sugli obiettivi delle filiali, rendendo molto più facile capire cosa fa il codice. Può essere smontato in sintassi NASM, YASM, MASM o AT & T (GNU). "

Multimedia Mike già rilevato su --adjust-vma; l'equivalente ndisasm è l'opzione -o.

Per smontare, per esempio, sh4 codice (ho usato uno binario da Debian da testare), utilizzare questo con binutils GNU (quasi tutti gli altri disassemblatori sono limitate ad una piattaforma, come x86 con ndisasm e objconv):

objdump -D -b binary -m sh -EL x 

il -m è la macchina, e mezzi -EL Little Endian (per sh4eb uso -EB invece), che è rilevante per le architetture che esistono in entrambi endianness.

+2

[L'objconv di Agner Fog] (http://agner.org/optimize/) è molto bello. Mette le etichette sugli obiettivi * del ramo *, rendendo molto più facile capire cosa fa il codice. Può essere smontato in sintassi NASM, YASM, MASM o AT & T (GNU). –

+0

Per me è stato ben realizzato appena uscito dalla scatola su GNU/Linux. Ma sì, è solo x86/x86-64, a differenza dei binutils GNU. Tuttavia, ha molti bei suggerimenti specifici per x86 che aggiunge come commenti, come quando un prefisso dimensione operando può causare uno stallo LCP nei decodificatori di una CPU Intel. Con tutti i mezzi, menzionarlo nella risposta. Uno degli scopi principali dei commenti è quello di aiutare il poster a migliorare la propria risposta, non solo come qualcosa che anche gli spettatori successivi devono leggere. –

+1

@PeterCordes Sì, ho MirBSD come sistema operativo principale;) – mirabilos