Я хотів би розібрати 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.