Как мне разобрать сырой код x86? - PullRequest
85 голосов
/ 15 ноября 2009

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

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

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

Ответы [ 6 ]

99 голосов
/ 15 ноября 2009

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

objdump -D -b binary -mi386 -Maddr16,data16 mbr
26 голосов
/ 15 ноября 2009

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

objdump -D -b binary -m i8086 <file>
20 голосов
/ 15 ноября 2009

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

18 голосов
/ 08 июля 2011
ndisasm -b16 -o7c00h -a -s7c3eh mbr

Объяснение - из справочной страницы ndisasm

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

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 обычно можно вводить в nasm, хотя, конечно).

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

7 голосов
/ 23 ноября 2009

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

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