www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал «Системный администратор»
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Авторам
Рекламодателям
О НАС
   

  Опросы
  Статьи

Мониторинг  

Какая задача мониторинга отнимает больше всего времени?

Многие системные администраторы тратят до 30% рабочего времени на рутину мониторинга. Но

 Читать далее...

Рынок труда  

Какие навыки вы хотите развивать в 2026 году?

Рынок труда меняется быстро. Еще вчера его называли рынком соискателей, а сегодня

 Читать далее...

Книжная полка  

От сисадмина до архитектора: книги, которые прокачают ваш стек в этом году

Новинки от издательства «БХВ» отличаются тем, что в них часто делается упор

 Читать далее...

Автоматизация  

Автоматизируем рутину: что реально работает?

Многие сисадмины автоматизировали что-то за последний год. Но далеко не все остались

 Читать далее...

Защита ИТ-системы  

Практическая защита: что вы внедрили и что мешает?

Какие меры безопасности реально внедрить в реальных условиях – и что не

 Читать далее...

Вопрос-ответ  

Обеспечиваем безопасную эксплуатацию базы данных

Что для вас чаще всего является причиной инцидентов с БД? Как вы

 Читать далее...

Книжная полка  

От «безопасного» Linux до Контролируемого взлома

Издательство «БХВ» продолжает радовать читателей интересными новинками и в наступившем году. Вы можете

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 14557
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 14684
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 12152
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 6386
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 7222
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 7129
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 9929
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 6567
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 6774
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 10956
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 14458
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 15871
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 18521
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 13371
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 11358
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 9587
Комментарии: 4
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 7815
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 6675
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 6235
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 6614
Комментарии: 1
Рецензия на книгу «MongoDB в действии»

 Читать далее...

Друзья сайта  

 Восстановление данных на NTFS-разделах. Часть 2

Архив номеров / 2004 / Выпуск №10 (23) / Восстановление данных на NTFS-разделах. Часть 2

Рубрика: Карьера/Образование /  Образование

КРИС КАСПЕРСКИ

Восстановление данных на NTFS-разделах

Часть 2

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

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

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

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

Рисунок 1. Схематичное представление разбитого диска

Рисунок 1. Схематичное представление разбитого диска

При старте компьютера BIOS выбирает загрузочный винчестер (обычно Primary Master, но порядок загрузки в большинстве BIOS можно изменять, а самые продвинутые из них при удержании ESC во время прохождения post (процесса начального тестирования оборудования) даже выводят интерактивное меню), считывает первый сектор в память по адресу 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-разрядную последовательность, помогающую операционной системе отличить один смонтированный диск от другого и автоматически копирующую в следующий ключ реестра: HKLMSYSTEMMountedDevices. На самом деле Windows свободно обходится и без него, поэтому содержимое этого поля некритично.

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

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

Рисунок 2. Расширенная таблица разделов

Рисунок 2. Расширенная таблица разделов

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

Таблица 1. Формат 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. Формат partition

Смещение

Размер

Назначение

000

1BE

1CE

1DE

1EE

byte

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

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

00h – не загрузочный.

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. Возможные значения Boot ID

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

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

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

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|

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

Master boot record – техника восстановления

Существует множество утилит для автоматического восстановления master boot code и partition table (Get Data Back, Easy Recovery, Active Data Recovery Software и т. д.). До некоторого времени они вполне успешно справлялись со своей задачей, восстанавливая даже полностью уничтоженные таблицы разделов, однако с появлением емких винтов, преодолевших барьер в 2 Гб с помощью всевозможных расширений, они стали часто путаться, и потому доверять им нельзя. Если не хотите потерять свои данные – восстанавливайте MBR самостоятельно (тем более что это достаточно простая операция, не требующая особой квалификации). Восстановление значительно упрощается, если в вашем распоряжении имеется копия таблицы разделов, снятая Sector Inspector или подобными ей утилитами. Однако чаще всего ее все-таки нет…

