Как мне разобрать необработанный 16-битный машинный код x86?

Я бы хотел разобрать MBR (первые 512 байт) загрузочного диска x86, который у меня есть. Я скопировал MBR в файл, используя

dd if=/dev/my-device of=mbr bs=512 count=1

Любые предложения для утилиты Linux, которые могут дизассемблировать файл mbr?

Ответ 1

Вы можете использовать objdump. Согласно этой статье синтаксис:

objdump -D -b binary -mi386 -Maddr16,data16 mbr

Ответ 2

Инструмент GNU называется objdump, например:

objdump -D -b binary -m i8086 <file>

Ответ 3

Мне нравится ndisasm для этой цели. Он поставляется с ассемблером NASM, который является бесплатным и открытым исходным кодом и включен в репозитории пакетов большинства дистрибутивов Linux.

Ответ 4

ndisasm -b16 -o7c00h -a -s7c3eh mbr

Объяснение - из ndisasm manpage

  • -b= Указывает 16-, 32- или 64-разрядный режим. По умолчанию используется 16-разрядный режим.
  • -o= Определяет условный адрес загрузки для файла. Этот параметр заставляет ndisasm получать адреса, которые он перечисляет, по левому краю поля, а также целевые адреса переходов и вызовов, относящихся к PC, правильно.
  • -a= Включает автоматический (или интеллектуальный) режим синхронизации, в котором ndisasm будет пытаться угадать, где должна выполняться синхронизация, путем изучения целевых адресов относительных прыжков и их разборки.
  • -s= Вручную указывает адрес синхронизации, так что ndisasm не будет выводить какую-либо машинную команду, которая охватывает байты по обе стороны адреса. Следовательно, инструкция, начинающаяся с этого адреса, будет правильно разобрана.
  • mbr= Файл, который нужно разобрать.

Ответ 5

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 (хотя, разумеется, 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), что актуально для архитектур, которые существуют с любым порядком байтов.

Ответ 6

Попробуйте эту команду:

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -