Гид компьютерного мира - Информационный портал
  • Главная
  • Instagram
  • Как создать раздел mbr. Создаем MBR и пишем свой менеджер мультизагрузки

Как создать раздел mbr. Создаем MBR и пишем свой менеджер мультизагрузки

MBR (по-русски – главная загрузочная запись) – определенный набор данных, строчек кода, таблица разделов и сигнатуры. Необходим он для загрузки операционной системы Windows после включение компьютера. Бывают случаи, когда в результате различных аппаратных и системных сбоев, МБР повреждается или стирается, что приводит к невозможности запуска Windows. Подобные проблемы решает восстановление загрузочной записи MBR Windows 7. В данной статье рассмотрено несколько несложных способов, которыми можно восстановить записи.

Немного теории

После включение компьютера BIOS выбирает носитель информации, с которого будет осуществляться загрузка. На этом этапе устройству необходимо знать, какой именно раздел жесткого диска содержит системные файлы Windows. MBR – небольшая программка, которая хранится в первом секторе HDD и указывает компьютеру на правильный раздел для запуска системы.

Если вы некорректно установите вторую операционную систему, таблица разделов может повредиться и старт первой Windows будет невозможен. То же самое иногда происходит при внезапном отключении электроэнергии. Если это произошло – не стоит отчаиваться, поврежденные данные можно полностью восстановить.

Восстановление загрузочной записи

Для того чтобы восстановить MBR, вам понадобится инсталляционный диск, с которого вы устанавливали Windows (либо любой другой). Если же диска нет, можно создать загрузочную флешку с Win7. Алгоритм действия:

Автоматическое восстановление

Для начала стоит предоставить починку MBR стандартным средствам от Microsoft. Выберите пункт «Восстановление запуска». Больше ничего делать не требуется, пройдет некоторое время, и компьютер сообщит о завершении процесса. Попробуйте запустить Windows. Если ничего не получилось – значит, необходимо восстановить МБР вручную.

Командная строка

Этот путь требует ввода нескольких команд в командную строку Windows.

  • В меню восстановления системы выберите пункт «Командная строка».
  • Теперь необходимо ввести «bottrec/fixmbr ». Данная команда служит для записи новой MBR совместимой с Win 7. Команда удалит нестандартные части кода, исправит повреждения, но не будет затрагивать существующую таблицу разделов.
  • Следом введите «bootrec/fixboot ». Эта команда служит для создания нового загрузочного сектора для Windows.
  • Далее «bootrec/nt60 sys ». Эта команда обновит загрузочный код MBR.
  • Закройте консоль, перезагрузите компьютер и попробуйте запустить систему. Если проблема все еще не решена, необходимо ввести еще несколько команд.
  • Снова запустите консоль и введите «bootrec/Scanos » и «bootrec/rebuildbcd ». С помощью этих утилит компьютер просканирует жесткий диск на наличие операционных систем, а затем внесет их в меню загрузки.
  • Следом опять введите «bootrec/nt60 sys » и перезагрузите компьютер.

Утилита TestDisk

Если у вас нет загрузочной флешки или диска, можно восстановить поврежденную запись с помощью сторонней программы. Для этого необходимо запустить другую (рабочую) ОС. Если на вашей машине была всего одна Windows, придется подключить жесткий диск к другому компьютеру. Работа с TestDisk достаточно сложна, поэтому рекомендуется ознакомиться с руководствами, посвященными конкретно этой программе.

На дисках компьютера используются таблицы разделов GPT или MBR. На современных компьютерах используют таблицу разделов GPT в операционных системах Windows 10 или Windows 8.1 (Windows 8).

Таблица разделов GUID Partition Table (GPT) является частью интерфейса EFI, пришедшего на смену BIOS. В BIOS используется MBR (Master Boot Record) - главная загрузочная запись. Постепенно компьютеры с дисками MBR замещаются компьютерами с дисками GPT, типы дисков SSD или HDD, не имеют значения.

Основная разница между таблицами разделов в следующем: на дисках с MBR можно создать 4 основных раздела, поддерживаются диски до 2,2 Тб, на дисках с GPT количество разделов практически не ограничено (зависит от используемой операционной системы), поддерживаются диски размером более 2,2 Тб, происходит более быстрая загрузка системы.

Преимуществом GPT является то, что свои данные она хранит в разных местах на диске, в отличие от MBR, находящейся в одном месте. В GPT, в случае повреждений или сбоев, данные могут использоваться из другого места, на дисках с MBR, в этом случае, загрузка будет невозможна. Преимущества стиля раздела GPT, в основном, реализуются в 64 битной версии Windows (поддерживается Windows 7 x64).

Как узнать какой диск GPT или MBR? Узнать формат диска MBR или GPT можно средствами операционной системы Windows, с помощью сторонних программ, предназначенных для работы с дисками. В статье рассмотрена программа AOMEI Partition Assistant, подойдут другие подобные программы.

Как узнать GPT или MBR в «Управлении дисками»

Самый простой способ узнать стиль разделов диска: войти в оснастку «Управление дисками».

В Windows 10 кликните правой кнопкой мыши по меню «Пуск», выберите «Управление дисками». В Windows 7 кликните правой кнопкой мыши по «Компьютер», выберите пункт контекстного меню «Управление», в окне «Управление компьютером» выберите раздел «Управление дисками».

В управление дисками в Windows можно войти другим способом: нажмите на клавиатуре на «Win» + «R», в окне «выполнить» введите команду «diskmgmt.msc» (без кавычек), а затем нажмите на кнопку «ОК».

После этого, откроется окно «Управление дисками», в котором отображены все диски, подключенные к данному компьютеру.

В нижней части окна оснастки вы увидите все физические диски, подключенные к компьютеру, которые имеют обозначения: «Диск 0», «Диск 1» и т. д. Обратите внимание, что на одном физическом жестком диске может быть несколько разделов (диски «С», «D» и т. д.).

Нажмите правой кнопкой мыши на название диска, в данном случае на «Диск 0», а в контекстном меню выберите пункт «Свойства».

В открывшемся окне «Свойства XXX диска» откройте вкладку «Тома». В разделе «Сведения о диске» вы увидите параметр «Стиль раздела: Таблица с GUID разделов (GUID)». Это значит, что данный диск имеет стиль разделов GPT.

После того, как я вошел в свойства «Диска 1», и открыл вкладку «Тома», я увидел, что на этом диске находится таблица MBR - «Стиль раздела: основная загрузочная запись (MBR)».

Как узнать жесткий диск GPT или MBR в командной строке

Запустите командную строку от имени администратора. В окне интерпретатора командной строки введите команду:

Diskpart

List disk

Нажмите на «Enter».

В окне командной строки отобразятся все физические диски, подключенные к компьютеру.

Один из отображаемых параметров обозначен как «GPT». Диск, который имеет стиль раздела GPT отмечен звездочкой («Диск 0»). Значит, остальные диски, где нет звездочек, имеют стиль раздела MBR.

Как узнать разметку диска GPT или MBR в AOMEI Partition Assistant

Программа AOMEI Partition Assistant (бесплатная версия - AOMEI Partition Assistant Standard) предназначена для работы и управления дисками. Программа имеет конвертировать (преобразовывать) диски GPT в MBR и MBR в GPT.

После запуска программы, в главном окне AOMEI Partition Assistant отобразятся диски компьютера. В нижней части окна приложения, под именем каждого физического диска, показан тип разметки: GPT или MBR.

Выводы статьи

Какой тип разметки GPT или MBR имеют диски на компьютере, можно узнать с помощью оснастки «Управление дисками», командной строки и стороннего софта: программы AOMEI Partition Assistant.

Главная загрузочная запись

Главная загрузочная запись (англ. master boot record, MBR ) - код и данные, необходимые для последующей загрузки операционной системы и расположенные в первых физических секторах (чаще всего в самом первом) на жёстком диске или другом устройстве хранения информации.

MBR содержит небольшой фрагмент исполняемого кода , таблицу разделов (partition table) и специальную сигнатуру.

Функция MBR - «переход» в тот раздел жёсткого диска, с которого следует исполнять «дальнейший код» (обычно - загружать ОС). На «стадии MBR» происходит выбор раздела диска, загрузка кода ОС происходит на более поздних этапах алгоритма.

В процессе запуска компьютера, после окончания начального теста (Power-on self-test - POST), Базовая система ввода-вывода (BIOS) загружает «код MBR» в оперативную память (в IBM PC обычно с адреса 0000:7c00) и передаёт управление находящемуся в MBR загрузочному коду.

Роль и место MBR в загрузке компьютера (для архитектуры x86)

В процессе загрузки компьютера x86 вначале всегда отрабатывается BIOS . На этой стадии, кроме тестирования и инициализации оборудования компьютера, происходит также и выбор устройства, с которого будет происходить дальнейшая загрузка. Это может быть дискета, жёсткий диск, сетевой ресурс, встроенное ПЗУ или любое иное устройство (алгоритм выбора загрузочного устройства может быть различным и зависит от реализации BIOS). После выбора загрузочного устройства управление всей дальнейшей загрузкой BIOS полностью передаёт этому устройству.

В случае, если устройство имеет только один раздел (как, например, дискета или сетевая загрузка), то выбор однозначен, и загрузка продолжается сразу с этого устройства. Однако, если устройство содержит несколько разделов, каждый из которых потенциально может быть загрузочным (как, например, в случае жёстких дисков), то возникает неопределённость: с какого именно раздела производить загрузку. Для разрешения неоднозначности по выбору раздела было предложено вынести этот вопрос из ведения BIOS и передать этот выбор самому устройству. Возникла идея использовать для этого небольшую программу, записанную на самом носителе, которая и осуществляла бы данный выбор. Так появилась концепция MBR.

Таким образом, потенциальное наличие нескольких загрузочных разделов, среди которых необходимо осуществить выбор - это ключевой момент в необходимости появления и отработки MBR. Для устройств с единственным (или однозначно заданным) загрузочным разделом концепция MBR лишена смысла и не используется.

Развитие MBR

Иногда в MBR кроме основной функции (выбора раздела) включаются также и другие функции, например, авторизация. Но это уже расширение и дополнение к основной функции и задаче MBR. Такие системы не получили широкого распространения.

Другие (не x86) системы

В связи с тем, что на других системах применяются иные архитектурные решения (начиная от активации железа и заканчивая загрузкой ОС), концепция MBR может быть к ним неприменима.

Стандартизация MBR

Утверждённого стандарта на структуру MBR не существует, однако, есть «сложившиеся традиции», которых придерживаются большинство MBR от разных производителей.

Иные форматы MBR

