Как дизассемблировать примитивный файл (MBR)?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Как дизассемблировать примитивный файл (MBR)?

Сообщение жучара »

Друзья При установке Win XP 32 PRO получается MBR. Как его дизассемблировать? По-моему там примитивнейшие и универсальнейшие команды должны быть в силу того, что MBR МАЛО (512 байт вместе с таблицей и другими прибамбасами.) Везде написано, что код начинается с нулевого смещения. Но надо же:

Shell

$ objdump -M x86-64 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M i386 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M i8086 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M intel -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M att -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M amd64 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M intel64 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M intel-mnemonic -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M att-mnemonic -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M addr64 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M addr32 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M addr16 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M data32 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
$ objdump -M data16 -d mbr.bin
objdump: mbr.bin: формат файла не распознан
$
Форум не даёт прикрепить бинарник, если надо- буду изгаляться. Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
yoricI
Сообщения: 2623
ОС: gentoo fluxbox

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение yoricI »

Запакуйте его в архив, допускаемый.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение жучара »

yoricI писал:
20.07.2024 20:28
Запакуйте его в архив, допускаемый.
mbr.tar
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение жучара »

Хотя nasm (ndisasm mbr.bin) сразу дизассемблировал, уж не знаю, насколько верно.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5372
ОС: Gentoo

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение /dev/random »

Команда objdump, как ясно из названия, предназначена для работы с объектными файлами, а не с сырым машинным кодом.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3689
ОС: Mandriva => Gentoo (~amd64)

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение devilr »

А что вы хотите увидеть а MBR? Там ведь всего лишь загрузка сектора и передача управления по адресу. Всё интересное будет дальше.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2913
ОС: Gentoo

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение ormorph »

Как то так:

Shell

$ objdump -m i386 -D -b binary mbr.bin
$ objdump -m i386 -D -b binary -Maddr32,data32 mbr.bin
Так как загрузчик 32 битный, то по идее должно соответствовать. Для grub2 и gpt будет сложнее, так как там загрузчик делится на два, один загрузчик загружает другой загрузчик из раздела bios, что бы можно было перейти в 64 битный режим, аналогично EFI, по крайней мере это они писали в описании.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение жучара »

devilr писал:
21.07.2024 14:07
А что вы хотите увидеть а MBR? Там ведь всего лишь загрузка сектора и передача управления по адресу. Всё интересное будет дальше.
просто интересно как оно работает
ormorph писал(а):
21.07.2024 15:20
Как то так:

Shell

$ objdump -m i386 -D -b binary mbr.bin
$ objdump -m i386 -D -b binary -Maddr32,data32 mbr.bin
Так как загрузчик 32 битный, то по идее должно соответствовать. Для grub2 и gpt будет сложнее, так как там загрузчик делится на два, один загрузчик загружает другой загрузчик из раздела bios, что бы можно было перейти в 64 битный режим, аналогично EFI, по крайней мере это они писали в описании.
обе команды отработали нормально, спасибо. Синтакис непривычен только.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
SergeyIT
Сообщения: 76
ОС: xUbuntu, MXlinux

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение SergeyIT »

жучара писал(а):
21.07.2024 18:28
просто интересно как оно работает
Синтакис непривычен только.
Так систему команд изучи - делов-то...
Извините, я все еще учусь
Спасибо сказали:
Аватара пользователя
Tartaren
Сообщения: 55
ОС: Debian 12+FreeBSD 14

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение Tartaren »

Загрузочная запись MBR работает следующим образом: при включении компьютера BIOS (Basic Input/Output System) ищет загрузочный диск и передает управление загрузочному сектору. Затем загрузчик MBR считывается в оперативную память и выполняется. Он анализирует таблицу разделов и выбирает активный раздел, содержащий операционную систему. Затем управление передается загрузчику операционной системы, который загружает саму операционную систему.
Источник: https://helpdoma.ru/faq/osnovnaya-zagruzocnaya-zapis-mbr-cto-eto-takoe-i-kak-ona-rabotaet
---------------
То есть - MBR - указатель. https://wiki.osdev.org/MBR_(x86)
Добавлено (10:19):
https://thestarman.pcministry.com/asm/mbr/W7MBR.htm#CODE
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение жучара »

В общем, правильно дизассемблировать так:
./te.py --b16 mbr.bin
так
ndisasm mbr.bin
или так:
objdump -m i8086 -M intel-mnemonic -D -b binary mbr.bin

Меду первым и вторым вариантом будет разница, но думаю, не критичная. Так, например te.py предпочитает jae, а ndisasm jnc ну и всё в таком духе. Третий вариант на отличия не рассматривал, но именно опция -m i8086 даёт вывод команд 16-битного процессора. Просмотрел, сколько байт занимает каждая команда- всё, как в первом и втором случае. Думаю, интерпретация команд такая же. Опция -M intel-mnemonic от вырвиглазия.

В общем, всё ровно пока не начинается текст "Invalid Partitin...". Но текст он и в африке текст.

Вот код te.py, требуется пакет python3-distorm3

Код: Выделить всё

#!/usr/bin/python3
# Mario Vilas, http://breakingcode.wordpress.com
# Licensed Under GPLv3

# Example code

import distorm3
import sys
import optparse

# Parse the command line arguments
usage  = 'Usage: %prog [--b16 | --b32 | --b64] filename [offset]'
parser = optparse.OptionParser(usage=usage)
parser.add_option(  '--b16', help='80286 decoding',
                    action='store_const', dest='dt', const=distorm3.Decode16Bits  )
