2013-01-12 23 views
22

Posso disassemblare un file binario piatto usando objdump?Disassemblaggio di un file binario piatto utilizzando objdump

ho familiarità con lo smontaggio di un binario eseguibile strutturato come un file ELF utilizzando:

objdump -d file.elf 

Ma se ho un file binario piatta che so dovrebbe essere caricato in, ad esempio, l'indirizzo 0xabcd1000 , posso chiedere a objdump di smontarlo? Ho provato a fornire opzioni come "--start-address = 0xabcd1000" ma objdump afferma solo che non riconosce il formato.

Ho altre idee su come smontare il file ma volevo sapere se objdump potesse fornire una soluzione semplice.

+0

Questo non è un file binario piatto. Sembra che sia un file ELF. – Calmarius

+0

Nell'esempio sopra, ho menzionato un file ELF (file.elf) per illustrare che avevo familiarità con i principi di base del disassemblaggio. Tuttavia, il file che mi interessava smontare era assolutamente un file binario piatto. I primi byte nel file erano i primi opcode che venivano eseguiti. Non c'era l'intestazione. –

+0

Possibile duplicato di [Come faccio a disassemblare codice x86 grezzo?] (Http://stackoverflow.com/questions/1737095/how-do-i-disassemble-raw-x86-code) –

risposta

25

Ho trovato la soluzione alla mia domanda su un forum diverso. Assomiglia a questo:

objdump -b binary --adjust-vma=0xabcd1000 -D file.bin 

Ho provato questo e funziona.

+11

i resi non possono essere disassemblati per architettura sconosciuta ! sembra che tu abbia perso l'opzione della macchina '-m i386' nel mio caso – TheEnglishMe

+1

Grazie per quella presa. Sospetto che sia perché un oggetto objdump standard in linux/x86 land gestisce 2 architetture. Quando l'ho eseguito, ho usato una versione che si occupava solo di un arco (SH-4 nel mio caso). –

+1

e puoi omettere --adjust-vma = 0xabcd1000 –

-5

No, non è possibile se non è rilocabile, come se contenga un codice "ljmp" (o un "jmp lontano [addr]") OPCODE.

7

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. Si può smontare in NASM, yasm, MASM, o AT & T sintassi (GNU) “

Multimedia Mike già scoperto circa --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.

+0

Che ne dici se vuoi fare il codice SH-4? –