Загрузчики, отличные от стандартных Windows -загрузчиков, могут использовать всё пространство между MBR и первым разделом (около 32 кб) для собственных целей. В таких случаях под MBR понимают весь загрузочный код, а для выделения именно первых 512 байт говорят, что они расположены в MBS (Master Boot Sector) - главном загрузочном секторе.

Алгоритм работы кода MBR от Microsoft

BIOS (до MBR)

  • BIOS проводит начальную инициализацию оборудования («железа»)
  • BIOS определяет, с какого устройства производить дальнейшую загрузку: дискета, флеш-накопитель, жёсткий диск и т. д. (выбор устройства зависит от версии и от настроек BIOS)
данном описании рассматривается только случай загрузки с жесткого диска]
  • BIOS считывает один сектор (512 байт), который находится по адресу: «цилиндр 0, головка 0, сектор 1», и помещает его в область памяти по адресу 0000:7c00
  • BIOS проверяет, что этот сектор оканчивается сигнатурой 55ААh
[если это не так, то управление возвращается обратно в BIOS]
  • BIOS передаёт управление по адресу 0000:7c00 (то есть сектору MBR)

MBR

Выбор загрузочного раздела и проверка целостности MBR:

  • MBR копирует себя с адреса 0000:7c00 на адрес 0000:0600 (освобождая место для будущей загрузки уже собственно загрузчика ОС)
  • MBR просматривает по очереди все записи о разделах и ищет первую запись об «активном» (== «загрузочном») разделе (то есть ищет раздел, отмеченный как 80h)
  • В случае успеха (раздел, помеченный как 80h - найден) MBR запоминает номер этого раздела
[если просмотрены все 4 записи и не найден раздел, помеченный как 80h, то вызывается INT 18h. Это возвращает управление обратно в BIOS, что может приводить либо к загрузке BASIC, либо к повторной попытке загрузить систему с диска, либо к перезагрузке компьютера - в зависимости от версии и реализации BIOS]
  • MBR просматривает все оставшиеся записи и проверяет, что это единственный активный раздел (что больше разделов, помеченных 80h, на данном физическом диске не существует)
[если находятся другие разделы, помеченные 80h, то MBR выводит сообщение об ошибке (обычно это что-то типа «Invalid partition table»), после чего система зависает в бесконечном цикле, из которого можно выйти только перезагрузкой компьютера]
  • MBR проверяет, что в данном поле для всех 4-х разделов нет иных значений, кроме «00h» и «80h»
[если находятся разделы, помеченные значением, отличным от 00h или 80h, то MBR выводит сообщение об ошибке («Invalid partition table»), система зависает, требуется перезагрузка компьютера]

На этом заканчивается проверка MBR и начинается подготовка к загрузке ОС:

  • MBR считывает первый сектор логического диска, помеченного как «загрузочный» и помещает этот сектор по адресу 0000:7c00
  • MBR проверяет, что данный сектор заканчивается сигнатурой 55ААh
[если этой сигнатуры в этом месте нет, то выводится сообщение «Missing operating system» и компьютер подвисает, требуется перезагрузка]
  • MBR передает управление по адресу 0000:7c00 (то есть загрузочному сектору выбранного логического раздела диска)

Загрузочный сектор логического диска (после MBR)

Загрузочный сектор зависит от типа файловой системы на логическом разделе диска и содержит код, выполняющий нахождение и загрузку собственно операционной системы на данном типе файловой системы.

Структура MBR

Код загрузчика

После завершения процедуры POST в ОЗУ по адресу 0x0000:0x7c00 записывается код загрузчика после чего ему передается управление. Задача загрузчика - проанализировать таблицу разделов жёсткого диска , затем либо передать управление загрузочному коду активного раздела, либо загрузить в RAM ядро операционной системы и передать ему управление.

Таблица разделов

В таблице разделов хранится информация о типе раздела и его расположении на жёстком диске.

Сигнатура

Последние два байта MBR называются сигнатурой. Значение этих байтов должно быть 55h AAh. В случае, если это не так, запись считается некорректной.

Структура описания раздела

Признак активности разделов

Признак активности раздела - признак, обозначающий возможность загрузки операционной системы с данного раздела. Для стандартных загрузчиков может принимать следующие значения:

  • 80h - раздел является активным;
  • 00h - раздел является неактивным;
  • другие значения являются ошибочными и игнорируются.

Начало раздела / Конец раздела

Координаты начала и конца раздела в CHS -формате (цилиндр, головка, сектор). CHS не позволяет выполнять адресацию более чем к 7,8 ГБ данных, и для адресации к разделам, находящимся за пределами 7,8 ГБ, используется LBA -адресация.

Код типа раздела

Код файловой системы, используемой на данном разделе.

Коды типов разделов
Код Тип раздела
00h Пустая запись
01h 12-битная FAT
04h 16-битная FAT до 32 Мбайт
05h Расширенный раздел
06h 16-битная FAT свыше 32 Мбайт
07h Windows NT NTFS (и некоторые другие - тип определяется по

содержимому загрузочной записи)

