Я хотів би розібрати MBR (перші 512 байт) завантажувального диска x86, який у мене є. Я скопіював MBR у файл за допомогою
dd if=/dev/my-device of=mbr bs=512 count=1
Будь-які пропозиції щодо утиліти Linux, яка може розібрати файл mbr
?
Відповіді:
Ви можете використовувати objdump. Відповідно до цієї статті синтаксис:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
--target
замість -b
. -D
є "розібрати вміст усіх розділів"; -b bfdname
або --target=bfdname
змусить читати як вказаний формат об’єктного коду (у нашому випадку не elf, а сирий двійковий файл); -m machine
вкаже архітектуру для використання (у нашому файлі немає заголовка з інформацією про арку). -M options
є варіанти розбирача; addr16,data16
використовуються для "вказівки розміру адреси за замовчуванням та розміру операнда" (обробляти код як i8086 у універсальному механізмі
Інструмент GNU називається objdump , наприклад:
objdump -D -b binary -m i8086 <file>
-m i386
або -Mintel,x86-64
. i8086
це стара архітектура, і використання її для сучасного коду може дати несподівані результати. Крім того, визначаючи x86-64
для -M
може бути гарною ідеєю , в даний час , так як багато машин 64-бітними. Перехід intel
до -M
змінює синтаксис на стиль Intel замість типового стилю AT&T, який ви можете або не хочете.
Мені подобається ndisasm
для цієї мети. Він поставляється з ассемблером NASM, який є безкоштовним та з відкритим кодом і входить до сховищ пакунків більшості дистрибутивів Linux.
ndisasm -b16 -o7c00h -a -s7c3eh mbr
Пояснення - з ndisasm manpage
-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, тому використовуйте:
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's зазвичай можуть подаватися в nasm
хоча, звичайно).
Пітер Кордес припускає, що « обжонв Агнера Фога дуже приємний. Він наносить мітки на цілі гілок, значно полегшуючи з'ясування того, що робить код. Він може розбиратися на синтаксис 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
означає Маленький Ендіан (для sh4eb
використання -EB
натомість), що актуально для архітектур, які існують в будь-якій ендіанності.
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
, оскільки я зазвичай намагаюся налаштувати джерело C на компіляцію в хороший asm.