Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #79, ИЮЛЬ 2005 г.

Стряпаем MBR

Крис Касперски ака мыщъх

Хакер, номер #079, стр. 079-114-2


Со смещения 1BEh начинается Таблица Разделов, представляющая собой массив из четырех записей типа partition. Каждая запись описывает свой логический диск, что позволяет нам создавать до четырех разделов на каждом HDD. Динамические диски, впервые появившиеся в W2K, хранятся в Базе Менеджера Логических Дисков (Logical Disk Manager Database) и в таблице разделов присутствовать не обязаны.

В общем, устройство Главного Загрузочного Сектора выглядит примерно как в таблице 1.

Таблица Разделов — это святая святых операционной системы. Каждая запись partition состоит из: адресов начала и конца раздела, типа раздела (NTFS, FAT16, FAT32…), а также количества секторов и флага «загружечности» раздела.

Все адреса задаются либо в CHS (Cylinder-Head-Sector — Цилиндр-Головка-Сектор), либо в LBA-формате (Logical Block Address — Логический Адрес Блока). Как это производится конкретно, определяется типом раздела (Boot ID), записанным в 04h байте. Количество существующих типов огромно, в таблице 3 приведены лишь самые популярные из них.

В CHS-формате, 01h и 05h байты partition'а хранят номер первой и последней головки раздела (см. таблицу 2). Байты 02h и 06h хранят пять младших бит начального/конечного сектора и по два старших бита номера цилиндра, оставшиеся биты лежат в следующем байте. Получается довольно запутанная схема, да к тому же адресующая только первые 8 Гбайт дискового пространства (CHS-адрес занимает три байта, или 24 бита, что при длине сектора в 512 байт дает 512*224 = 8.589.934.592 байт). Ха! Да жесткие диски преодолели этот барьер еще в прошлом веке! Это было достигнуто за счет введения LBA-адресации, последовательно нумерующей все сектора от 0 и до многодетной матери. В ней начало раздела хранится в виде смещения первого сектора раздела от начала partition в 32-битном поле relative offse. Конец раздела в явном виде нигде не записывается, вместо этого в специальном 32-битном поле partition size указывается количество секторов в разделе. Как нетрудно подсчитать, предельно допустимый размер одного раздела составляет 512*232 = 2.199.023.255.552 байт или 2,048 Гбайт, а совокупный объем всего диска вообще не ограничен! Так что для сегодняшних нужд LBA-адресации вполне достаточно, а там уж мы что-нибудь придумаем.

Четыре раздела partition обслуживают до четырех логических дисков, а больше уже никак. На большее в MBR просто не хватает места! Но ведь хорошо известно, что FDISK может разбивать винчестер хоть на 26 разделов. Как же ему это удается? А вот как! Помимо Основной Таблицы Разделов, хранящейся в MBR, мы можем создавать любое количество Расширенных Таблиц Разделов (Extended Partition Table), разбрасываемых по всему диску.

Если структура partition имеет тип 05h или 0Fh, она указывает совсем не на начало раздела, а на следующий MBR. Вернее, не совсем на MBR, но на нечто очень похожее на него. В нем присутствует полноценная Таблица Разделов с четырьмя входами (partition 1, partition 2, partition 3 и partition 4), каждая из которых указывает либо на логический диск, либо на новый MBR. Длина такой цепочки практически не ограничена и вполне может превышать 26. Однако назначить буквы всем последующим разделам уже не удастся и под Windows 9x они будут просто не видны. Windows NT поддерживает гибридный механизм наименования разделов — по буквам и по именам, поэтому ей эти ограничения не страшны.

Назад на стр. 079-114-1  Содержание  Вперед на стр. 079-114-3