вторник, 12 мая 2009 г.

Master boot record – базовые концепции

Первые жесткие диски были небольшого (даже по тем временам) размера и форматировались практически так же, как и дискеты, однако их объемы стремительно росли и MS-DOS уже не могла их целиком адресовать. Для преодоления этого ограничения был введен механизм разделов (partitions), разбивающий один физический диск на несколько логических, каждый из который имел свою собственную файловую систему и форматировался независимо от других. За счет чего это достигается?

В первом секторе физического диска (цилиндр 0/головка 0/сектор 1) хранится специальная структура данных – maser boot record (главная загрузочная запись) или сокращенно MBR. Она состоит из двух основных частей – первичного загрузчика (master boot code) и таблицы разделов (partition table), описывающей схему разбиения и геометрию каждого из логических дисков. В конце сектора по смещению 1FE находится сигнатура 55h AAh, по которой BIOS определяет признак "загрузочности" сектора. Даже если вы не хотите дробить свой винчестер на части и форматируете его как один диск, присутствие maser boot record обязательно.

При старте компьютера, BIOS выбирает загрузочный винчестер (обычно Primary Master, но порядок загрузки в большинстве BIOS'ов можно изменять, а самые продвинутые из них при удержании ESC по время прохождения post'а (процесса начального тестирования оборудования) даже выводят интерактивное меню), считывает первый сектор (цилиндр 0/головка 0/сектор 1) в память по адресу 0000h:7C00h, проверяет наличие сигнатуры 55h AAh в его конце и если такая сигнатура действительно обнаруживается передает управление на 0000h:7C000h. В противном случае анализируется следующее загрузочное устройство, а если таковое отсутствует – выдается ругательное сообщение.

Первичный загрузчик, получив управление, сканирует partition table (которая уже загружена в память!), находит активный раздел (Boot Indicator === 80h), извлекает номер стартового сектора раздела, так же называемого boot-сектором, загружает его в память по адресу 0000h:7C00h (предварительно переместив свое тело в другое место, чтобы избежать затирания), убеждается в наличие сигнатуры 55h AAh, передавая управление по 0000h:7C00h, в противном случае выдается ругательное сообщение и после нажатия на клавишу компьютер перезагружается. Некоторые загрузчики поддерживают несколько активных разделов, последовательно перебирая их один за другим, но это уже отсебятина разработчиков, выходящих за стандартные спецификации Microsoft, что, впрочем, никого не смущает.

Если первичный загрузчик поврежден, то BIOS не сможет запустить операционную систему с такого диска, однако, при подключении его "вторым" (или загрузке с дискеты) все логические диски будут доступны. Как минимум они должны быть "видны", т. е. команды C:, D:, . E: выполняются нормально, правда работоспособность команды dir уже не гарантируется. Во-первых, для этого файловая система соответствующего раздела должна быть известна загруженной операционной системе и не повреждена, а, во-вторых, должен быть цел boot-сектор (но об этом позже).

Partition Table, которую анализирует master boot code, а чуть позже – драйвер логических дисков операционной системы, состоит из четырех 10h записей, расположенных по смещению 1BEh, 1CEh, 1DEh, 1EEh байт от начала диска соответственно. Каждая из них описывает свой логический раздел, задавая его стартовый и конечный сектора, записанные в CHS-формате (да! даже если диск работает в LBA-режиме, патриции все равно адресуются через CHS!). Поле относительное смещение раздела, отсчитываемое от начала таблицы разделов, является вспомогательным и его избыточность очевидна. Тоже самое относится и полю с общим количеством секторов на диске – как будто это нельзя вычислить на основе стартового и конечного секторов! Одни операционные системы и загрузчики игнорируют вспомогательные поля, другие же их активно используют, поэтому они должны соответствовать действительности.

Поле идентификатора диска содержит уникальную 32-разрядную последовательность, помогающую операционной системе отличить один смонтированный диск от другого и автоматически копирующую в следующий ключ реестра: HKLM\SYSTEM\MountedDevices. На самом деле, Windows свободно обходится и без него, поэтому содержимого этого поля некритично.

