Разборка плоского двоичного файла с помощью objdump

Могу ли я разобрать плоский двоичный файл с помощью objdump?

Я знаком с разборкой структурированного двоичного исполняемого файла, такого как файл ELF, используя:

objdump -d file.elf

Но если у меня есть плоский двоичный файл, который, как я знаю, должен быть загружен, например, по адресу 0xabcd1000, могу ли я попросить objdump разобрать его? Я попытался указать такие опции, как '--start-address=0xabcd1000', но objdump просто утверждает, что не распознает формат.

У меня есть другие идеи о том, как разобрать файл, но я хотел знать, может ли objdump предоставить простое решение.

3 ответа

Решение

Я нашел решение своего вопроса на другом форуме. Это выглядит примерно так:

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

Я проверил это, и это работает.

Starblue и Hlovdal оба имеют части канонического ответа. Если вы хотите дизассемблировать необработанный код i8086, вам обычно нужен синтаксис Intel, а не синтаксис AT&T, поэтому используйте:

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

Если ваш код ELF (или a.out (или (E)COFF)), вы можете использовать краткую форму:

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

Для 32-битного или 64-битного кода опустите ,8086; заголовок ELF уже содержит эту информацию.

ndisasmКак предположил Jameslin, это также хороший выбор, но objdump обычно поставляется с ОС и может работать со всеми архитектурами, поддерживаемыми GNU binutils (расширенный набор поддерживаемых GCC), а его выходные данные обычно могут передаваться в GNU as (ndisasm's обычно можно вводить в nasm хотя, конечно).

Peter Cordes предполагает, что " задание Агнера Фога очень приятно. Он ставит метки на ветви целей, что значительно упрощает понимание того, что делает код. Он может быть разобран на синтаксис NASM, YASM, MASM или AT&T (GNU) ".

Мультимедиа Майк уже узнал о --adjust-vma; ndisasm эквивалент -o вариант.

Разобрать, скажем, sh4 код (я использовал один двоичный файл из Debian для тестирования), используйте его с GNU binutils (почти все другие дизассемблеры ограничены одной платформой, такой как x86 с ndisasm а также objconv):

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

-m это машина, и -EL означает Little Endian (для sh4eb использование -EB вместо этого), что актуально для архитектур, которые существуют в любом порядке байтов.

Нет, вы не можете, если он не перемещаем, например, если он содержит OPCODE "ljmp" (или "jmp far [addr]").

Другие вопросы по тегам