Як розібрати необроблений 16-розрядний машинний код x86?


91

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

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

Будь-які пропозиції щодо утиліти Linux, яка може розібрати файл mbr?

Відповіді:


109

Ви можете використовувати objdump. Відповідно до цієї статті синтаксис:

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

Ви можете пояснити, що роблять вказані вами параметри?
Хокен

11
або --targetзамість -b. -Dє "розібрати вміст усіх розділів"; -b bfdnameабо --target=bfdnameзмусить читати як вказаний формат об’єктного коду (у нашому випадку не elf, а сирий двійковий файл); -m machineвкаже архітектуру для використання (у нашому файлі немає заголовка з інформацією про арку). -M optionsє варіанти розбирача; addr16,data16використовуються для "вказівки розміру адреси за замовчуванням та розміру операнда" (обробляти код як i8086 у універсальному механізмі
аварійного керування

29

Інструмент GNU називається objdump , наприклад:

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

Ви також можете встановити різні параметри для архітектури та синтаксису. Наприклад, -m i386або -Mintel,x86-64. i8086це стара архітектура, і використання її для сучасного коду може дати несподівані результати. Крім того, визначаючи x86-64для -Mможе бути гарною ідеєю , в даний час , так як багато машин 64-бітними. Перехід intelдо -Mзмінює синтаксис на стиль Intel замість типового стилю AT&T, який ви можете або не хочете.
GDP2,

24

Мені подобається ndisasmдля цієї мети. Він поставляється з ассемблером NASM, який є безкоштовним та з відкритим кодом і входить до сховищ пакунків більшості дистрибутивів Linux.


Мені ця відповідь більше подобається. Простіше у використанні, і я міг би встановити nasm на OS X - objdump там не було, і я не хочу створювати його з джерела.

22
ndisasm -b16 -o7c00h -a -s7c3eh mbr

Пояснення - з ndisasm manpage

  • -b= Вказує 16-, 32- або 64-розрядний режим. За замовчуванням використовується 16-розрядний режим.
  • -o= Вказує умовну адресу завантаження для файлу. Цей параметр змушує ndisasm отримувати адреси, перераховані ним, за лівим краєм, а цільові адреси стрибків та викликів, що відносяться до ПК, праворуч.
  • -a = Вмикає автоматичний (або інтелектуальний) режим синхронізації, в якому ndisasm намагатиметься вгадати, де слід виконувати синхронізацію, за допомогою вивчення цільових адрес відповідних стрибків і називає це розбиранням.
  • -s= Вручну вказує адресу синхронізації, так що ndisasm не виведе жодної машинної інструкції, яка охоплює байти з обох сторін адреси. Отже, інструкція, яка починається з цієї адреси, буде правильно розібрана.
  • mbr = Файл, який слід розібрати.

що це робить на відміну від простого нідизму? Можете пояснити варіанти
Хокен

4
Не могли б ви пояснити, що ці варіанти означають і роблять? Розуміння відповіді краще, ніж просто її отримання.
Сани

-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.
Янус Трольсен

15

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


2
Objconv від Agner Fog дуже приємний. Він наносить мітки на цільові гілки , що значно полегшує з'ясування того, що робить код. Він може розбиратися на синтаксис NASM, YASM, MASM або AT&T (GNU).
Пітер Кордес,

Для мене це чудово вийшло на GNU / Linux. Але так, це лише x86 / x86-64, на відміну від GNU binutils. Однак у нього є багато приємних підказок для x86, які він додає як коментарі, наприклад, коли префікс розміру операнда може спричинити зупинку LCP у декодерах процесора Intel. Обов’язково згадайте про це у своїй відповіді. Однією з головних цілей коментарів є допомогти плакату покращити свою відповідь, а не просто як те, що пізніше глядачі також повинні прочитати.
Пітер Кордес

1
@PeterCordes Так добре, у мене основна ОС
MirBSD

@PeterCordes, але, здається, він не може розібрати сирі файли, правда? Мені довелося створити мінімальні файли ELF, лише щоб мати змогу додати в них купу інструкцій, але, можливо, я просто пропустив якийсь варіант?
Руслан

1
@Ruslan: IDK, цікаве питання. Зазвичай я просто використовую objdump або якщо мені потрібні мітки гілок gcc -O3 -masm=intel -fverbose-asm -S -o- | less, оскільки я зазвичай намагаюся налаштувати джерело C на компіляцію в хороший asm.
Пітер Кордес,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.