Поле Boot ID содержит идентификатор файловой системы, установленной на разделе, который в случае NTFS равен 07h. За динамическими дисками, согласно фирменной спецификации, закреплен идентификатор 42h. На самом деле, это справедливо лишь для тех из них, что получены путем обновления (update) обычного раздела до динамического. Сведения об остальных динамических дисках в таблице разделов не хранятся, а содержатся в последнем мегабайте физического диска в LDM-базе, и для стандартных дисковых менеджеров они не видны. При установке операционной системы семейства Windows 9х или UNIX на винчестер, содержащий динамические диски, они могут быть необратимо утеряны, поскольку согласно таблице разделов занятое ими пространство отмечено как свободное. Тем не менее, загрузочный логический диск (независимо от того динамический он или нет) в обязательном порядке должен присутствовать в partition table, иначе BIOS не сможет его загрузить.

Четырех записей partition table, обеспечивающих всего четыре логических диска, явно не хватало, но расширять таблицу разделов было уже некуда – последняя запись упиралась в конец сектора, а использовать следующий сектор разработчиком не хотелось, поскольку его активно использовали многие вирусы и нестандартные драйвера, к тому же это все равно не решало проблемы, а лишь оттягивало конец. Тогда инженеры нашли другое решение, предложив концепцию расширенных разделов (Extended partition). Если boot ID некоторого раздела равен 05h или 0Fh, он трактуется как "виртуальный физический диск", со своей собственной partition table, расположенной в его начале, на которую и указывает стартовый сектор расширенного раздела. Короче говоря, таблица разделов получается вложенной и уровень вложения ограничен разве что свободным местом жесткого диска и количеством стековой памяти загрузчика (при условии, что он использует рекурсивный алгоритм сканирования). Таблица разделов как бы размазывается вдоль винчестера. Большинство утилит резервирования сохраняют лишь первый сектор, чего явно недостаточно (впрочем, первый сектор гибнет намного чаще других, так что даже плохая политика резервирования лучше, чем совсем ничего).

Штатные утилиты разбивки (FDISK.EXE, Disk Manager) в каждой таблице разделов создает один основной и один расширенный раздел. Т. е. если при разбиении винчестера на четыре логических диска, на нем образуется четыре partition table, хотя в данном случае можно было бы обойтись и одной. Штатный загрузчик FDISK'а требует, чтобы активный раздел находится в первом секторе partition table, "благодаря" чем операционная система может грузиться только с диска C:. Нестандартные менеджеры, анализирующие всю цепочку разделов, позволяют загружаться с любого из разделов. Самые честные из них создают в первой partition table еще один раздел (благо если диск был разбит FDISK'ом свободное место там всегда есть), назначают его активным и помещают в него свое тело. Другие же внедряются непосредственно в MBR, замещая первичный загрузчик, что создает очевидные проблемы совместимости.

Если таблица разделов повреждена, логические диски скорее всего будут полностью недоступны – они отсутствуют в "Моем Компьютере", не появился в панели "Driver" файлового менеджера FAR'а, а команда C: вызывает ошибку. Искажение таблицы разделов не приводит к немедленному изменению объема уже отформатированных томов (т. к. он храниться в boot-секторе и картах свободного пространства), но при последующим переформатировании произойдет затирание данных из соседнего раздела, или же текущий раздел окажется усечен. Кстати говоря, если расширенный раздел указывает сам на себя или на один из предшествующих разделов в цепочке, все известные мне операционные системы наглухо зависнут еще на этапе загрузки, даже если диск подключен "вторым". Чтобы исправить ситуацию, необходимо запустить редактор диска или другую утилиту, а для этого необходимо загрузить операционную систему! Существует несколько путей выхода из этой, казалось бы неразрешимой проблемы. Самое простое – горячее подключение диска на ходу с последующей работой с ним через BIOS или порты ввода/вывода. Если ни диск, ни материнская плата не умет (а для IDE-устройств подключение "на лету" представляется довольно жестким испытанием!), вы сможете запустить доктора и работать с диском на физическом уровне. Другой, чисто хакерский, путь – пропатчить MS-DOS, изменив сигнатуру 55h AAh на что-нибудь еще, тогда она не сможет распознать таблицу разделом и стало быть, не станет ее анализировать. Как вариант можно записать в boot-сектор дискеты специально подготовленную программу, которая обнуляет MBR или искажает сигнатуру, расположенную в его конце. Просто загрузитесь с нее и все!

 

смещение

размер

назначение

0x000

перемен.

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

1x1BB

4h

идентификатор диска

0x1BE

10h

Partition 1

0x1CE

10h

Partition 2

0x1DE

10h

Partition 3

0x1EE

10h

Partition 4

0x1FE

0x2

признак таблицы разделов  сигнатура 55h Aah

Таблица 2 формат MBR

 

смещение

разм.

назначение

000

1BE

1CE

1DE

1EE

