Как разобрать исходный код x86?



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



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


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

673   6  

6 ответов:

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

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

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

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

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

ndisasm -b16 -o7c00h -a -s7c3eh mbr

объяснение - от ndisasm manpage

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

starblue и hlovdal обе части канонического ответа. Если вы хотите разобрать код raw 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 хотя, разумеется).

Питер Кордес говорит о том, что " Агнер Фог's objconv очень приятно. Он помещает метки на целевые ветви, что делает намного проще понять, что именно код делает это. Он может разбираться на синтаксис NASM, YASM, MASM или AT&T (GNU)."

Мультимедиа Майк уже узнал о --adjust-vma; the ndisasm эквивалентной .

разбирать, скажем, sh4 код (я использовал один двоичный файл из Debian для тестирования), используйте это с GNU binutils (почти все другие дизассемблеры ограничены одной платформой, например x86 с ndisasm и objconv):

objdump -D -b binary -m sh -EL x

The -m - это машина, и -EL означает маленький Эндиан (для sh4eb использовать -EB вместо этого), что имеет отношение к архитектурам, которые существуют в любой endianness.

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

Comments

    Ничего не найдено.