Разборка плоского двоичного файла с помощью 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]").