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

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

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

objdump -d file.elf

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

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

Ответ 1

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

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

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

Ответ 2

starblue и hłddal имеют части канонического ответа. Если вы хотите разобрать необработанный код 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 (superset of the supported, поддерживаемый GCC), и его выход обычно можно подавать в GNU as (ndisasms обычно можно вводить в nasm, хотя, конечно).

Питер Кордес предполагает, что " Agner Fog objconv очень приятный. ставит метки на целевые объекты ветки, что значительно упрощает определение кода. Он может разбираться в синтаксисе 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), что имеет значение для архитектур, которые существуют либо в endianness.

Ответ 3

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