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

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

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

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


person sigjuice    schedule 15.11.2009    source источник


Ответы (6)


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

objdump -D -b binary -mi386 -Maddr16,data16 mbr
person hlovdal    schedule 15.11.2009
comment
Можете ли вы объяснить, что делают указанные вами параметры? - person Hawken; 17.11.2012
comment
или --target вместо -b. -D - разобрать содержимое всех разделов; -b bfdname или --target=bfdname будут принудительно читать в указанном формате объектного кода (в нашем случае не elf, а необработанный двоичный файл); -m machine укажет используемую архитектуру (в нашем файле нет заголовка с информацией об арке). -M options - опции дизассемблера; addr16,data16 используются для указания размера адреса по умолчанию и размера операнда (обрабатывайте код как i8086 в универсальном механизме дизассемблирования x86) - person osgx; 28.11.2012

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

objdump -D -b binary -m i8086 <file>
person starblue    schedule 15.11.2009
comment
Вы также можете установить различные параметры архитектуры и синтаксиса. Например, -m i386 или -Mintel,x86-64. i8086 — это старая архитектура, и ее использование для современного кода может привести к неожиданным результатам. Кроме того, указание x86-64 на -M может быть хорошей идеей в настоящее время, поскольку многие машины являются 64-разрядными. Передача intel в -M изменяет синтаксис на стиль Intel вместо стандартного стиля AT&T, который вам может понадобиться или не понадобиться. - person GDP2; 05.03.2018

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

person asveikau    schedule 15.11.2009
comment
Мне больше нравится этот ответ. Легче в использовании, и я мог установить nasm на OS X — objdump там не было, и я не хочу собирать его из исходников. - person ; 28.10.2012

ndisasm -b16 -o7c00h -a -s7c3eh mbr

Объяснение – со страницы руководства ndisasm

  • -b = указывает 16-, 32- или 64-битный режим. По умолчанию используется 16-битный режим.
  • -o = Указывает условный адрес загрузки файла. Эта опция заставляет ndisasm получать адреса, которые он перечисляет, внизу слева, а целевые адреса переходов и вызовов, относящихся к ПК, справа.
  • -a = Включает автоматический (или интеллектуальный) режим синхронизации, в котором ndisasm попытается угадать, где должна выполняться синхронизация, посредством проверки целевых адресов относительных переходов и вызовов, которые он дизассемблирует.
  • -s = Вручную указывает адрес синхронизации, так что ndisasm не будет выводить никаких машинных инструкций, которые охватывают байты с обеих сторон адреса. Следовательно, инструкция, начинающаяся с этого адреса, будет корректно дизассемблирована.
  • mbr = Файл для дизассемблирования.
person jameslin    schedule 08.07.2011
comment
что это делает в отличие от простого ndisasm? Можете ли вы объяснить варианты - person Hawken; 17.11.2012
comment
Не могли бы вы объяснить, что означают эти параметры и что они делают? Лучше понять ответ, чем просто получить его. - person Sled; 17.11.2012

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

person mirabilos    schedule 22.12.2015
comment
Объект Агнера Фога очень хорош. Он помечает ветки targets, что значительно упрощает понимание того, что делает код. Он может дизассемблироваться в синтаксис NASM, YASM, MASM или AT&T (GNU). - person Peter Cordes; 23.12.2015
comment
Для меня он отлично строился прямо из коробки на GNU/Linux. Но да, это только x86/x86-64, в отличие от GNU binutils. Тем не менее, у него есть много хороших подсказок, специфичных для x86, которые он добавляет в качестве комментариев, например, когда префикс размера операнда может вызвать остановку LCP в декодерах процессора Intel. Обязательно укажите это в своем ответе. Одна из основных целей комментариев — помочь автору улучшить свой ответ, а не только как то, что позже должны прочитать и зрители. - person Peter Cordes; 23.12.2015
comment
@PeterCordes Да, у меня MirBSD в качестве основной ОС;) - person mirabilos; 23.12.2015
comment
@PeterCordes, но, похоже, он не может разобрать необработанные двоичные файлы, не так ли? Мне пришлось создать минимальные ELF-файлы только для того, чтобы иметь возможность загружать в него кучу инструкций, но, может быть, я просто пропустил какую-то опцию? - person Ruslan; 28.04.2017
comment
@Руслан: ИДК, интересный вопрос. Обычно я просто использую objdump или, если мне нужны метки веток, gcc -O3 -masm=intel -fverbose-asm -S -o- | less, поскольку я обычно пытаюсь настроить исходный код C для компиляции в хороший asm. - person Peter Cordes; 28.04.2017

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

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