Если операционная система отказывается загружаться, а на экране появляется ругательство от BIOS типа «Disk Boot failure, NonSystem disk or disk error... Press Enter to restart», это указывает на разрушение сигнатуры 55h AAh, обычно сопровождаемое смертью первичного загрузчика. Внимание! Очень важно отличать сообщение BIOS от сообщений первичного загрузчика и boot-сектора. Зайдите в BIOS Setup и отключите все загрузочные устройства, оставив активным только диск A: с вытащенной дискетой. А теперь перезагрузитесь и запомните, какое сообщение появится на экране. Это и будет ругательством BIOS.

Восстановить сигнатуру 55h AAh можно в любом дисковом редакторе. Когда будете это делать, убедитесь, что в начале диска присутствуют осмысленный master boot code (если вы испытываете затруднение с дизассемблированием в уме, воспользуйтесь IDA PRO или HIEW). Вы не умеете дизассемблировать? Тогда попробуйте оценить степень «нормальности» первичного загрузчика визуально (однако для этого опять-таки требуется опыт работы с кодом). В начале более или менее стандартного загрузчика расположено приблизительно 100h байт машинного кода, в котором обнаруживаются последовательности: 00 7С, 1B 7C, BE 07, CD 13, CD 18, CD 10, 55 AA, а затем идут характерные текстовые сообщения: «Invalid partition table, Error loading operating system, Missing operating system...» ну или подобные им. Если загрузчик поврежден, но сигнатура 55 AA цела, то попытка загрузки с такого диска обернется неизменным зависанием.

Восстановить «слетевший» или искореженный первичный загрузчик можно с помощью утилиты FDISK.EXE, запущенной с ключом /MBR, записывающей в главную загрузочную запись первого диска стандартный master boor code, или командой FIXMBR консоли аварийного восстановления в Windows 2000 (недокументированный ключ /CMBR, появившийся в MS-DOS 7.0, позволяет выбирать любой из подключенных дисков). Внимание! Если вы использовали нестандартный загрузчик (такой, например, как LILO), то после перезаписи MBR сможете загружаться только с основного раздела, а для запуска операционных систем из других разделов вам придется переустановить свой мультизагрузочный менеджер (вообще-то такой менеджер можно написать и самостоятельно, при наличии HIEW, а лучше использовать транслятор ассемблера – работа не займет и получаса).

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

Если загрузчик говорит «Invalid partition table», это еще не значит, что таблица разделов повреждена, просто ни один из основных разделов не назначен активным. Такое случается при использовании нестандартных загрузчиков, загружающих операционную систему из расширенного раздела. После выполнения команды FDISK /MBR или при установке операционной системы, автоматически заменяющей первичный загрузчик своим собственным, он не обнаружит в пределах досягаемости ни одного активного раздела, и, естественно, разразится многоэтажным ругательством. Такое поведение, в частности, характерно для Windows 98. Для решения проблемы либо восстановите прежний загрузчик, либо установите операционную систему на первичный раздел и, запустив FDISK, сделайте его активным.

Загрузитесь с системной дискеты (другого винчестера, CD-диска) и посмотрите, видны ли ваши логические диски или нет. Если да, то смело переходите к следующему пункту, в противном случае соберитесь с духом и приготовьтесь немного поработать руками и головой.

Восстановление основного раздела, созданного FDISK или Disk Manager, в большинстве случаев осуществляется элементарно, а остальные, как правило, восстанавливать и не требуется, поскольку именно MBR гибнет чаще всего, а расширенные патриции, рассредоточенные по диску, умирают разве что при явном удалении разделов средствами FDISK/Disk Manager.

Адрес стартового сектора первого логического диска всегда равен 0/1/1 (Cylinder/Head/Sector), относительный (Relative) сектор – количеству головок жесткого диска, уменьшенных на единицу (сведения о геометрии диска можно почерпнуть из любого дискового редактора, в том числе и Sector Inspector). Конечный сектор определить несколько сложнее. Если загрузочный сектор цел (см. «Загрузочный сектор – техника восстановления»), то узнать количество секторов в разделе патриции (total sectors) можно и из поля BootRecord.NumberSectors, увеличив его значение на единицу. Тогда конечный цилиндр будет равен:

LastCyl := TotalSectors/(Heads*SecPerTrack)

где Heads – количество головок на физическом диске, а SecPerTrack – количество секторов на трек.

Конечная головка равна:

