Come faccio a smontare il codice macchina x86 a 16 bit non elaborato?


91

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:


109

Puoi usare objdump. Secondo questo articolo la sintassi è:

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

puoi spiegare cosa fanno le opzioni che specifichi?
Hawken

11
o --targetinvece di -b. -Dè "smontare il contenuto di tutte le sezioni"; -b bfdnameo --target=bfdnameforzerà la lettura come formato di codice oggetto specificato (non elf ma binario grezzo nel nostro caso); -m machinespecificherà l'architettura da usare (nel nostro file non c'è intestazione con info sull'arco). -M optionssono opzioni di disassemblatore; addr16,data16sono utilizzati per "specificare la dimensione dell'indirizzo predefinito e la dimensione dell'operando" (trattare il codice come uno i8086 nel motore disasm universale x86)
osgx

29

Lo strumento GNU si chiama objdump , ad esempio:

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

È inoltre possibile impostare diverse opzioni per l'architettura e la sintassi. Ad esempio, -m i386o -Mintel,x86-64. i8086è una vecchia architettura e utilizzarla per il codice moderno può produrre risultati inaspettati. Inoltre, specificare x86-64di -Mpotrebbe essere una buona idea al giorno d'oggi poiché molte macchine sono a 64 bit. Passare intela -Mmodifica la sintassi in stile Intel invece dello stile AT&T predefinito, che potresti o meno desiderare.
PIL2

24

Mi piace ndisasmper 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.


Mi piace di più questa risposta. Più facile da usare e potrei installare nasm su OS X - objdump non era presente e non voglio crearlo dal sorgente.

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

cosa fa questo in contrasto con il semplice ndisasmo? Puoi spiegare le opzioni
Hawken

4
Potresti spiegare cosa significano e fanno queste opzioni? Capire una risposta è meglio che ottenerne una.
Slitta

-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.
Janus Troelsen

15

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 objdumpsolito 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' ndisasmequivalente è l' -oopzione.

Per disassemblare, ad esempio, sh4codice (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 ndisasme objconv):

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

Il -mè la macchina e -ELsignifica Little Endian (per l' sh4ebuso al suo -EBposto), che è rilevante per le architetture che esistono in entrambe le endianness.


2
L'objconv di Agner Fog è molto carino. Mette etichette sulle destinazioni dei rami , rendendo molto più facile capire cosa fa il codice. Può essere smontato nella sintassi NASM, YASM, MASM o AT&T (GNU).
Peter Cordes

Per me è stato costruito bene, fuori dalla scatola, su GNU / Linux. Ma sì, è solo x86 / x86-64, a differenza dei binutils GNU. Tuttavia, ha molti suggerimenti specifici per x86 che aggiunge come commenti, come quando un prefisso della dimensione di un operando può causare uno stallo LCP nei decoder di una CPU Intel. In ogni caso, menzionalo nella tua risposta. Uno degli scopi principali dei commenti è aiutare il poster a migliorare la propria risposta, non solo come qualcosa che anche gli spettatori in seguito dovranno leggere.
Peter Cordes

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

@ PeterCordes ma sembra che non possa smontare i binari grezzi, vero? Ho dovuto creare file ELF minimi solo per poter inserire un sacco di istruzioni, ma forse ho perso qualche opzione?
Ruslan

1
@Ruslan: IDK, domanda interessante. Di solito uso solo objdump, o se voglio etichette di ramo 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.
Peter Cordes

9

Prova questo comando:

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.