Я хотел бы разобрать MBR (первые 512 байт) загрузочного диска x86, который у меня есть. Я скопировал MBR в файл, используя
dd if=/dev/my-device of=mbr bs=512 count=1
Есть ли предложения по утилите Linux, которая может дизассемблировать файл mbr
?
--target
вместо-b
.-D
это «разобрать содержимое всех разделов»;-b bfdname
или--target=bfdname
заставит читать как указанный формат объектного кода (в нашем случае не elf, а raw binary);-m machine
укажет используемую архитектуру (в нашем файле нет заголовка с информацией об арке).-M options
варианты дизассемблера;addr16,data16
используются для «указания размера адреса по умолчанию и размера операнда» (трактуйте код как i8086 в универсальном движке дизасмации x86)Инструмент GNU называется objdump , например:
источник
-m i386
или-Mintel,x86-64
.i8086
- это старая архитектура, и ее использование для современного кода может привести к неожиданным результатам. Кроме того,x86-64
в настоящее время-M
может быть хорошей идеей указать to, поскольку многие машины 64-битные. Переходintel
к-M
изменяет синтаксис на стиль Intel вместо стиля AT&T по умолчанию, который может вам понадобиться, а может и нет.Мне
ndisasm
для этого нравится . Он поставляется с ассемблером NASM, который является бесплатным с открытым исходным кодом и включен в репозитории пакетов большинства дистрибутивов Linux.источник
Объяснение - из справочной страницы ndisasm
-b
= Задает 16-, 32- или 64-разрядный режим. По умолчанию используется 16-битный режим.-o
= Задает условный адрес загрузки файла. Эта опция заставляет ndisasm получать адреса, которые он перечисляет, внизу слева, а целевые адреса переходов и вызовов, относящихся к ПК, справа.-a
= Включает автоматический (или интеллектуальный) режим синхронизации, в котором ndisasm будет пытаться угадать, где должна быть выполнена синхронизация, путем проверки целевых адресов относительных переходов и вызывает его дизассемблирование.-s
= Указывает адрес синхронизации вручную, так что ndisasm не будет выводить машинные инструкции, содержащие байты с обеих сторон адреса. Следовательно, инструкция, которая начинается с этого адреса, будет правильно разобрана.mbr
= Файл, который нужно разобрать.источник
-b specifies 16-, 32- or 64-bit mode. The default is 16-bit mode.
-o is the notional load address for the file. This option causes ndisasm to get the addresses it lists down the left hand margin, and the target addresses of PC-relative jumps and calls, right.
-s specifies a synchronisation address, such that ndisasm will not output any machine instruction which encompasses bytes on both sides of the address. Hence the instruction which starts at that address will be correctly disassembled.
У starblue и hlovdal есть части канонического ответа. Если вы хотите дизассемблировать необработанный код i8086, вам обычно нужен синтаксис Intel, а не синтаксис AT&T, поэтому используйте:
Если ваш код - ELF (или a.out (или (E) COFF)), вы можете использовать короткую форму:
Для 32-битного или 64-битного кода опустите
,8086
; заголовок ELF уже включает эту информацию.ndisasm
, как было предложено jameslin , также является хорошим выбором, ноobjdump
обычно поставляется с ОС и может работать со всеми архитектурами, поддерживаемыми GNU binutils (надмножеством тех, которые поддерживаются GCC), и его вывод обычно может бытьas
передан в GNU (ndisasm обычно может подаваться вnasm
хотя, конечно).Питер Кордес предполагает, что « objconv Агнера Фога очень хорош. Он помещает метки на цели ветки, что значительно упрощает понимание того, что делает код. Его можно разобрать на синтаксис NASM, YASM, MASM или AT&T (GNU) ».
Мультимедиа Майк уже узнал
--adjust-vma
;ndisasm
эквивалент является-o
вариантом.Чтобы дизассемблировать, скажем,
sh4
код (я использовал один двоичный файл из Debian для тестирования), используйте его с GNU binutils (почти все другие дизассемблеры ограничены одной платформой, например x86 сndisasm
иobjconv
):Это
-m
машина и-EL
означает Little Endian (дляsh4eb
использования-EB
вместо этого), что актуально для архитектур, которые существуют в любом порядке.источник
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
, так как я обычно пытаюсь настроить исходный код C для компиляции в хороший asm.Попробуйте эту команду:
источник