0Bh 32-битная FAT
0Ch 32-битная FAT с использованием LBA
0Eh LBA VFAT (то же что и 06h, с использованием LBA)
0Fh Расширенный раздел LBA (то же что и 05h, с использованием LBA)
17h Скрытый раздел NTFS
1Bh Скрытый раздел 32-битной FAT (то же что 0Bh)
1Ch Скрытый раздел 32-битной FAT с использованием LBA (то же что 0Ch)
1Eh Скрытый раздел LBA VFAT (то же что и 06h, с использованием LBA)
82h Linux swap
83h Linux
85h Linux extended
86h Раздел FAT-16 stripe-массива Windows NT
87h Раздел NTFS stripe-массива Windows NT
B6h Зеркальный master-раздел FAT-16 Windows NT
B7h Зеркальный master-раздел NTFS Windows NT
С6h Зеркальный slave-раздел FAT-16 Windows NT
С7h Зеркальный slave-раздел NTFS Windows NT

В случае, если используется расширенный раздел, то координаты начала раздела указывают на EBR.

В этом разделе я расскажу, как написать собственный менеджер мультизагрузки. Менеджер мультизагрузки представляет собой код, находящийся в загрузочном секторе, и по выбору пользователя загружающий любую из нескольких операционных систем, установленных на компьютере. В процессе обсуждения вы познакомитесь с прерыванием INT 13h , таблицей разделов и т.д. Стандартный загрузчик, устанавливаемый большинством операционных систем по умолчанию, слишком примитивен, чтобы его воспринимать всерьез, а нестандартные загрузчики от независимых разработчиков обычно слишком неповоротливы и ненадежны. Вот и давайте напишем свой! Пока мы будем его писать, мы познаем дао и дзен ассемблера, научимся отлаживать программы без отладчика и поближе познакомимся с низкоуровневыми интерфейсами винчестера.

Интерфейс INT 13h

Управлять дисками можно как через порты ввода/вывода, так и через BIOS. Порты намного более могущественны и интересны, однако BIOS программируется намного проще, к тому же она поддерживает большое количество разнокалиберных накопителей, абстрагируясь от конструктивных особенностей каждой конкретной модели. Поэтому будем действовать через нее, а точнее, через интерфейс прерывания INT 13h .

Номер функции заносится в регистр AH . В случае чтения он равен двум. Регистр AL отвечает за количество обрабатываемых секторов. Так как мы собираемся читать по одному сектору за операцию, занесем сюда единицу. Регистр DH хранит номер головки, a DL - номер привода (80h - первый жесткий диск, 81h - второй и т.д.). Пять младших битов регистра CL задают номер сектора, оставшиеся биты регистра CL и восемь битов регистра CH определяют номер цилиндра, который мы хотим прочитать. Регистровая пара ES:BX указывает на адрес буфера-приемника. Вот, собственно говоря, и все. После выполнения команды INT 13h считываемые данные окажутся в буфере, а если произойдет ошибка (например, головка "споткнется" о BAD-сектор), то BIOS установит флаг переноса (carry flag), и мы будем вынуждены либо повторить попытку, либо вывести грустное сообщение на экран.

Код этой программы на языке ассемблера представлен в листинге 5.6.

Листинг 5.6. Код, считывающий загрузочный сектор или расширенную таблицу разделов

MOV SI, 1BEh ; Перейти к первому разделу
MOV AX, CS ; Настраиваем ES
MOV ES, AX
MOV BX, buf ; Смещение буфера
...
read_all_partitions:
MOV AX, bud ; Читать 1 сектор с диска

MOV DH, ; Стартовый номер головки
MOV CX, ; Стартовый сектор с цилиндром INT 13h
JC error ; Ошибка чтения
;Обрабатываем считанный boot-сектор или расширенную таблицу разделов
;===================================================================
;
CMP byte , 80h
JZ LOAD_BOOT ; Это загрузочный сектор
; Передаем на него управление
CMP byte , 05h
JZ LOAD_CHS_EXT ; Это расширенная таблица разделов
; в формате CHS
CMP byte , 0Fh
JZ LOAD_LBA_EXT ; Это расширенная таблица разделов
; в формате LBA
ADD SI, 10h ; Переходим на следующий раздел
CMP SI, 1EEh
JNA read_all_partitions ; Читаем все разделы один за другим
...buf rb 512 ; Буфер на 512 байт

Запись сектора в режиме CHS происходит практически точно так же, только регистр AH равен не 02h , a 03h . С режимом LBA разобраться намного сложнее, но мы, как настоящие хакеры, его обязательно осилим.

Чтение сектора осуществляется функцией 42h(AH = 42h). В регистр DL , как и прежде, заносится номер привода, а вот регистровая пара DS:SI указывает на адресный пакет (disk address packet), представляющий собой продвинутую структуру формата, описанного в табл. 5.4.

Таблица 5.4 . Формат адресного пакета, используемый для чтения и записи секторов в режиме LBA

Смещение Тип Описание
00h BYTE Размер пакета - 10h или 18h
01h BYTE Поле зарезервировано и должно быть равно нулю
02h WORD Сколько секторов читать
04h DWORD 32-разрядный адрес буфера-приемника в формате seg:offs
08h QWORD Стартовый номер сектора для чтения
10h QWORD 64-разрядный плоский адрес буфера-приемника. Используется только в случае, если 32-разрядный адрес равен FFFF:FFFF

Код, читающий сектор в режиме LBA, в общем случае выглядит так, как показано в листинге 5.7.

Листинг 5.7. Код, осуществляющий чтение сектора с диска в режиме LBA

MOV DI, 1BEh ; Перейти к первому разделу
MOV AX, CS ; Настраиваем...
MOV buf_seg ; ...сегмент
MOV EAX, ; Смещение partition относительно
; начала раздела
ADD EAX, EDI ; EDI должен содержать номер сектора
; текущего MBR
MOV ;
...
read_all_partitions:
MOV АН, 42h ; Читать сектор в режиме LBA
MOV DL, 80h ; Читать с первого диска
MOV SI, dap ; Смещение адресного пакета INT 13h
JC error ; Ошибка чтения
...
dap:
packet_size db 10h ; размер пакета 10h байт
reserved db 00h ; "Заначка" для будущих расширений
N_SEC dw 01h ; Читаем один сектор
buf_seg dw 00h ; Сюда будет занесен сегмент буфера-приемника
buf_off dw buf ; Смещение буфера-приемника
X_SEC dd 0 ; Сюда будет занесен номер сектора для чтения
dd 0 ; Реально не используемый хвост
; 64-битного адреса
buf rb 512 ; Буфер на 512 байт

Запись осуществляется аналогично чтению, только регистр AH содержит не 42h , a 43h . Регистр AL определяет режим: если бит 0 равен 1, BIOS выполняет не запись, а ее эмуляцию. Бит 2, будучи взведенным, задействует запись с проверкой. Если регистр AL равен 0, выполняется обыкновенная запись по умолчанию.

Теперь, освоившись с дисковыми прерываниями, перейдем к обсуждению остальных аспектов программирования.

Создаем код загрузчика

Лучше всего загрузчики программируются на FASM. С точки зрения ассемблера загрузчик представляет собой обыкновенный двоичный файл, предельно допустимый объем которого составляет 1BBh (443) байт. Немного? Но не будем спешить с выводами. Всякий раздел всегда начинается с начала цилиндра, а это значит, что между концом MBR и началом раздела имеется, по меньшей мере, n свободных секторов, где n == sectors per track . Практически все современные винчестеры имеют по 64 сектора на дорожку, что дает нам: 443 + 63*512 == 32 699 байт или приблизительно 32 Кбайт. Да в этот объем даже графический интерфейс с мышью уместить можно! Однако делать этого мы не будем. Настоящие хакеры работают в текстовом режиме с командной строкой.

Как уже говорилось, BIOS загружает MBR по адресу 7C00h , поэтому в начале ассемблерного кода должна стоять директива ORG 7C00h , а еще - USE16 , ведь загрузчик выполняется в 16-разрядном реальном режиме. Позже, при желании, он может перейти в защищенный режим, но это будет уже потом. Не будем лезть в такие дебри.

Обнаружив загрузочный раздел (а обнаружить это можно по флагу 80h , находящемуся по нулевому смещению от начала раздела), загрузчик должен считать первый сектор этого раздела, поместив его в памяти по адресу 0000:7C00h , то есть в точности поверх своего собственного тела. А вот это уже нехорошо! И чтобы не вызвать крах системы, загрузчик должен заблаговременно перенести свое тело по другому адресу, что обычно осуществляется командой MOVSB . Копироваться можно по любому из адресов памяти - от 0080:0067h до 9FE00h . Память, расположенную ниже 0080:0067h , лучше не трогать, так как здесь находятся вектора прерываний и системные переменные BIOS, а от A000h и выше начинается область отображения ПЗУ, так что предельно доступный адрес равен A000h - 200h (размер сектора) == 9FE00h .

Не забывайте, что трогать регистр DL ни в коем случае нельзя, поскольку в нем передается номер загрузочного привода. Некоторые загрузчики содержат ошибку, всегда загружаясь с первого жесткого диска, и это в то время, как BIOS уже больше 10 лет как позволяют менять порядок загрузки, и потому загрузочным может быть любой привод.

По правде говоря, FASM - это единственный известный мне ассемблер, "переваривающий" команду дальнего вызова JMP 0000:7C00h напрямую. Все остальные ассемблеры заставляют извращаться приблизительно так: PUSH offset_of_target/PUSH segment_of_target/RETF . Здесь мы заталкиваем в стек сегмент и смещение целевого адреса и выполняем дальний RETF , переносящий нас на нужное место. Еще можно воспользоваться самомодифицирующимся кодом, собрав команду JMP FAR "вручную", или просто расположить целевой адрес в одном сегменте с исходным адресом (например, 0000:7C00h ? 0000:7E00h). Однако эти подходы муторны и утомительны.

В общем, скелет нашего загрузчика будет выглядеть так, как показано в листинге 5.8.

Листинг 5.8. Скелет простейшего загрузчика, написанный на FASM

use16
ORG 7C00h
CLD ; Копируем слева направо
; (в сторону увеличения адресов)
MOV SI,7C00h ; Откуда копировать
MOV DI,7E00h ; Куда копировать
MOV CX,200h ; Длина сектора
REP MOVSB ; Копируем
; // Выбираем раздел, который мы хотим загрузить,
; // считываем его в память по адресу 0000:7C00h
; // (см. листинги 5.7 и 5.6)
JMP 0000:7C00h ; Передаём управление на загрузочный сектор

Записываем загрузчик в главную загрузочную запись

Под старушкой MS-DOS записать свой загрузчик в MBR было просто. Для этого достаточно дернуть прерывание INT 13h , функция 03h (запись сектора). Но под Windows NT этот прием уже не работает, и приходится прибегать к услугам функции CreateFile . Если вместо имени открываемого файла указать название устройства, например, .PHYSICALDRIVE0 (первый физический диск), мы сможем свободно читать и записывать его сектора вызовами ReadFile и WriteFile соответственно. При этом флаг dwCreationDisposition должен быть установлен на значение OPEN_EXISTING , а флаг dwShareMode - на значение FILE_SHARE_WRITE . Еще потребуются права системного администратора, иначе ничего не получится.

Законченный пример вызова CreateFile выглядит, как показано в листинге 5.9.

Листинг 5.9. Открытие непосредственного доступа к жесткому диску под Windows NT

XOR EAX,EAX
PUSH EAX ; hTemplateFile
PUSH dword FILE_ATTRIBUTE_NORMAL ; dwFlagsAndAttributes
PUSH dword OPEN_EXISTING ; dwCreationDisposition
PUSH EAX ; lpSecurityAttributes
PUSH dword FILE_SHARE_WRITE ; dwShareMode
PUSH dword (GENERIC_WRITE OR GENERIC_READ) ; dwDesiredAccess
PUSH DEVICE_NAME ; Имя устройства
CALL CreateFile ; Открываем устройство
INC EAX
TEST EAX,EAX
JZ error
DEC EAX
...
DEVICE_NAME db ".PHYSICALDRIVE0",0
BUF RB 512 ; Буфер

Открыв физический диск и убедившись в успешности этой операции, мы должны прочитать оригинальный MBR-сектор в буфер, перезаписать первые 1BBh байт, ни в коем случае не трогая таблицу разделов и сигнатуру 55h AAh (мы ведь не хотим, чтобы диск перестал загружаться, верно?). Теперь остается записать обновленный код MBR на место и закрыть дескриптор устройства. После перезагрузки все изменения вступят в силу.

Примечание

Правда, вполне возможно, что внесенные вами изменения и не подумают вступать в силу. Загрузчик жестоко мстит за малейшие ошибки проектирования. Поэтому, чтобы не потерять содержимое своих разделов, для начала лучше попрактиковаться на VMWare или любом другом эмуляторе PC.

Под Windows 9x , разумеется, трюк с CreateFile не работает. Но там можно воспользоваться симуляцией прерываний из DMPI или обратиться к драйверу ASPI. Оба способа были подробно описаны в моей книге "Техника защиты компакт-дисков от копирования". Однако, хотя в ней речь идет о CD, а не о HDD, жесткие диски программируются аналогично.

Прежде чем писать собственный загрузчик, рекомендуется изучить существующие нестандартные загрузчики. Все перечисленные ниже загрузчики распространяются по лицензии GPL или BSD, то есть без ограничений.

Ge2000.asm - тщательно прокомментированный Stealth-вирус, подменяющий системный загрузчик своим собственным. Хоть это и вирус, но он не опасен и может быть использован в учебных целях.

Mbr.asm - предельно простой, но полнофункциональный загрузчик с поддержкой разделов свыше 8 Гбайт.

Bootasm - отличный менеджер мультизагрузки с подробными комментариями, переходит в защищенный режим, может грузиться с дискеты, компакт-диска, zip-дискеты, винчестера и т.д. Поддерживает разделы свыше 8 Гбайт, показывает индикатор загрузки и делает множество других полезных вещей, которые не помешает изучить.

Отладка кода загрузчика

Отлаживать код загрузчика невероятно трудно. Загрузчик получает управление задолго до запуска операционной системы, когда никакие отладчики еще не работают. Несколько лет назад это представляло огромную проблему, и при разработке "навороченных" загрузчиков приходилось либо встраивать в них интегрированный мини-отладчик, либо выискивать ошибки вручную, изучая листинги с карандашом в руке. С появлением эмуляторов все изменилось. Достаточно запустить такой эмулятор, как BOCHS (рис. 5.5), и вы сможете отлаживать загрузчик как и любую другую программу!


Рис. 5.5 . Внешний вид эмулятора BOCHS в процессе отладки загрузочного сектора

Программирование загрузчиков - одна из тех немногих областей, в которых применение ассемблера действительно обоснованно. Языки высокого уровня для этого слишком абстрагированы от оборудования. Кроме того, они недостаточно гибки. Вот почему хакеры так любят возиться с загрузчиками, добавляя сюда множество новых возможностей, включая автоматическую загрузку с CD-ROM или дисков SCSI, противодействие вирусам, парольную защиту с шифрованием данных и т.д. Здесь действительно есть, где развернуться, и есть на чем показать все свои возможности. В качестве дополнительного чтения я рекомендовал бы вам несколько весьма интересных источников. Вот они:

? MBR and OS Boot Records - масса интересного материала по MBR (на английском языке): http://thestarman.narod.ru/asm/mbr/MBR_in_detail.htm ;

? BOCHS - отличный эмулятор со встроенным отладчиком, значительно облегчающий процесс "пуско-наладки" загрузочных секторов. Бесплатен, распространяется с исходными текстами: http://bochs.sourceforge.net ;

? http://www.koders.com (рис. 5.6) - отличный поисковик, нацеленный на поиск исходных кодов, по ключевому слову MBR выдает огромное количество загрузчиков на любой вкус;


Рис. 5.6 . Поиск исходных текстов загрузчиков MBR на сайте Koders

? Ralf Brown Interrupt List (рис. 5.7) - знаменитый "Список прерываний" (Interrupt List) Ральфа Брауна (Ralf Brown), описывающий все прерывания, включая недокументированные (на английском языке): http://www.pobox.com/~ralf ;


Рис. 5.7 . Просмотр легендарного "Списка прерываний" Ральфа Брауна