LastHead := (Total Sector – (LastCyl*Heads SecPerTrack))/SecPerTrack

а конечный сектор равен:

LastSec :== (Total Sector – (LastCyl*Heads SecPerTrack)) % SecPerTrack

Пропишите полученные значения в MBR и посмотрите, не находится ли за вычисленным концом раздела следующий раздел? Это должна быть либо расширенная таблица разделов, либо boot-сектор. Если это так, создайте еще одну запись в partition table, заполнив его соответствующим образом.

А если boot-сектор отсутствует и не может быть восстановлен, реально ли восстановить таблицу разделов или нет? Да, можно. Необходимо лишь найти boot или partition следующих разделов, в чем вам поможет контекстный поиск. Ищите сектора, содержащие сигнатуру 55h AAh в конце. Отличить boot от partition очень просто (в boot-секторе по смещению два байта от его начала расположен идентификатор производителя (NTFS, MSWIN4.1 и т. д.). Логично, что размер текущего раздела на один сектор меньше, а зная размер и геометрию диска, можно рассчитать и конечный цилиндр/головку/сектор.

Только учтите, что Windows хранит копию boot-сектора, которая в зависимости от версии может быть расположена либо в середине раздела, либо в его конце. Другие копии могут находиться в архивных файлах и файле подкачки. Кстати говоря, посмотрите, не содержится ли среди них ничего удобоваримого. Как отличить копию сектора от оригинала? Если это подлинник, вслед за ним пойдут служебные структуры файловой системы (в частности, для NTFS таблица MFT, каждая запись которой начинается с легко узнаваемой строки FILE*). Собственно говоря, поскольку служебные структуры файловой системы обычно располагаются на более или менее предсказуемом смещении относительно начала раздела, то отталкиваясь от их «географического» расположения, мы можем установить размеры каждого из логических дисков, даже если все boot/partition уничтожены.

Что произойдет, если границы разделов окажутся определенными неверно? Если мы переборщим, увеличив размер раздела сверх необходимого, все будет нормально работать, поскольку карта свободного пространства хранится в специальной структуре (у NTFS это файл $bitmap, а у FAT13/32 – непосредственно сама FAT-таблица) и «запредельные» сектора будут добавлены только после переформатирования раздела. Если все, что нам нужно, – это скопировать данные с восстанавливаемого диска на другой носитель, то возиться с подгонкой параметров partition table не нужно! Распахните ее на весь физический диск и дело с концом!

Естественно, такой способ восстановления подходит только для первого раздела диска, а для всех последующих нам потребуется определить стартовый сектор. Это определение должно быть очень точным, поскольку все структуры файловой системы адресуются от начала логического диска и ошибка в один-единственный сектор сделает весь этот тонкий механизм полностью неработоспособным. К счастью, некоторые из структур ссылаются сами на себя, давая нам ключ к разгадке. В частности, файлы $mft/$mftmiff содержат номер своего первого кластера. Стоит нам найти первую запись FILE*, как мы узнаем, на каком именно секторе мы сейчас находимся (конечно, при условии, что сумеем определить количество секторов на кластер, но это уже другая тема – см. раздел «Загрузочный сектор – базовые концепции»).

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

Динамические диски, впервые появившиеся в Windows 2000, – это все тот же программный RAID, призванный преодолеть ограничения стандартных механизмов разбиения с учетом ошибок своего прямого предшественника программного RAID Windows NT, хранящего конфигурационную информацию в системном реестре, что, во-первых, препятствовало его перемещению с машины на машину, а во-вторых, делало очень уязвимым к порче реестра.

По умолчанию Windows создает базовые диски (см. расшифровку терминов в таблице 5), но всякий базовый диск в любой момент времени может быть обновлен до динамического (это даже не потребует перезагрузки). Динамические диски не пользуются таблицей разделов, а потому и не имеют проблем, связанных с ограничением CHS-разрядности и позволяют создавать тома практически неограниченного размера. Однако динамические диски, созданные путем обновления основных разделов, все-таки остаются в partition table, при этом их Boot ID меняется на 42h. Если эта информация окажется удалена, система откажется подключать такой динамический диск. Кстати говоря, Windows может быть установлена только на обновленный динамический диск, поскольку BIOS может загружать систему лишь с тех разделов, которые перечислены в partition table, а динамические диски, созданные «на лету», в нее как раз и не попадают.

Схема разбиения динамических дисков содержится в Базе Менеджера Логических Дисков – Logical Disk Manager Database или сокращенно LDM. Это протоколируемая (journalled) база данных, поддерживающая транзакции и устойчивая к сбоям. Если в процессе манипуляции с томами неожиданно исчезнет питание, при последующем включении компьютера будет выполнен откат в предыдущее состояние. При переносе винчестера, содержащего один или несколько динамических дисков, на другую систему, они автоматически распознаются и монтируются, как обыкновенные диски.

LMD-база хранится в последнем мегабайте жесткого диска, а для дисков, полученных путем обновления базового раздела до динамического, – в последнем мегабайте этого самого раздела, идентификатор системы Boot ID соответствующей записи в Partition Table принимает значение 42h. Так происходит потому, что при стандартном разбиении винчестера в его конце просто не остается свободного места и операционной системе приходится сохранять эту информацию непосредственно в самом обновляемом диске (естественно, для этого в нем должен быть свободен по меньшей мере 1 Мб).

Сразу же за таблицей разделов по адресу 0/0/2 расположен приватный заголовок PRIVHEAD, содержащий в себе ссылки на основные структуры LDM (см. рис. 3). Если PRIVHEAD погибнет, Windows не сможет обнаружить и смонтировать динамические диски. А гибнет он удручающе часто. Подавляющее большинство загрузочных вирусов и дисковых менеджеров считают сектор 0/0/2 свободным и используют его для хранения своего тела, необратимо затирая прежнее содержимое. Осознавая значимость PRIVHEAD, разработчики из Microsoft сохранили его аж в двух копиях, одна из которых хранится в хвосте LDM, а другая – в последнем секторе физического диска. Благодаря такой избыточности, PRIVHEAD практически никогда не приходится восстанавливать вручную, но если это все-таки потребуется сделать, обратитесь к проекту LINUX-NTFS за подробным описанием его структуры (http://linux-ntfs.sourceforge.net), здесь же оно по соображениям экономии места не приводится.

Рисунок 3. LDM-база и ее дислокация

Рисунок 3. LDM-база и ее дислокация

Внутреннее устройство LDM-базы недокументировано и буквально пышет мощью и сложностью. Наверху иерархии расположено оглавление базы – структура TOCBLOCK (Table Of Content Block), состоящая из двух секций config и log (вероятно, в будущем их список будет расширен). Секция config содержит информацию о текущем разбиении динамических дисков и сведения о томах, а log хранит журнал изменений схемы разбивки. Это очень мощное средство в борьбе с энтропией! Если удалить один или несколько динамических разделов, информация о старом разбиении сохранится в журнале и утерянные тома могут быть с легкостью восстановлены! Будучи очень важной структурой, оглавление диска защищено от случайного разрушения тремя копиями, одна из которых вплотную примыкает к настоящему TOCBLOCK, расположенному в начале LDM-базы, а две другие находятся в конце диска, между копиями PRIVHEAD.

Внутренняя секция config состоит из заголовка (VMDB) и одного или нескольких VBLKs – специальных 128-байтовых структур данных, каждая из которых описывает соответствующий ей том, контейнер, раздел, диск или группу дисков. VMDB-заголовок не имеет копии и нигде не дублируется, однако все его изменения протоколируются в журнале (KLOG) и потому могут быть восстановлены.

Строение VMDB и VBLs подробно документировано «LMD Documentation», находящейся на сайте LINUX-NTFS и потому описывать его здесь нет никакой необходимости (оно слишком громоздко, к тому же крайне маловероятно, что кому-то потребуется восстанавливать секцию config руками).

Рисунок 4. Внутри LDM

Рисунок 4. Внутри LDM

Для просмотра LDM-базы и архивирования ее содержимого можно воспользоваться утилитой LDM-dump Марка Руссиновича, бесплатную копию которой можно скачать с его сайта (http://www.sysinternals.com/files/ldmdump.zip). Как вариант – можно зарезервировать последний мегабайт физического диска и последний мегабайт всех патриций, чей Boot ID равен 42h любым подходящим дисковым редактором (например, Sector Inspector) и сохранить эту информацию на надежном носителе (Zip, СD-R/RW), не забывая также зарезервировать и TOCBLOCK.

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

Если размер и тип удаленного динамического диска вам известен (на NTFS-дисках его можно извлечь из копии boot-сектора), просто зайдите в «Менеджер Управления Дисками» и воссоздайте его заново, от предложения отформатировать раздел любезно откажитесь и восстановите очищенный boot-сектор по методике, описанной ниже.

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

Таблица 4. Терминологическое соответствие динамических и обычных дисков

Базовые (Basic) разделы

Динамические (Dynamic) разделы

Основный раздел/Primary partition

Простой том/Simple volume

Системный и загрузочный раздел/System and boot partitions

Системный и загрузочный том/System and boot volumes

Активный раздел/Active partition

Активный том/Active volume

Расширенный раздел/Extended partition

Том и свободное пространство/Volume and unallocated space

Логический диск/Logical drive

Простой том/Simple volume

Набор томов/Volume set

Составной том/Spanned volume

Чередующийся набор/Stripe set

Чередующийся том/Stripe set

Загрузочный сектор – базовые концепции

Первый сектор логического диска носит название загрузочного (boot). Он содержит самозагрузочный код (bootstrap code) и важнейшие сведения о геометрии диска, без которых раздел просто не будет смонтирован! Структура boot-сектора определяется архитектурными особенностями конкретной файловой системы, в частности NTFS boot sector выглядит так:

Таблица 5. Строение NTFS boot-сектора

Смещение

Размер

Назначение

0x00

3 bytes

Инструкция перехода

0x03

8 байт

OEM ID – идентификатор

0x0B

25 bytes

BPB

0x24

48 bytes

Extended BPB

0x54

426 bytes

Bootstrap Code

0x01FE

WORD

55 AA

В начале всякого сектора расположена трехбайтовая машинная команда перехода на bootstrap code (обычно EB 52 90, хотя возможны и вариации). Так происходит потому, что при загрузке boot-сектора в память управление передается на его первый байт, а bootstrap код по туманным историческим соображениям был отодвинут в конец сектора (для NTFS верхняя граница составляет 54h байт), вот и приходится прыгать блохой!

С третьего по одиннадцатый байты (считая от нуля) хранится идентификатор производителя, определяющий тип и версию используемой файловой системы (например, «MSDOS5.0» для FAT16, «MSWIN4.0»/«MSWIN4.1» для FAT32 и «NTFS» для NTFS). Если это поле окажется искажено, драйвер не сможет смонтировать диск и даже может посчитать его не отформатированным! (примечание: с FAT-дисками Windows 2000 будет работать даже с запорченным OEM ID, чего не скажешь про NTFS).

Следом за идентификатором расположен 25-байтовый блок параметров BIOS (BIOS Parameter Block или сокращенно BPB), хранящий сведения о геометрии диска (число цилиндров, головок, секторов, размер сектора, количество секторов в кластере и т. д.). Если эта информация окажется утеряна или искажена, нормальное функционирование драйвера файловой системы станет невозможным. Причем если данное число цилиндров/головок/секторов дублирует информацию, содержащуюся в MBR, а при ее утере элементарно восстанавливается описанным выше способом, то размер кластера определить не так-то просто! Позже мы обсудим этот вопрос более подробно, пока же ограничимся следующей табличкой, сообщающей размер кластера NTFS-томов, выбираемой штатной утилитой форматирования по умолчанию (см. таблицу 7).

При выборе размера кластера вручную, Windows 2000 поддерживает следующий модельный ряд: 1, 2, 4, 8, 16, 32, 64 и 128 секторов. Чем больше размер кластера, тем меньше фрагментация и выше предельно адресуемый дисковый объем, но вместе с тем и выше потери от грануляции. Впрочем, ручное задание размеров кластера встречается достаточно редко.

Таблица 6. Размер кластера, выбираемый Windows 2000 по умолчанию

Размер диска

Размер кластера

< 512 Мб

1 сектор

< 1 Гб

2 сектора

< 2 Гб

4 сектора

> 2 Гб

8 секторов

К блоку параметров BIOS вплотную примыкает его продолжение – extended BPB, хранящий номер первого кластера MFT, ее размер в кластерах, номер кластера с зеркалом MFT и некоторую другую информацию. В отличие от FAT16/32, MFT может располагаться в любом месте диска (для борьбы с BAD-секторами это актуально). При нормальном развитии событий MFT располагается практически в самом начале диска (где-то в районе 4 кластера) и если только она не была перемещена, ее легко найти глобальным поиском (строка «FILE*» по смещению 0 от начала сектора). При разрушении или некорректном заполнении extend PBP драйвер файловой системы отказывается монтировать раздел, объявляя его неотформатированным.

Следом за extend PBP идет Bootstrap Code, который ищет на диске операционный загрузчик (у Windows NT это ntldr), загружает его в память и передает ему управление. Если Bootstrap Code отсутствует, загрузка операционной системы становится невозможной, однако, при подключении восстанавливаемого диска вторым раздел должен быть прекрасно виден. Порча Bootstrap Code вызывает перезагрузку компьютера или его зависание.

И завершает boot-сектор уже известная нам сигнатура 55h AAh, без которой он ни за что не будет признан загрузочным.

Таблица 7. Значение полей NTFS boot-сектора

Смещение

Размер

Назначение

0x00

3 bytes

Инструкция перехода

0x03

8 байт

OEM ID

0x0B

WORD

Байт на сектор (для жестких дисков всегда 512)

0x0D

BYTE

Секторов на кластер

0x0E

WORD

Количество зарезервированных секторов, равно 0

0x10

3 BYTES

Не используется NTFS и всегда должно быть равно 0

0x13

WORD

Не используется NTFS и всегда должно быть равно 0

0x15

BYTE

Медиа-дескрпитор для жестких дисков, всегда равен 0xF8

0x16

WORD

Не используется NTFS и всегда должно быть равно 0

0x18

WORD

Количество секторов в треке

0x1A

WORD

Количество головок

0x1C

DWORD

Количество скрытых секторов

0x20

DWORD

Не используется NTFS и всегда должно быть равно 0

0x24

DWORD

Не используется NTFS и всегда должно быть равно 0

0x28

8 байт

Общее количество секторов (total sector)

0x30

8 байт

Логический номер кластера, с которого начинается MTF

0x38

8 байт

Логический номер кластера, с которого начинается зеркало MTF

0x40

DWORD

Количество кластеров на сегмент (File Record Segment)

0x44

DWORD

Количество кластеров на блок индексов (index block)

0x48

8 байт

Серийный номер тома

0x50

DWORD

Контрольная сумма (0 – не подсчитывать).

0x54

426 bytes

Bootstrap Code

0x01FE

WORD

55 AA

Загрузочный сектор – техника восстановления

Осознавая значимость загрузочного сектора, Windows NT при форматировании диска создает его зеркальную копию (правда, только на NTFS-разделах). Windows NT 4.0 располагает ее посередине логического диска, а Windows 2000 – в последнем секторе раздела. Если partition table цела, просто перейдите в начало следующего раздела и отступите на сектор назад (Windows 2000) или поделите количество секторов логического диска пополам (с округлением в нижнюю сторону) и скажите редактору диска «GO» (Windows NT 4.0).

Если же таблица разделов разрушена, найти копию сектора можно глобальным поиском (ищите строку «NTFS» по смещению 3 от начала сектора). Поскольку положение копии фиксировано и отсчитывается от начала логического диска, мы можем с абсолютной уверенностью определить границы раздела.

Допустим, копия boot найдена в секторе 1 289 724, а поле NumberSectors содержит значение 12 289 661. Тогда конечный сектор раздела равен 1 289 724, а стартовый: 1289724 – 12289661 == 63. Поскольку загрузочный сектор расположен на расстоянии одной головки от partition table, что соответствует SectorPerTrack-секторам, мы можем восстановить и ее.

В отсутствии копий, boot-сектор приходится реконструировать вручную. Это легко. В поле идентификатора производителя заносится строка «NTFS» (без кавычек, но с четырьмя пробелами на конце). Количество секторов в треке и число головок заполняются ис