byte

флаг активного загрузочного раздела. (Boot Indicator)

80– загрузочный раздел, 00– не загрузочный

001

1BF

1CF

1DF

1EF

 

стартовая головка раздела

002

1C0

1D0

1E0

1F0

byte

стартовый сектор раздела (биты 0 – 5)

старшие биты стартового цилиндра (биты 6-7)

003

1C1

1D1

1E1

1F1

byte

младшие биты стартового цилиндра (биты 0-7)

004

1C2

1D2

1E2

1F2

byte

идентификатор системы (Boot ID), см. таблицу.4

005

1C3

1D3

1E3

1F3

byte

конечная головка раздела

006

1C4

1D4

1E4

1F4

byte

конечный сектор раздела (биты 0 – 5)

старшие биты конечного цилиндра (биты 6-7)

007

1C5

1D5

1E5

1F5

 

младшие биты конечного цилиндра (биты 0-7)

008

1C6

1D6

1E6

1F6

dword

смещение раздела относительно начала таблицы разделов в секторах

00С

1CA

1DA

1EA

1FA

dword

кол-во секторов раздела

Таблица 3 формат partition

 

Boot ID

тип раздела

00h

раздел свободен

0x01

FAT12 (менее чем 32.680 секторов в томе или 16 Мбайт)

0x04

FAT16 (32,680-65,535 секторов или 16-33 Мбайт)

0x05

расширенный раздел (extended partition)

0x06

BIGDOS FAT16 раздел (33 Мбайт – 4 Гбайт)

0x07

NTFS-раздел

0x0B

FAT32 раздел

0x0C

FAT32 раздел с поддержкой расширенной BIOS INT 13h

0x0E

BIGDOS FAT16 раздел с поддержкой расширенной BIOS INT 13h

0x0F

расширенный раздел с поддержкой расширенной BIOS int 13h

0x12

EISA раздел

0x42

динамический диск

0x86

legacy FT FAT16 раздел

0x87

legacy FT NTFS раздел

0x8B

Legacy FT volume formatted with FAT32 *

0x8C

Legacy FT volume using BIOS INT 13h extensions formatted with FAT32

Таблица 4 возможные значения Boot ID

 

Sector Inspector                 Copyright Microsoft Corporation 2003

===========================================================================

Target - \\.\PHYSICALDRIVE0 

                1867  Cylinders

                 255  Heads            

                  63  Sectors Per Track

                 512  BytesPerSector   

                  12  MediaType        

 

LBN 0   [C 0, H 0, S 1]

===========================================================================

                             Master Boot Record

===========================================================================

| B | FS TYPE |       START    |        END     |            |            |

| F |  (hex)  |   C     H     S|   C     H     S|  RELATIVE  |    TOTAL   |

===========================================================================

| * |   07    |   0     1     1| 764   254    63|          63|    12289662|

|   |   0f    | 765     0     1|1023   254    63|    12289725|    17687565|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

===========================================================================

 

LBN 12289725   [C 765, H 0, S 1]

===========================================================================

                            Extended Boot Record

===========================================================================

| B | FS TYPE |       START    |        END     |            |            |

| F |  (hex)  |   C     H     S|   C     H     S|  RELATIVE  |    TOTAL   |

===========================================================================

|   |   07    | 765     1     1|1023   254    63|          63|     8193087|

|   |   05    |1023     0     1|1023   254    63|     8193150|     4096575|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

===========================================================================

 

LBN 20482875   [C 1275, H 0, S 1]

===========================================================================

                            Extended Boot Record

===========================================================================

| B | FS TYPE |       START    |        END     |            |            |

| F |  (hex)  |   C     H     S|   C     H     S|  RELATIVE  |    TOTAL   |

===========================================================================

|   |   07    |1023     1     1|1023   254    63|          63|     4096512|

|   |   05    |1023     0     1|1023   254    63|    12289725|     5397840|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

===========================================================================

 

LBN 24579450   [C 1530, H 0, S 1]

===========================================================================

                            Extended Boot Record

===========================================================================

| B | FS TYPE |       START    |        END     |            |            |

| F |  (hex)  |   C     H     S|   C     H     S|  RELATIVE  |    TOTAL   |

===========================================================================

|   |   07    |1023     1     1|1023   254    63|          63|     5397777|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

|   |   00    |   0     0     0|   0     0     0|           0|           0|

===========================================================================

Листинг 4 пример таблицы разделов, сформированный программой FDISK

Комментариев нет:

Отправить комментарий