OpenBIOS - проект "Открытого BIOS", распространяемого в исходных текстах. Помогает понять некоторые неочевидные моменты обработки системного загрузчика: http://www.openbios.info/docs/index.html .

15.5. Восстановление главной загрузочной записи ( MBR )

Сектор диска, в котором хранится его таблица разбиения, или главная загрузочная запись ( MBR - Master Boot Record ) , является самой важной зоной накопителя. В этом секторе емкостью 512 байт содержатся описания логических разделов (не более четырех) , а также инструкция по запуску операционной системы. Если MBR окажется поврежденной, система не сможет даже опознать жесткий диск не говоря уже о том, чтобы загрузиться с него. К сожалению, потерянную главную загрузочную запись восстановить чрезвычайно трудно (с возможностью доступа ко всем хранящимся на жестком диске данным) . Однако существует несколько программ, позволяющих в некоторых случаях реконструировать эту важную область диска. К ним относятся пакет Norton Utilities для Windows , программы MIRROR ( DOS 5.0) и UNFORMAT ( DOS 6.2 x ) для дисков с файловыми системами FAT 16, а также программа FDISK - последнее средство восстановления поврежденной главной загрузочной записи.

15.5.1. Программы MIRROR и UNFORMAT

Застраховаться от неприятных последствий всегда проще, чем потом их преодолевать - эта прописная истина справедлива и для процесса восстановления данных. Если в системе установлена операционная система DOS версии 5.0 или более поздней, то для сохранения резервной копии и последующего восстановления главной загрузочной записи можете воспользоваться двумя программами: MIRROR . EXE и UNFORMAT . COM . Пока жесткий диск еще не вышел из строя, введите следующую команду: MIRROR / PARTN

Программа MIRROR входила только в состав DOS 5.0, а в последующих версиях ОС от нее по непонятным причинам отказались. Однако ее можно позаимствовать со старых дистрибутивов или поискать в архивах Интернет.

После запуска программа MIRROR запросит имя дисковода. Вставьте загрузочную дискету в дисковод А: или В: и дайте указание программе создать копию таблицы разбиения жесткого диска на этой дискете. Проделывая такую операцию регулярно (скажем, раз в полгода) , вы всегда будете иметь в запасе “спасательную” дискету на случай возникновения неприятностей с жестким, диском. Если его MBR окажется поврежденной, то загрузите компьютер с упомянутой дискеты (на нее, помимо таблицы разбиения, должен быть скопирован еще и файл UNFORMAT . COM ) и введите команду

UNFORMAT / PARTN Программа UNFORMAT попросит указать местонахождение и имя файла с резервной копией MBR (обычно он называется RARTNSAV . FIL ) . Введите буквенное обозначение накопителя (А: или В:) , в котором находится дискета с этим файлом, и работа программы продолжится. Если у вас нет сомнений в достоверности сохраненных данных о разбиении диска, то подтвердите свое желание их восстановить, а затем перезагрузите компьютер с жесткого диска. Если на нем была повреждена только главная загрузочная запись, то компьютер должен работать нормально.

Нет необходимости регулярно копировать главную загрузочную запись. Она изменяется только при переформатировании диска, поэтому достаточно создать ее резервную копию один раз непосредственно после этой процедуры.

15.5.1.1. Использование программы FDISK с ключом / MBR

Вы, по видимому, читали и слышали, что программу FDISK нельзя использовать для восстановления данных, поскольку она вносит такие изменения в структуру диска, после которых ранее хранившаяся на нем информация становится недоступной. Это правда - но не вся. В этой программе предусмотрена недокументированная функция, позволяющая восстановить загрузочный код в начале MBR , не затрагивая саму таблицу разбиения. Если главную загрузочную запись не удается реконструировать никакими другими средствами, то можно воспользоваться командой FDISK / MBR и попытаться восстановить хотя бы ее часть. Запущенная с ключом / MBR , программа FDIS К работает автоматически. На экран не будет выведено даже ее меню - программа просто восстановит код в начале MBR и вернет управление операционной системе DOS . Учитывая потенциальную опасность программы FDISK , использовать эту недокументированную возможность можно лишь в качестве последнего средства восстановления главной загрузочной записи. В результате выполнения команды FDISK / MBR ваши данные, по идее, не должны потеряться, но всякое бывает! Поэтому, прежде чем идти на крайние меры, создайте резервную копию максимально возможного количества данных с жесткого диска.

Пользуйтесь только той версией программы FDISK , которая соответствует вашей операционной системе. Например, если в компьютере установлена ОС Windows 98, то запустите на исполнение файл FDISK . EXE , записанный на стартовом диске Windows 98.

15.5.2. Программа RESCUE PROFESSIONAL

Что же делать в тех случаях, когда вам необходимо добраться доданных, хранящихся на жестком диске, но сведения о его разбиении потеряны и не поддаются восстановлению, или на экран выводится сообщение наподобие Track 0 bad , disk unusable (нулевая дорожка повреждена, диск использовать невозможно) ! Rescue Professional компании AllMicro является автономным (самозагружающимся) средством для восстановления данных, причем его программная часть разработана таким образом, что взаимодействует непосредственно с аппаратными средствами компьютера и позволяет восстанавливать как отдельные файлы, так и целые директории. В отличие от описанных ранее процедур восстановления данных, при выполнении которых предпринимаются попытки в той или иной степени восстановить работоспособность накопителей, Rescue Professional не корректирует поврежденные таблицы разбиения или загрузочные записи DOS . Единственная цель этой программы - обеспечить управление накопителем (если, конечно, он исправен) и восстановить максимально возможное количество файлов из тех, что ей удастся обнаружить на диске.