parser.add_option(  '--b32', help='IA-32 decoding [default]',
                    action='store_const', dest='dt', const=distorm3.Decode32Bits  )
parser.add_option(  '--b64', help='AMD64 decoding',
                    action='store_const', dest='dt', const=distorm3.Decode64Bits  )
parser.set_defaults(dt=distorm3.Decode32Bits)
options, args = parser.parse_args(sys.argv)
if len(args) < 2:
    parser.error('missing parameter: filename')
filename = args[1]
offset   = 0
length   = None
if len(args) == 3:
    try:
        offset = int(args[2], 10)
    except ValueError:
        parser.error('invalid offset: %s' % args[2])
    if offset < 0:
        parser.error('invalid offset: %s' % args[2])
elif len(args) > 3:
    parser.error('too many parameters')

# Read the code from the file
try:
    code = open(filename, 'rb').read()
except Exception as e:
    parser.error('error reading file %s: %s' % (filename, e))

# Print each decoded instruction
# This shows how to use the Deocode - Generator
iterable = distorm3.DecodeGenerator(offset, code, options.dt)
for (offset, size, instruction, hexdump) in iterable:
    print("%.8x: %-32s %s" % (offset, hexdump, instruction))

# It could also be used as a returned list:
# l = distorm3.Decode(offset, code, options.dt)
# for (offset, size, instruction, hexdump) in l:
#     print("%.8x: %-32s %s" % (offset, hexdump, instruction))
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2913
ОС: Gentoo

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение ormorph »

жучара писал(а):
23.07.2024 22:50
но именно опция -m i8086 даёт вывод команд 16-битного процессора.
Не только, я же не зря давал пример с -Maddr32,data32, просто сменить 32 на 16. Тот же самый результат можно получить такой командой:

Shell

$ objdump -m i386 -M intel-mnemonic,addr16,data16 -D -b binary mbr.bin
Только вот вроде как 16 бит это старая адресация, характерная для старых dos. Современный bios вроде как поддерживает 32 бит и адресация используется 32 битная(диски не более 2,2 Тб). Хотя я не сильно вдавался в подробности, но gpt поддерживает 64 битную адресацию и 32-х битную винду не загрузить с GPT, загрузившись с биос загрузчик будет видеть не более 2,2 Тб. По этому Grub2 использует раздел биос который должен располагаться в пределах первых 2Тб, для загрузки другой микропрограммы, которая уже будет видеть полную адресацию 64 битную диска более 2,2Тб, для этих же целей служит EFI.
Спасибо сказали:
Аватара пользователя
Tartaren
Сообщения: 55
ОС: Debian 12+FreeBSD 14

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение Tartaren »

Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2913
ОС: Gentoo

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение ormorph »

Tartaren писал(а):
24.07.2024 08:51
https://thestarman.pcministry.com/asm/mbr/STDMBR.htm
Хироманты Ё..
С ограничением загрузки 1024 цилиндра, прикольно. Какую нибудь бы более нормальную литературу, хотя может если копнуть поглубже можно и там найти. LBA вроде как с середины 1990-х судя по википедии.
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1476
ОС: Slackware

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение UnixNoob »

ormorph писал(а):
23.07.2024 23:36
Хотя я не сильно вдавался в подробности, но gpt поддерживает 64 битную адресацию и 32-х битную винду не загрузить с GPT, загрузившись с биос загрузчик будет видеть не более 2,2 Тб
Offtopic
Куда вы собрались 32х битную windows ставить, тут 7ку уже не поставишь на все современное :)
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
Tartaren
Сообщения: 55
ОС: Debian 12+FreeBSD 14

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение Tartaren »

С ограничением загрузки 1024 цилиндра, прикольно. Какую нибудь бы более нормальную литературу, хотя может если копнуть поглубже можно и там найти. LBA вроде как с середины 1990-х судя по википедии.
Сабж спрашивает дизассемблер - ему предъявляется ассемблерный код. Какую литературу Вам нужно? Речь в дискурсии пошла про 16 битность. Вот Асм 16 бит. О чём это ты?
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2913
ОС: Gentoo

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение ormorph »

Tartaren писал(а):
24.07.2024 11:07
Сабж спрашивает дизассемблер - ему предъявляется ассемблерный код. Какую литературу Вам нужно? Речь в дискурсии пошла про 16 битность. Вот Асм 16 бит. О чём это ты?
Да уже не о чём, прочитал каюсь, асм использует двухбайтовые слова. Просто врезались слова:
This page examines the Standard MBR code which had been used in Microsoft's FDISK utility since MS-DOS 3.30 (as a matter of fact only a small portion of its code was changed since it was first created for IBM DOS version 2.00 at the beginning of 1983. So we've got a very good reason for using the phrase Standard MBR when discussing this code!).
Читаю потихоньку.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1051
ОС: астралинукс

Re: Как дизассемблировать примитивный файл (MBR)?

Сообщение жучара »

Меж тем представленные здесь способы не универсальны, (если не сказать лживы). Причём одинаково не универсальны. PBR из той же оперы:

Shell

$ ndisasm pbr.bin | head -n 49 | tail -n 6
00000055 3332 xor si,[bp+si]
00000057 2020 and [bx+si],ah
00000059 2033 and [bp+di],dh
0000005B C9 leave
0000005C 8ED1 mov ss,cx
0000005E BCF47B mov sp,0x7bf4
$
инструкцию 00000059 2033 and [bp+di],dh видите? А её нет. В реальном коде оно выглядит так:
...
0000005A 33c9 xor cx,cx
...
Такие дела.
Я просто читаю маны.
Спасибо сказали: