2013-01-12 27 views
22

mogę zdemontować płaski plik binarny używając objdump?Demontaż płaskiej binarny plik używając objdump

jestem zaznajomiony z demontażem zorganizowanego wykonywalny binarny takiego jak plik ELF przy użyciu:

objdump -d file.elf 

Ale jeśli mam płaski plik binarny, że wiem ma być załadowany na, na przykład adresu 0xabcd1000 , czy mogę poprosić o objdump, aby go zdemontować? Próbowałem dostarczania opcji, takich jak "--start-address = 0xabcd1000", ale objdump po prostu stwierdza, że ​​nie rozpoznaje formatu.

mam inne wyobrażenia o tym, jak rozbierać plik ale chciałem wiedzieć, czy objdump może dostarczyć proste rozwiązanie.

+0

To nie jest płaski plik binarny. Wygląda na to, że to plik ELF. – Calmarius

+0

W powyższym przykładzie wspomniałem o pliku ELF (file.elf), aby zilustrować, że znałem podstawowe zasady demontażu. Jednak plik, który był zainteresowany demontażem, był absolutnie płaskim plikiem binarnym. Pierwsze bajty w pliku były pierwszymi kodami do wykonania. Nie było nagłówka. –

+0

Możliwy duplikat [Jak mogę zdekompresować surowy kod x86?] (Http://stackoverflow.com/questions/1737095/how-do-i-disassemble-raw-x86-code) –

Odpowiedz

25

Znalazłem rozwiązanie mojego własnego pytanie na innym forum. Wygląda to mniej więcej tak:

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

Przetestowałem to i to działa.

+11

Zwroty nie mogą być demontowane dla architektury nieznanej ! Wygląda na to, że przegapiłeś opcję maszyny '-m i386' w moim przypadku – TheEnglishMe

+1

Dzięki za ten połów. Podejrzewam, że to dlatego, że standardowy obiekt objdump w systemie Linux/x86 obsługuje 2 architektury. Kiedy go uruchomiłem, użyłem wersji, która dotyczyła tylko jednego łuku (SH-4 w moim przypadku). –

+1

i można pominąć --adjust-vma = 0xabcd1000 –

-5

Nie, nie można, jeśli nie można go przenieść, np. Jeśli zawiera "ljmp" (lub "jmp far [addr]") OPCODE.

7

starbluehlovdal i oba mają części odpowiedź kanonicznej. Jeśli chcesz zdemontować surowy kod i8086, zwykle chcesz składni Intela, a nie na & składni T, zbyt, więc używać:

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 

Jeśli kod jest ELF (lub a.out (lub (E) COFF)), można użyć krótki formularz:

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

Dla 32-bitowego lub 64-bitowego kodu, należy pominąć ,8086; Nagłówek ELF zawiera już te informacje.

ndisasm, jak sugeruje jameslin, to również dobry wybór, ale objdump zazwyczaj pochodzi z systemu operacyjnego i może poradzić sobie z wszystkich architekturach wspieranych przez binutils GNU (rozszerzeniem tych wspieranych przez GCC), a jego wyjście można zazwyczaj karmione na GNU as (ndisasm może oczywiście być podany oczywiście pod nasm).

Peter Cordes sugeruje, że "Agner Fog's objconv jest bardzo ładne. Nakłada etykiety na rozgałęzione cele, znacznie ułatwiając zrozumienie kodu. Można go zdemontować w NASM, yasm, MASM, albo & składni T (GNU) „

Multimedia Mike już dowiedział się o --adjust-vma.; odpowiednik ndisasm jest opcją -o.

Aby zdemontować, powiedzmy, kod sh4 (użyłem jeden plik binarny z Debiana do testowania), użyj tego z binutils GNU (prawie wszystkie inne deasembler są ograniczone do jednej platformy, takie jak x86 z ndisasm i objconv):

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

-m jest maszyna, a -EL oznacza little endian (dla sh4eb użytku -EB zamiast), co jest istotne dla architektur, które istnieją w każdej bajt.

+0

A może chcesz wykonać kod SH-4? –