15.5.3. Восстановление данных после случайного переформатирования диска

В процессе высокоуровневого форматирования, выполняемого с помощью программы FORMAT , перезаписывается загрузочный сектор и корневой каталог диска. Кроме того, при форматировании проверяется надежность записи и считывания данных во всех кластерах, и сведения о поврежденных ячейках размещения данных заносятся в FAT . По идее, форматирование является разрушающим процессом, т.е. записанные на диске данные после его выполнения становятся недоступными. Однако сами они никуда не исчезают. Это означает, что даже после случайного форматирования раздела диска, хранившиеся на нем данные еще можно спасти. В операционной системе Windows нет собственных средств для восстановления данных на случайно переформатированном диске, но существуют другие программы, позволяющие сохранить копии данных из системных областей дисков и при необходимости использовать их для восстановления испорченных разделов. Если вы работаете в среде DOS 6.2 x , то можете воспользоваться для этих целей программой UNFORMAT (позаимствованной из пакета PC Tools фирмы Central Point ) . Например, для восстановления прежнего состояния диска С:, введите команду unformat с: Учтите одно важное обстоятельство: программу UNFORMAT нужно запускать сразу после форматирования, пока таблица размещения файлов еще пуста. Это является необходимым условием успешного выполнения программы UNFORMAT . Появление на диске новых файлов может нарушить ее работу и не позволить ей восстановить прежние данные.

15.5.3.1. Программа EasyRecovery

Если жесткий диск выходит из строя, то его обычно отправляют в специализированную мастерскую. Там накопитель приводят в такое состояние, чтобы с него можно бы было считать данные. Если же аппаратная часть накопителя в порядке, то можно воспользоваться программой EasyRecovery фирмы Ontrack для спасения данных, добраться до которых иными способами не удается. Эта программа предназначена для восстановления информации самими пользователями и позволяет реконструировать файловые структуры дисков (в том числе и в разделах, размеры которых превышают 8,4Гбайт) . EasyRecovery не пытается исправить повреждения на самом диске и ничего на него не записывает. Таблица размещения файлов восстанавливается в памяти компьютера, после чего данные пересылаются в другой накопитель (например, на второй жесткий диск) . В этом разделе рассматриваются основные возможности программы EasyRecovery и приводятся некоторые практические рекомендации по ее применению.

В большинстве случаев процесс восстановления данных происходит без вашего участия. Вам нужно выбрать файлы, а уж восстановятся они или нет - зависит не от вас. Тем не менее, существует несколько правил, при соблюдении которых можно добиться наилучших результатов.

· Залогом успешного восстановления данных является регулярное создание резервных копий ваших рабочих данных. Даже если вам придется переустановить операционную систему и все приложения, то при наличии такой копии вы сможете быстро восстановить ситуацию и продолжить работу. Если у вас такой копии не окажется, и вы не можете восстановить данные на диске, то вся проделанная вами работа пойдет насмарку.

· Прежде чем бросаться восстанавливать данные, проверьте, правильно ли установлены в BIOS параметры накопителя. Изменение параметров геометрической модели жесткого диска обычно приводит к тому, что он (или его часть) становится недоступным. В некоторых случаях “восстановление данных” может свестись лишь к настройке параметров BIOS .

· Не пользуйтесь сразу несколькими программами восстановления данных. Например, не стоит запускать CHKDSK перед использованием программы EasyRecovery . Более мощные средства восстановления данных могут неправильно интерпретировать результаты работы таких простых программ, как CHKDSK ..

· Заранее подготовьте резервный накопитель, на который будут записываться восстановленные данные (другой накопитель на жестком диске, сетевой диск, накопитель типа Jaz или Zip ) . На нем должно быть достаточно свободного места для размещения восстановленных файлов (при использовании дисководов типа Jaz или Zip запаситесь достаточным количеством сменных носителей) .

· Выделите достаточный объем оперативной памяти для временного хранения восстановленных данных (там они будут находиться до момента их переноса в резервный накопитель) . Если в качестве оперативной памяти используется часть пространства жесткого диска (файл подкачки) , то убедитесь в том, что на нем имеется достаточно свободного места - и никогда не размещайте файл подкачки на восстанавливаемом (т.е. не вполне надежном) диске.

· Программы восстановления данных могут работать достаточно долго. Будьте готовы к тому, что частью своего рабочего времени вам придется пожертвовать (вряд ли вам удастся поработать на компьютере, пока будет идти восстановление файлов) .

· Перед тем как воспользоваться программой восстановления данных, убедитесь в том, что она совместима с файловой системой интересующего вас раздела жесткого диска ( FAT 16, FAT 32 или NTFS ) и способна обрабатывать тома соответствующего размера. Если программа не подходит по одному из параметров, то попытка ее использования может окончательно похоронить все надежды на восстановление потерянных данных - в результате работы такой программы они будут уничтожены окончательно. Убедитесь в том, что программа восстановления данных обновлена до последней версии (или, по крайней мере, в ней исправлены ошибки) .

· Во избежание неприятных последствий подключите компьютер - по крайней мере, на время восстановления данных - к источнику бесперебойн ого питания.

Лучшие статьи по теме