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

Стряпаем MBR

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

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


(FreeBSD@smtp.ru)

Учимся программировать Главный Загрузочный Сектор

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

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

[теоретическая подготовка]

Загрузка системы начинается с того, что BIOS считывает первый сектор жесткого диска, размещает его в памяти по адресу 0000:7С00h и передает туда управление. Программисты называют этот сектор Главным Загрузочным (Master Boot Record, сокращенно MBR). В начале MBR расположен машинный код загрузчика. Следом за ним идет Таблица Разделов (Partition Table), описывающая схему разбиения логических дисков. В конце же сектора находится сигнатура 55h AAh, говорящая BIOS'у о том, что это действительно MBR, а не что-нибудь еще.

Загрузчик должен проанализировать Таблицу Разделов, найти предпочтительный логический диск, считать его первый сектор (он называется просто загрузочным — boot) и передать ему бразды правления. Вот минимум требований, предъявляемых к стандартному загрузчику, главный недостаток которого заключается в том, что на каждом логическом диске может быть установлена только одна операционная система. Причем она должна быть установлена непременно на Primary Master'е. В противном случае загрузчик ее просто «не увидит» и нам придется менять порядок загрузки в BIOS Setup, что слишком хлопотно и утомительно. При желании возможно освободить наш загрузчик от всех этих глупых ограничений. Однако прежде чем зарываться вглубь, окинем MBR беглым взглядом.

Воспользовавшись любым редактором диска (например Microsoft Disk Probe из комплекта Resource Kit, прилагаемого к лицензионной Windows), считаем первый сектор физического диска. Он должен выглядеть приблизительно так, как скриншоте.

Первые 1BBh байт занимают код и данные загрузчика, среди которых отчетливо выделяются текстовые строки (кстати говоря, русифицировав сообщения загрузчика, Microsoft допустила грубейшую стратегическую ошибку: никакого кириллического шрифта в BIOS'е нет, и русские символы выглядят бессмысленной абракадаброй).

По смещению 1BBh расположен четырехбайтовый идентификатор диска, принудительно назначаемый Windows при запуске Disk Manager'а. Коварство Microsoft не знает границ! Еще со времен первых IBM PC (тогда они назывались XT) загрузчик владел первыми 1BEh байтами MBR-сектора и довольно многие загрузчики (и вирусы!) использовали эти байты на всю катушку. Нетрудно сообразить, что произойдет, если внутрь загрузчика вдруг запишется идентификатор. Это убьет его! Поэтому байты 1BBh ? 1BEh лучше не трогать.

Содержание  Вперед на стр. 079-114-2