ВОССТАНОВЛЕНИЕ ДАННЫХ В РАЗДЕЛАХ FAT
|
Смещение, |
Размер, |
Описание |
0 |
0x1BE |
Главная
загрузочная запись |
0x1BE |
0x10 |
Элемент
таблицы разделов диска |
0x1CE |
0x10 |
Элемент
таблицы разделов диска |
0x1DE |
0x10 |
Элемент
таблицы разделов диска |
0x1EE |
0x10 |
Элемент
таблицы разделов диска |
0x1FE |
0x2 |
Признак
таблицы разделов - значение 0xAA55 |
Как видно из этой
таблицы, байты со смещением от 0 до 0x1BE занимает главная загрузочная
запись, то есть программа. Далее идут четыре элемента таблицы разделов,
причем каждый элемент занимает 0x10 байт. После таблицы располагаются два
байта признака таблицы разделов.
В элементе таблицы
раздела записана информация о расположении и размере раздела в секторах, а
также о назначении раздела. Формат элемента таблицы раздела представлен ниже:
Смещение, |
Размер, |
Описание |
0 |
1 |
Признак активного
раздела: |
0x1 |
1 |
Номер
головки начального сектора раздела |
0x2 |
2 |
Номер
сектора и дорожки начального сектора раздела |
0x4 |
1 |
Тип
раздела, или 0, если раздел свободный |
0x5 |
1 |
Номер
головки последнего сектора раздела |
0x6 |
2 |
Номер
сектора и дорожки последнего сектора раздела |
0x8 |
4 |
Относительный
номер сектора начала раздела |
0xC |
4 |
Размер
раздела в секторах |
Первый байт элемента
таблицы раздела содержит признак активного раздела. Если раздел активный, из
него будет выполняться загрузка операционной системы. Часто диск содержит
одновременно несколько активных разделов, принадлежащих разным операционным
системам.
Следующие три байта
определяют физический адрес на диске начального сектора раздела (описывающий
данный элемент раздела).
В байте со смещением 1
записан номер головки начального сектора раздела. В двухбайтовом поле со
смещением 2 закодирован номер сектора и номер дорожки самого первого сектора
раздела. При этом биты 0...5 этого поля задают номер сектора, а биты 6...15 -
номер дорожки.
Байт со смещением 4
содержит тип раздела, зависящий от типа операционной системы и типа файловой
системы.
Ниже мы привели некоторые
наиболее распространенные типы (здесь FAT-12, FAT-16 и FAT-32 обозначают
различные модификации файловой системы FAT, подробнее об этом мы расскажем
позже):
Тип |
Описание |
0x00 |
Свободный
раздел |
0x01 |
Первичный
раздел MS-DOS FAT-12 |
0x04 |
Первичный
раздел MS-DOS FAT-16 |
0x05 |
Расширенный
раздел |
0x06 |
Первичный
раздел FAT-16 |
0x07 |
Первичный
раздел NTFS |
0x0B |
Первичный
раздел Windows FAT-32 |
0x0C |
Расширенный
раздел Windows FAT-32 |
0x0E |
Расширенный
раздел Windows FAT-16 |
0x0F |
Первичный
раздел Windows FAT-16 |
0x82 |
Раздел
Swap ОС Linux |
0x83 |
Первичный
раздел ОС Linux EXT2FS/XIAFS |
0x85 |
Расширенный
раздел Linux |
В байте таблицы разделов
со смещением 5 и двухбайтовом слове со смещением 6 записаны номер головки,
номер сектора и номер дорожки последнего раздела.
Последние два поля
элемента таблицы разделов имеют длину 4 байта и содержат, соответственно,
относительный номер самого первого сектора в разделе (то есть относительный
номер сектора начала раздела) и количество секторов, имеющихся в разделе.
Именно эти поля используются операционной системой Microsoft Windows NT для
вычисления расположения раздела.
Остановимся подробнее на
относительном номере самого первого сектора в разделе.
Значение относительного
номера, равное 0, соответствует дорожке 0, головке 0, сектору 1. При
увеличении относительного номера сектора вначале увеличивается номер сектора
на дорожке, затем номер головки, и, наконец, номер дорожки. Зная номер
дорожки, номер сектора на дорожке и номер головки, можно вычислить
относительный номер сектора по следующей формуле:
RelSect = (Cyl * Sect * Head) + (Head * Sect) + (Sect - 1)
Здесь Cyl обозначает
номер дорожки, Sect - номер сектора на дорожке, Head - номер головки.
Обычно разделы диска
начинаются с четных номеров дорожек, за исключением самого первого раздела.
Этот раздел может начинаться с сектора 2 нулевой дорожки (головка 0), так как
самый первый сектор диска занят главной загрузочной записью.
В операционной системе
MS-DOS первичный раздел должен быть единственным и активным, он используется
как диск С: и из него выполняется загрузка операционной системы. В
расширенном разделе программа FDISK создает логические диски D:, E: и так
далее.
Если байт кода раздела
имеет значение 5, то в начале соответствующего раздела располагается сектор,
содержащий таблицу логических дисков. Эта таблица является расширением
таблицы разделов диска, расположенной в самом первом секторе физического
диска.
Таблица логических дисков
имеет формат, аналогичный таблице разделов диска, но содержит только два
элемента.
Один из них указывает на
первый сектор логического диска, он имеет значение типа раздела 1 или 4 (для
MS-DOS). Второй элемент может иметь значение типа раздела 5 (для MS-DOS) или
0. Если этот код равен 5, то элемент указывает на следующую таблицу
логических дисков. Если код системы равен 0, то соответствующий элемент не
используется. Выше мы приводили коды первичных и расширенных разделов для
разных операционных систем.
Таким образом, таблицы
логических дисков связаны в список. Элемент таблицы разделов диска, соответствующий
первичному разделу, указывает на начало этого списка.
Для таблицы логических
дисков имеется отличие в использовании полей границ логических дисков. Если
раздел первичный, эти границы вычисляются относительно начала расширенного
раздела. Для расширенных разделов используется абсолютная адресация
(относительно физического начала диска).
При помощи кнопки Next
Partition (рис. 2) Вы можете просмотреть весь список таблиц логических
дисков.
Упомянутая ранее
программа Microsoft Disk Probe работает только в среде операционных систем
Microsoft Windows NT и Microsoft Windows 2000. Что же касается MS-DOS и
Microsoft Windows 95/98, то здесь для анализа системных структур диска мы
рекомендуем редактор DISKEDIT из пакета Norton Utilities. Лучше всего
записать эту программу на системную дискету. Только при загрузке с такой
дискеты Вы сможете исследовать зараженную вирусами или разрушенную файловую
систему, когда MS-DOS не загружается с жесткого диска.
Запустив DISKEDIT,
воспользуйтесь меню Object. Для начала выберите из этого меню строку Drive.
Если на физическом жестком диске имеются исправные разделы с определенными в
них логическими дисками, на экране появится список логических дисков.
Если файловая система
разрушена до такой степени, что невозможно выполнить загрузку операционной
системы с диска, а при ее загрузке с дискеты не видно ни одного логического
диска, при выборе строки Drive вам будет показан список физических дисков
(рис. 3).
Рис. 3. Выбор
физического диска в программе DISKEDIT
Для просмотра самого
первого сектора физического диска, содержащего главную загрузочную запись и
таблицу разделов, выберите физический диск Hard Disk 1 и нажмите кнопку OK.
После этого на экране появится содержимое искомого сектора в виде дампа.
Сектор имеет размер 512 байт, поэтому на одном экране его содержимое не
помещается. Вы можете нажать клавишу PgDn и посмотреть вторую часть сектора.
На что здесь нужно
обратить внимание?
В начале сектора
находится главная загрузочная запись. Она, как мы уже говорили, является
программой. При наличии достаточного опыта Вы можете ее дизассемблировать и
исследовать. В любом случае следует проверить длину программы. Эта длина не
должна быть очень большая - после программы загрузки до начала таблицы
разделов должны располагаться нулевые байты. Кроме того, внутри программы
загрузки должны быть сообщения Invalid Partition table, Error loading
operating system и Missing operating system (для русских версий операционных
систем эти сообщения будут на русском языке).
Что же касается второй
части самого первого сектора жесткого диска, в ней должна находиться таблица
разделов диска.
Последние два байта
должны содержать признак таблицы разделов (сигнатуру) - шестнадцатеричное
значение 0хAA55.
Вы можете выполнить
анализ таблицы разделов диска, пользуясь приведенной выше информацией о ее
формате. Напомним, что таблица располагается в первом секторе диска со
смещением 0x1BE. Однако намного удобнее воспользоваться для анализа этой
таблицы форматным просмотром редактора DISKEDIT.
Установите курсор (мышью
или клавишами перемещения курсора) на байт со смещением 0x1BE, который
соответствует началу таблицы разделов. Затем в меню View выберите строку as
Partition Table. На экране появится таблица разделов диска в
отформатированном виде (рис. 4).
Рис. 4. Просмотр
таблицы разделов диска
В столбце System
отображается информация о типе разделов. Она строится на основе анализа поля
типа раздела, хранящегося в соответствующей строке таблицы разделов. Если
раздел активен, в столбце Boot для него указана строка Yes, если нет - строка
No.
Столбцы Starting Location
и Ending Location в полях Side, Cylinder и Sector содержат в расшифрованном
виде информацию о расположении самого первого и самого последнего секторов
раздела.
Номер относительного
сектора, с которого начинается раздел, Вы можете узнать из столбца Relative
Sectors, а общее количество секторов - в столбце Number of Sectors.
Полученную информацию о
границах разделов имеет смысл сравнить с параметрами жесткого диска,
полученными с помощью программы BIOS Setup, так как вирусы могут прятать свое
тело в секторах диска, расположенных в конце диска и не распределенных ни
одному разделу. Однако при этом следует учитывать, что современные дисковые
контроллеры способны выполнять логическую адресацию блоков (режим LBA),
искажающую полученную картину.
Поясним сказанное на
примере.
В одном из наших
компьютеров установлен диск, имеющий 1057 дорожек и 16 головок. На каждой
дорожке расположено 63 сектора размером 512 байт. При этом общий объем диска
составляет 520 Мбайт. Именно эти параметры нам сообщила программа BIOS Setup.
Программа FDISK
определила, что на диске имеется два раздела, размером 300 и 219 Мбайт, а
диск используется на 100 процентов. В то же время программа DISKEDIT для
этого диска показывает, что последний сектор последнего раздела расположен на
дорожке с номером 526.
На первый взгляд, тут
что-то не так: программа BIOS Setup сообщает нам, что на диске имеется 1057
дорожек и 16 головок, а в таблице разделов для последнего сектора последнего
раздела мы видим совсем другие значения: этот сектор расположен на 526
дорожке, а номер головки равен 31!
Причина такого
несоответствия заключается в том, что наш контроллер IDE выполняет логическую
адресацию дорожек и головок, предоставляя программам "виртуальный"
диск, где по сравнению с реальным диском меньше дорожек, но больше головок.
Прежде чем продолжить
исследование файловой системы, мы настоятельно рекомендуем Вам записать
параметры диска, определенные с помощью программы BIOS Setup, и содержимое
таблицы разделов диска. Просто перепишите полученные значения на лист бумаги.
Если в ходе ремонта Вы случайно разрушите область данных BIOS или главный
загрузочный сектор, то сможете легко восстановить критичные данные.
Можно также сохранить
содержимое сектора MBR в файле, используя соответствующие функции программ
DISKEDIT или Microsoft Disk Probe. Подробные инструкции есть в документации и
справочных системах указанных программ. Файл необходимо записать на дискету
или на другой диск.
Если на диске создан
только первичный раздел, можно переходить к анализу логического диска C: и
других логических дисков. Если же есть расширенный раздел, необходимо
проверить сектор таблицы логических дисков -самый первый сектор в расширенном
разделе.
Чтобы посмотреть этот
сектор, запустите программу DISKEDIT, определите с ее помощью расположение
расширенного раздела (дорожка, головка и номер сектора). Затем из меню Object
выберите строку Physical Sector. На экране появится диалоговая панель Select
physical sector range, с помощью которой можно выбрать для просмотра один или
несколько секторов.
Сектор таблицы логических
дисков, в отличие от сектора главной загрузочной записи, практически пуст.
Все байты в нем от начала и до смещения 0x1BD включительно должны содержать
нулевое значение. Далее со смещения 0x1BE располагается таблица логических
дисков, состоящая из двух элементов. В конце сектора располагается уже
знакомая вам сигнатура - значение 0xAA55.
Структура элементов
полностью аналогична структуре элементов таблицы разделов, поэтому Вы можете
использовать форматный просмотр. Для этого установите курсор на байт со
смещением 0x1BE, и затем из меню View выберите строку as Partition Table.
На том же листе бумаги,
где Вы записывали параметры диска и сведения из таблицы разделов диска,
запишите информацию обо всех логических дисках, полученную из таблиц
логических дисков. Если содержимое таблиц логических дисков будет случайно
разрушено, Вы потеряете доступ к логическим дискам.
Формат логических дисков,
расположенных в разделах жесткого диска, полностью идентичен формату дискет,
поэтому многое из сказанного здесь будет справедливо и для дискет.
В самом начале
логического диска располагается сектор загрузочной записи Boot Record (не
путайте его с сектором главной загрузочной записи MBR, который является самым
первым на физическом диске), а также, возможно, зарезервированные секторы.
Вслед за сектором Boot
Record находятся две копии таблицы размещения файлов FAT (File Allocation
Table), о которой мы еще будем говорить, и корневой каталог. Область данных,
занимающая оставшуюся часть логического диска, содержит файлы и остальные
каталоги.
Адрес загрузочного
сектора логического диска нетрудно найти в таблице логических дисков. В
загрузочном секторе логического диска находится программа начальной загрузки
операционной системы. Эта программа помещается в оперативную память
загрузчиком, расположенным в главной загрузочной записи MBR.
Назначение программы,
расположенной в загрузочном секторе логического диска - загрузка операционной
системы, находящейся на этом логическом диске.
Таким образом, при
включении питания после выполнения процедуры тестирования BIOS загружает в
оперативную память содержимое главной загрузочной записи MBR и передает ей управление.
Главная загрузочная запись просматривает таблицу разделов диска и находит
активный раздел. При наличии нескольких таких разделов пользователю
предлагается сделать выбор раздела для загрузки.
Затем запись MBR
считывает загрузочный сектор Boot Record логического диска, расположенного в
выбранном активном разделе, и передает управление находящейся в этом секторе
программе загрузки операционной системы. Эта программа, в свою очередь,
выполняет всю работу по загрузке операционной системы в память компьютера.
Формат загрузочного
сектора зависит от версии операционной системы. Однако в любом случае помимо
программы начальной загрузки операционной системы загрузочная запись содержит
параметры, описывающие характеристики данного логического диска. Все эти
параметры располагаются в самом начале сектора, в его так называемой
форматированной области. Последние два байта загрузочного сектора содержат
уже знакомую вам сигнатуру 0xAA55.
Перед исследованием
загрузочной записи Вы должны при помощи команды VER определить версию
операционной системы, установленной в компьютере. Для версий MS-DOS, более
ранних, чем 4.0, формат загрузочной записи приведен ниже:
Смещение, |
Размер, |
Описание |
0 |
3 |
Команда
JMP xxxx (переход на программу начальной загрузки) |
3 |
8 |
Название
фирмы-изготовителя операционной системы и версия, например: IBM 4.0 |
0xB |
13 |
Блок
параметров BIOS (BPB) |
0x18 |
2 |
Количество
секторов на дорожке |
0x1A |
2 |
Количество
головок |
0x1C |
2 |
Количество
скрытых секторов |
В самом начале
загрузочного сектора располагается команда внутрисегментного перехода JMP.
Она нужна для обхода форматированной зоны сектора и передачи управления
загрузочной программе, располагающейся со смещением 0x1E.
Название
фирмы-изготовителя не используется операционной системой и представляет собой
текстовую строку длиной 8 байт.
Со смещением 0xB
располагается блок параметров BIOS Parameter Block (BPB). Этот блок содержит
некоторые характеристики логического диска, такие как количество секторов в
одном кластере, общее количество секторов и т. д. Формат блока BPB будет
описан позже.
Поля загрузочного сектора
со смещениями 0x18 и 0x1A содержат, соответственно, количество секторов на дорожке
и количество головок. Поле со смещением 0x1C содержит количество
"скрытых" секторов, которые не принадлежат ни одному логическому
диску. Эти секторы могут использоваться для схемы разделения физического
диска на разделы и логические диски (в них может находиться таблица разделов
диска или таблицы логических дисков).
Смещение, |
Размер, |
Описание |
0 |
3 |
Команда
JMP xxxx (переход на программу начальной загрузки) |
3 |
8 |
Название
фирмы-изготовителя операционной системы и версия |
0xB |
25 |
Extended
BPB - расширенный блок параметров BIOS |
0x24 |
1 |
Физический
номер устройства (0 - накопитель на гибком магнитном диске НГМД, 0x80 -
жесткий диск) |
0x25 |
1 |
Зарезервировано |
0x26 |
1 |
Значение
0x29 - признак расширенной загрузочной записи Extended BPB |
0x27 |
4 |
Серийный
номер диска (Volume Serial Number), создается во время форматирования диска |
0x2B |
11 |
Метка
диска (Volume Label) |
0x36 |
8 |
Текстовая
строка "FAT12" или "FAT16" |
Первые два поля имеют то
же назначение, что и в загрузочной записи старых версий MS-DOS.
Поле со смещением 26h
содержит число 0x29, означающее, что используется формат расширенной
загрузочной записи и, соответственно, расширенный блок параметров BIOS Extended
BPB.
Серийный номер диска
формируется во время форматирования диска на основе даты и времени
форматирования. Поэтому все диски и дискеты имеют разные серийные номера.
Метка диска формируется
при форматировании и может быть изменена, например, командой LABEL
операционной системы MS-DOS. Одновременно метка диска помещается в корневой
каталог в виде специального дескриптора. О формате каталогов и дескрипторов,
а также о формате таблицы размещения файлов FAT мы расскажем позже.
Теперь о блоке параметров
BIOS BPB и расширенном блоке параметров BIOS Extended BPB.
Для версий MS-DOS, более
ранних, чем 4.0, блок BPB имеет следующий формат:
Смещение, |
Размер, |
Описание |
0 |
2 |
Количество
байт в одном секторе диска |
2 |
1 |
Количество
секторов в одном кластере |
3 |
2 |
Количество
зарезервированных секторов |
5 |
1 |
Количество
таблиц FAT |
6 |
2 |
Максимальное
количество дескрипторов файлов в корневом каталоге диска |
8 |
2 |
Общее
количество секторов на носителе данных (в разделе MS-DOS) |
0Ah |
1 |
Байт-описатель
среды носителя данных |
0Bh |
2 |
Количество
секторов, занимаемых одной копией FAT |
Расширенный блок
параметров BIOS файловых систем FAT-12 и FAT-16 состоит из обычного блока BPB
и дополнительного расширения:
Смещение, |
Размер, |
Описание |
0 |
2 |
Количество
байт в одном секторе диска |
2 |
1 |
Количество
секторов в одном кластере |
3 |
2 |
Количество
зарезервированных секторов |
5 |
1 |
Количество
таблиц FAT |
6 |
2 |
Максимальное
количество дескрипторов файлов в корневом каталоге диска |
8 |
2 |
Общее
количество секторов на носителе данных (в разделе MS-DOS) |
0Ah |
1 |
Тип
носителя данных |
0Bh |
2 |
Количество
секторов, занимаемых одной копией FAT |
0Dh |
2 |
Количество
секторов на дорожке |
0Fh |
2 |
Количество
магнитных головок |
11h |
2 |
Количество
скрытых секторов для раздела, который по размеру меньше 32 Мбайт |
13h |
2 |
Количество
скрытых секторов для раздела, превышающего по размеру 32 Мбайт |
15h |
4 |
Общее
количество секторов на логическом диске для раздела, превышающего по
размеру 32 Мбайт |
Для дискет и диска тип
носителя данных может принимать следующие значения:
Значение |
Количество |
Количество |
Диаметр, |
Емкость, |
0xF0 |
2 |
18 |
3,5 |
1440 |
0xF0 |
2 |
36 |
3,5 |
2880 |
0xF0 |
2 |
15 |
5,25 |
1200 |
0xF8 |
- |
- |
- |
Жесткий диск любой емкости |
0xF9 |
2 |
9 |
3,5 |
720 |
0xF9 |
2 |
15 |
5,25 |
1200 |
0xFA |
1 |
8 |
5,25 |
320 |
0xFB |
2 |
8 |
3,5 |
640 |
0xFC |
1 |
9 |
5,25 |
180 |
0xFD |
2 |
9 |
5,25 |
360 |
0xFE |
1 |
8 |
5,25; 8 |
160 |
0xFF |
2 |
8 |
5,25; 8 |
320 |
Что же касается файловой системы
FAT-32, то формат ее загрузочного сектора аналогичен только что описанному,
за исключением блока BPB. Размер этого блока составляет 0x25 байт, а формат
приведен ниже:
Смещение, |
Размер, |
Описание |
0 |
2 |
Количество
байт в одном секторе диска |
2 |
1 |
Количество
секторов в одном кластере |
3 |
2 |
Количество
зарезервированных секторов |
5 |
1 |
Количество
таблиц FAT |
6 |
2 |
Максимальное
количество дескрипторов файлов в корневом каталоге диска |
8 |
2 |
Общее
количество секторов на носителе данных (в разделе) |
0xA |
1 |
Тип
носителя данных |
0xB |
2 |
Количество
секторов, занимаемых одной копией FAT |
0xD |
2 |
Количество
секторов на дорожке |
0xF |
2 |
Количество
магнитных головок |
0x11 |
4 |
Количество
скрытых секторов для раздела, который по размеру меньше 32 Мбайт |
0x15 |
4 |
Общее
количество секторов на логическом диске для раздела, превышающего по
размеру 32 Мбайт |
0x19 |
4 |
Размер
таблицы FAT в секторах |
0x1D |
2 |
Расширенные
флажки |
0x1F |
2 |
Версия
файловой системы |
0x21 |
4 |
Номер
первого кластера корневого каталога |
0x25 |
2 |
Сектор,
содержащий различные сведения о файловой системе в целом |
0x27 |
2 |
Номер
сектора, в котором находится резервная копия загрузочного сектора |
0x29 |
12 |
Зарезервировано |
Для форматного просмотра
блока параметров BPB (или расширенного блока параметров Extended BPB, в зависимости
от версии MS-DOS) удобно использовать программу DISKEDIT. При этом Вы можете
найти загрузочную запись двумя способами.
Во-первых, можно выбрать
из меню Object строку Boot Record (выбрав предварительно нужный логический
диск при помощи строки Drive того же меню). Вы сразу же окажитесь в режиме
форматного просмотра блока параметров BIOS выбранного вами диска (рис. 5).
Рис. 5. Просмотр блока
параметров BIOS
Во-вторых, если
логические диски недоступны, но Вам удалось считать таблицу разделов или
таблицу логических дисков, Вы можете перейти к просмотру загрузочной записи,
указав ее физический адрес. Для этого из меню Object надо выбрать строку
Physical Address (как это было описано раньше). На экране появится дамп
первой части загрузочного сектора. Нажав клавишу PgDn, Вы можете перейти к
просмотру второй части загрузочного сектора.
При помощи строк as Boot
Record и as Hex меню View Вы можете перейти, соответственно, к форматному и
неформатному режиму просмотра загрузочного сектора.
Аналогичные возможности
форматного просмотра загрузочных записей FAT есть и у программы Microsoft
Disk Probe.
Формирование загрузочной
записи и блока параметров BIOS происходит при форматировании логического
диска (например, командой FORMAT). Если с помощью программы FDISK удалить
логический диск, а потом создать на его месте новый такого же размера, блок
BPB окажется разрушенным. При этом Вам придется отформатировать логический
диск заново.
Блок параметров BIOS
содержит критичную информацию, при разрушении которой становится невозможным
нормальный доступ к файлам и каталогам, расположенным на логическом диске.
Неосторожное обращение с загрузочным сектором жесткого диска может привести к
необходимости переформатирования соответствующего логического диска с полной
потерей хранившихся там данных.
Перед тем как продолжить
дальнейший анализ файловой системы, полезно сделать распечатку содержимого
загрузочных секторов всех имеющихся логических дисков в форматном и
неформатном виде, так как блок параметров BIOS содержит сведения, необходимые
для поиска и анализа других логических структур файловой системы. Для
распечатки выберите из меню Tools строку Print Object as и в появившейся на
экране диалоговой панели выберите строку Boot Record. Затем нажмите кнопку
OK.
Аналогичным образом Вы
можете распечатать содержимое других логических структур файловой системы,
например, содержимое таблицы разделов диска.
Вместо распечатки можно
сохранить содержимое загрузочных записей в файле на дискете или на другом
диске.
Между загрузочным
сектором и таблицей размещения файлов FAT могут находиться зарезервированные
секторы, которые являются служебными для файловой системы или не
используются.
Количество секторов,
зарезервированных на логическом диске, можно узнать из блока параметров BIOS
(BPB или Extended BPB, в зависимости от версии операционной системы). Искомое
значение находится в поле этого блока со смещением 3. При форматном просмотре
количество зарезервированных секторов указано в строке Reserved sectors at
beginning.
Если зарезервирован
только один сектор, то первая копия таблицы размещения файлов FAT
располагается сразу вслед за загрузочным сектором. Именно загрузочный сектор
в данном случае и является зарезервированным.
Когда зарезервировано
несколько секторов, между загрузочным сектором и первой копией таблицы FAT
может находиться еще несколько секторов, содержащих нулевые значения. Если
компьютер заражен вирусом, в этих секторах может быть спрятано тело вируса
или копия оригинальной загрузочной записи, замещенной вирусом.
Операционная система
объединяет отдельные секторы диска в так называемые кластеры. При создании
новых каталогов и непустых файлов для них выделяется один или несколько
кластеров. Если размер файла увеличивается, для него выделяются
дополнительные кластеры.
Размер кластера в
секторах (то есть количество секторов в одном кластере) нетрудно узнать из
поля блока параметров BIOS BPB со смещением 2. При форматном просмотре
содержимого загрузочного сектора размер кластера отображается в строке
Sectors per cluster.
Для экономии дискового
пространства файлам и каталогам распределяются кластеры, которые не
обязательно расположены рядом. Таким образом, отдельные кластеры,
принадлежащие одному и тому же файлу, могут находиться в разных местах
логического диска. За такую экономию приходится платить производительностью,
так как считывание фрагментированного файла связано с многочисленными
перемещениями магнитных головок, а это самая медленная дисковая операция.
Другая проблема,
связанная с фрагментацией файлов, заключается в необходимости хранения списка
кластеров, выделенных каждому файлу. Очевидно, для того чтобы прочитать файл,
операционная система должна последовательно прочитать все кластеры,
распределенные этому файлу.
Где же хранятся списки
кластеров?
Эти списки хранятся в
таблице размещения файлов FAT (File Allocation Table), к анализу которой мы
скоро приступим.
Таблицу размещения файлов
можно представить себе как массив, содержащий информацию об относительном
расположении кластеров всех файлов. Размер массива определяется общим
количеством кластеров на логическом диске. В элементах массива находятся
списки кластеров, распределенных файлам, причем элементы массива,
соответствующие свободным кластерам, содержат нулевые значения.
Если файл занимает
несколько кластеров, то такие кластеры связаны в список. При этом элементы
таблицы FAT содержат номера следующих используемых данным файлом кластеров.
Конец списка отмечен в таблице специальным значением. Номер первого кластера,
распределенного файлу, хранится в элементе каталога, описывающего данный файл
(в дескрипторе файла).
Таким образом, зная имя
файла и каталог, где этот файл расположен, операционная система MS-DOS может
определить номер первого кластера, распределенного файлу, а затем, проследив
список кластеров по таблице FAT, определить и номер остальных кластеров,
занятых этим файлом.
Программа FORMAT,
предназначенная для форматирования диска и некоторые специальные программы
аналогичного назначения проверяют логический диск на предмет наличия
дефектных областей. Кластеры, расположенные в этих дефектных областях,
отмечаются в FAT как плохие и не используются операционной системой.
Для примера на рис. 6
показаны упрощенные дескрипторы корневого каталога диска C:. В них описаны
файлы MYFILE1.DOC и MYLETTER.DOC, а также элементы таблицы размещения файлов
FAT, выделенные для этих файлов.
Рис. 6. Пример
распределения кластеров для файлов MYFILE1.DOC и MYLETTER.DOC
Файл MYFILE1.DOC занимает
три кластера с номерами 11, 17 и 18, а файл MYLETTER.DOC - два кластера с
номерами 12 и 13. В каталоге указаны номера первых кластеров, распределенных
этим файлам (соответственно 11 и 12). Последние ячейки, соответствующие
последним кластерам, распределенным файлам, содержат специальное значение -
признак конца цепочки кластеров. Для 16-разрядного формата FAT это 0xFFFF, а
для 12-разрядного - 0xFFF.
Остановимся подробнее на
формате таблицы FAT.
Таблица FAT может иметь
12-, 16- или 32-разрядный формат, при этом файловая система будет обозначаться
как FAT-12, FAT-16 и FAT-32, а в таблице для хранения информации об одном
кластере диска используется 12 , 16 или 32 бит, соответственно.
Первый из этих двух
форматов (12-разрядный) применяется для дискет и дисков с небольшим
количеством секторов. Таблица размещения файлов FAT-12 дискеты полностью
помещается в одном секторе.
Если размер диска слишком
большой, для представления всех кластеров двенадцати разрядов будет
недостаточно. В этом случае используется 16- или 32- разрядный формат FAT.
При этом операционная система может работать с диском, который имеет размер
более 32 Мбайт. Поэтому для жестких дисков всегда используется 16- или
32-разрядный формат таблицы FAT.
Как узнать формат FAT?
Формат FAT можно
определить, анализируя содержимое поля кода раздела соответствующего элемента
таблицы разделов. Это поле расположено в главной загрузочной записи MBR. Если
оно содержит значение 1, используется 12-разрядный формат, если 4, то
16-разрядный, а если 0xB или 0xC - 32-разрядный.
Первый элемент таблицы
FAT имеет особый формат.
Самый первый байт таблицы
FAT называется "Описатель среды" (Media Descriptor). Он имеет такое
же значение, как и байт-описатель среды, загрузочного сектора логического
диска. Следующие 5 байт для 12-разрядного формата или 7 байт для 16-разрядного
формата всегда содержат значение 0xFF.
Вся остальная часть
таблицы FAT состоит из 12-, 16- или 32-разрядных ячеек. Каждая ячейка
соответствует одному кластеру диска. Эти ячейки для разных форматов таблицы
FAT могут содержать следующие значения:
FAT12 |
FAT16 |
FAT32 |
Описание |
0x000 |
0x0000 |
0x00000000 |
Свободный
кластер |
0xFF0-0xFF6 |
0xFFF0-0xFFF6 |
0xFFFFFFF0-0xFFFFFFF6 |
Зарезервированный
кластер |
0xFF7 |
0xFFF7 |
0xFFFFFFF7 |
Плохой
кластер |
0xFF8-0xFFF |
0xFFF8-0xFFFF |
0xFFFFFFF8-0xFFFFFFFF |
Последний
кластер в списке |
0x002-0xFEF |
0x0002-0xFFEF |
0x00000002-0x0000FFEF |
Номер
следующего кластера в списке |
Для просмотра таблицы размещения
файлов FAT мы воспользуемся программой DISKEDIT. Из меню Object выберите
строку Drive и укажите интересующий Вас диск.
Затем из меню Object
выберите одну из двух строк - 1st FAT или 2nd FAT. На экране появится,
соответственно, содержимое первой или второй копии таблицы FAT в
отформатированном виде (рис. 7).
Рис. 7. Просмотр
первой копии таблицы размещения FAT в отформатированном виде
Вы также можете найти
первую или вторую копию таблицы FAT, зная физический адрес загрузочной записи
логического диска. Напомним, что загрузочная запись располагается в самом
первом секторе дискеты. Расположение загрузочной записи для логических
дисков, созданных в разделах жесткого диска, можно определить из таблицы
разделов (для логического диска C:) или таблицы логических дисков (для
логических дисков, созданных в расширенном разделе).
Далее, в рамках
логического диска существует своя последовательная нумерация секторов. При
этом порядок нумерации выбран таким, что при последовательном увеличении
номера сектора вначале увеличивается номер головки, затем номер дорожки.
Поясним это на примере.
Пусть, например, у нас
есть дискета с девятью секторами на дорожке. Сектор с логическим номером,
равным 1, расположен на нулевой дорожке и для обращения к нему используется
нулевая головка. Это самый первый сектор на дорожке, он имеет номер 1.
Следующий сектор на нулевой дорожке имеет логический номер 2, последний сектор
на нулевой дорожке имеет логический номер 9. Сектор с логическим номером 10
расположен также на нулевой дорожке. Это тоже самый первый сектор на дорожке,
но теперь для доступа к нему используется головка с номером 1. И так далее,
по мере увеличения логического номера сектора изменяются номера головок и
дорожек.
Согласно такой нумерации,
сектор с последовательным номером 0 - это загрузочный сектор. Для того чтобы
просмотреть содержимое загрузочного сектора при помощи программы DISKEDIT, Вы
можете выбрать из меню Object строку Sector и в появившейся диалоговой панели
указать номер сектора, равный нулю.
Заметьте, что в этой
диалоговой панели в рамке, озаглавленной Sector Usage, показано распределение
секторов. Пользуясь этим распределением, Вы легко сможете определить
последовательный номер сектора загрузочной записи, начало и границы обеих
копий FAT. Кроме того, нетрудно определить начало и границы корневого
каталога и области данных, содержащих файлы и другие каталоги.
С помощью меню View Вы
можете просмотреть содержимое таблицы FAT в виде дампа.
Визуально таблица
размещения файлов должна содержать в основном монотонно изменяющиеся
последовательности номеров кластеров, нулевые значения, соответствующие
свободным кластерам, а также значение 0xFFFF (0xFFF для FAT-12 или 0xFFFFFFFF
для FAT-32), которое является признаком конца цепочки кластеров.
Вслед за первой копией
таблицы FAT должна находиться вторая копия FAT.
Размер таблицы FAT Вы
можете определить, зная содержимое поля блока параметров BIOS BPB со
смещением 0xB (количество секторов, занимаемых одной копией FAT).
В результате сбоя или
вирусной атаки таблица FAT может быть либо полностью разрушена, либо изменена
(например, зашифрована или расписана нулями). Если цепочка кластеров для
нужного Вам файла разрушена частично или полностью, восстановление такого
файла может стать непростой задачей.
Некоторые вирусы
пользуются тем фактом, что конец цепочки кластеров может отмечаться любым
значением в указанных выше диапазонах (например, от 0xFFF8 до 0xFFFF для
16-разрядной таблицы FAT), в то время как операционная система использует
значения 0FFFFh или 0FFFh.
Вирус может выделять для
себя зараженные файлы (чтобы избежать повторного заражения), отмечая последний
распределенный этим файлам кластер любым другим значением, например, 0xFFF9.
При этом операционная система будет продолжать работать нормально, как будто
ничего не произошло.
Хотя вторая копия таблицы
FAT создается как резервная, для облегчения процедуры восстановления в случае
разрушения первой копии, не стоит особенно надеяться на то, что в случае
вирусной атаки Вы сможете просто скопировать вторую копию FAT на место
первой. Вторая копия FAT также может оказаться разрушенной или зашифрованной,
причем иным способом, нежели первая.
В случае FAT-12 и FAT-16
непосредственно после второй копии таблицы размещения файлов следует корневой
каталог. Расположение корневого каталога для FAT-32 указано в блоке BPB
(слово со смещением 0x21).
Размер корневого каталога
в секторах Вы можете определить из блока параметров BIOS BPB. Поле со
смещением 6 содержит максимальное количество дескрипторов файлов в корневом
каталоге диска (этому полю соответствует строка Root directory entries при
форматном просмотре содержимого загрузочного сектора программой DISKEDIT).
Размер одного дескриптора
составляет 32 байта, поэтому, умножив максимальное количество дескрипторов на
это число, мы получим размер корневого каталога в байтах. Зная размер сектора
(512 байт), нетрудно определить количество секторов, занимаемых корневым
каталогом.
Теперь поговорим о
дескрипторах файлов.
Любой каталог (и корневой
в том числе) содержит 32-байтовые элементы - дескрипторы, описывающие файлы и
другие каталоги. Приведем формат дескриптора, применяющийся в операционной
системе MS-DOS:
Смещение, |
Размер, |
Описание |
0x00 |
8 |
Имя
файла или каталога, выровненное на левую границу и дополненное пробелами |
0x08 |
3 |
Расширение
имени файла, выровненное на левую границу и дополненное пробелами |
0x0B |
1 |
Байт
атрибутов файла |
0x0C |
10 |
Зарезервировано |
0x16 |
2 |
Время
создания файла или время его последней модификации |
0x18 |
2 |
Дата
создания файла или дата его последней модификации |
0x1A |
2 |
Номер
первого кластера, распределенного файлу |
0x1C |
4 |
Размер
файла в байтах |
Обратите внимание на поле
со смещением 0x1A. Это номер первого кластера, распределенного файлу или
каталогу (если дескриптор описывает каталог более низкого уровня). Пользуясь
этим значением, Вы сможете проследить по таблице размещения файлов FAT всю
цепочку кластеров, распределенных данному файлу или каталогу. Таким образом,
у нас имеется способ отыскать начало цепочки кластеров для любого файла -
нужно лишь найти соответствующий дескриптор.
В любом каталоге, кроме
корневого, два первых дескриптора имеют специальное назначение. Первый
дескриптор содержит в поле имени строку:
". "
Этот дескриптор указывает
на содержащий его каталог. То есть каталог имеет ссылку сам на себя. Второй
специальный дескриптор содержит в поле имени строку:
Этот дескриптор указывает
на каталог более высокого уровня.
Если в поле номера
первого занимаемого кластера для дескриптора с именем ".. "
находится нулевое значение, это означает, что данный каталог содержится в
корневом каталоге.
В древовидной структуре
каталогов имеются ссылки, адресующие каталоги как в прямом, так и в обратном
направлении. Эти ссылки можно использовать для проверки сохранности структуры
каталогов файловой системы.
Байт атрибутов является
принадлежностью каждого файла. Разряды байта атрибутов комбинируются при
помощи логической операции ИЛИ. Они имеют следующие значения:
Бит |
Описание |
0 |
Файл
предназначен только для чтения. В этот файл нельзя писать и его нельзя
стирать |
1 |
Скрытый файл. Этот файл
не будет появляться в списке файлов, отображаемых командой DIR |
2 |
Системный файл. Этот
бит обычно установлен для файлов, являющихся составной частью операционной
системы |
3 |
Данный дескриптор
описывает метку диска. Для этого дескриптора поле имени файла и поле
расширения имени файла должны рассматриваться как одно поле длиной 11 байт.
Это поле содержит метку диска |
4 |
Дескриптор
описывает файл, являющийся подкаталогом данного каталога |
5 |
Флаг архивации. Если
этот разряд установлен в 1, то данный файл не был выгружен утилитой
архивации |
6-7 |
Зарезервированы |
Как правило, файлы имеют
следующие атрибуты:
Атрибут |
Описание |
0x00 |
Обычные
файлы (тексты программ, загрузочные модули, пакетные файлы) |
0x07 |
Только
читаемые, скрытые, системные файлы. Такая комбинация битов байта атрибутов
используется для файлов операционной системы MS-DOS, таких как IO.SYS,
MSDOS.SYS |
0x08 |
Метка
тома. Дескриптор метки тома может находиться только в корневом каталоге
логического диска |
0x10 |
Дескриптор,
описывающий каталог |
0x20 |
Обычный
файл, который не был выгружен программами BACKUP или XCOPY |
При удалении файла первый
байт его имени заменяется байтом 0xE5 (символ "х"). После этого все
кластеры, распределенные удаленному файлу, отмечаются в таблице FAT как
свободные.
Если Вы только что
удалили файл, его еще можно восстановить, так как в дескрипторе сохранились
все поля, кроме первого байта имени файла. Но если на диск записать новые
файлы, то может получиться так, что содержимое кластеров удаленного файла
будет изменено. При этом восстановление файла станет проблематичным.
Теперь о полях времени и
даты.
Старшие пять разрядов
поля времени содержат значение часа модификации файла, шесть разрядов с
номерами 5-10 хранят значение минут модификации файла, и, наконец, в младших
5 разрядах находится значение секунд, деленное на 2. Для того чтобы время
обновления файла уместилось в шестнадцати разрядах, пришлось пойти на
снижение точности времени до двух секунд. В подавляющем большинстве случаев
такое снижение точности не играет никакой роли.
Формат даты обновления
файла напоминает формат времени. Разряды 9-15 отведены для хранения года, 5-8
- для хранения месяца и 0-4 - для хранения дня недели. Для того чтобы
получить значение года обновления файла, необходимо прибавить к величине,
хранимой в старших семи битах, значение 1980.
Некоторые вирусы
используют поля времени и даты для отметки зараженных файлов. Такая отметка
нужна для того, чтобы избежать повторного заражения. Однако этот примитивный
способ используется только простейшими вирусами.
Поле длины в дескрипторе
содержит точную длину файла в байтах. Для каталогов в поле длины записано нулевое
значение.
Когда вирус заражает
файл, его длина, как правило, увеличивается. Тем не менее, стелс-вирусы,
скрывающие свое присутствие в системе, эффективно маскируют такое увеличение.
Поэтому его можно заметить только при загрузке операционной системы с
"чистой" дискеты, свободной от вирусного заражения.
Для просмотра каталогов с
целью проверки их структуры мы воспользуемся программой DISKEDIT. Запустите
эту программу, и из меню Object выберите строку Directory. На экране появится
диалоговая панель Change Directory.
В левой части диалоговой
панели отображается дерево каталогов текущего диска. Выберите в нем корневой
каталог C:\ и нажмите кнопку OK. После этого на экране появится содержимое корневого
каталога в форматированном виде (рис. 8).
Рис. 8. Просмотр
первой копии таблицы размещения FAT в отформатированном виде
Анализируя полученную
информацию, Вы можете обнаружить подозрительные изменения в полях размера
файла, даты и времени. Кроме того, для каждого файла в столбце Cluster
отображается номер распределенного ему первого кластера.
С помощью меню View можно
переключиться в режим неформатированного просмотра, когда содержимое каталога
отображается в виде дампа.
Обратите внимание на меню
link. С помощью этого меню Вы можете переходить к просмотру логически
связанных между собой структур файловой системы.
В качестве упражнения
выделите в корневом каталоге диска C: файл IO.SYS и затем выберите из меню
link строку Cluster chain (FAT). Вы увидите первую копию таблицы размещения
файлов FAT, причем цепочка кластеров, выделенная файлу IO.SYS, будет выделена
цветом. С помощью строки File меню link нетрудно перейти в режим просмотра
содержимого файла IO.SYS.
Отметим, что во многих
случаях можно выполнять переходы между логически связанными структурами
данных двойным щелчком левой клавиши мыши по изображению этих структур, что
очень удобно. Подробности можно найти в документации к пакету программ Norton
Utilities.
На что следует обратить
внимание при проверке структуры каталогов?
Кроме визуальной проверки
полей расположенных там дескрипторов следует просмотреть весь каталог до
конца. Необходимо убедиться, что в каталоге отсутствуют посторонние данные.
Они могут быть записаны туда вирусом.
Если перейти в режим
неформатированного просмотра, то можно убедиться, что свободные элементы
каталога содержат нулевые значения. Если же после свободных элементов
находятся какие-либо данные, существует очень большая вероятность того, что
они записаны туда вирусом или системой защиты программ от
несанкционированного копирования (если исследуемый каталог содержит такие
программы).
В том случае, когда
каталог поврежден полностью или частично, ссылки на описанные в нем файлы
будут потеряны. Если Вы найдете тем или иным способом секторы, содержащие
нужный Вам файл с разрушенным дескриптором, то, пользуясь описанной ниже
методикой, сможете восстановить дескриптор и получить доступ к файлу.
Восстанавливая файловую
систему FAT компьютера с операционной системой Microsoft Windows
95/98/NT/2000, следует соблюдать осторожность, так как структура каталогов в
ней отличается от той, что была описана выше.
Как Вы, возможно, знаете,
пользователи Microsoft Windows 95/98 не слишком скованы ограничениями на
длину имен файлов и каталогов. И хотя теоретически такое ограничение
существует (255 символов), оно не имеет существенного значения.
Создавая новую операционную
систему, программисты Microsoft нашли остроумное решение проблемы
совместимости с программами MS-DOS, использующими имена в "формате
8.3" (8 символов - имя файла или каталога, 3 - расширение имени).
Это решение заключается в
том, что в каталогах наряду с обычными дескрипторами располагаются
дескрипторы специального вида. Количество таких дескрипторов зависит от длины
имени файла или каталога. В этих-то дескрипторах и хранится длинное имя.
Специально для программ MS-DOS создается обычный дескриптор, содержащий
альтернативное имя, отвечающее стандартам MS-DOS.
Новая файловая система
получила название VFAT.
Взгляните на рис. 9. На
этом рисунке показана структура каталога, созданного в файловой системе
Microsoft Windows 98.
Рис. 9.
Расширенные и альтернативные дескрипторы длинных имен в корневом каталоге
Обратите внимание на три
дескриптора, расположенных под дескриптором файла IO.SYS. Это и есть
специальные расширенные дескрипторы, хранящие информацию о длинных именах в
кодировке UNICODE (в этой кодировке каждый символ представлен двумя байтами).
В данном случае в расширенных дескрипторах хранится имя каталога
DesignWorkshop Lite Installer.
Для того чтобы
специальные дескрипторы не мешали работе программ MS-DOS, в них установлены
атрибуты Read Only, System, Hidden и Volume Label. Обычные программы MS-DOS
игнорируют элементы каталога с таким экзотическим набором атрибутов.
Специальный дескриптор
отмечается новой версией программы DISKEDIT как LFN (Long File Name) и
ссылается на кластер с номером 0. Настоящий номер первого кластера,
распределенного файлу или каталогу, находится в стандартном дескрипторе,
расположенном непосредственно вслед за расширенным дескриптором. В данном
случае это дескриптор каталога с названием DISIGN~1, расположенный в кластере
с номером 1274.
Если имя файла или
каталога превышает 8 символов, стандартный дескриптор, расположенный после
расширенных, содержит альтернативное имя, состоящее из начальных символов
имени, символа ~ (тильда) и десятичного числа. Этот дескриптор называется
альтернативным.
Операционная система
Microsoft Windows NT/2000 также создает расширенные и альтернативные
дескрипторы в разделах FAT.
При помощи строки More
главного меню программы DISKEDIT можно просмотреть или отредактировать
остальные поля специальных дескрипторов.
Например, дата и время
создания файла находятся, соответственно, в полях Create Date и Create Time.
Дополнительно операционная система Microsoft Windows 95/98 фиксирует дату
последнего обращения к файлу. Эту дату Вы можете увидеть в поле Accessed.
Поле EA содержит признак
расширенных атрибутов и имеет нулевое значение для стандартных атрибутов.
Если имя настолько
длинное, что не помещается в одном специальном дескрипторе, создается
несколько таких дескрипторов, расположенных друг за другом. Следом за ними
идет альтернативный дескриптор. В поле Ordinal находится порядковый номер
специального дескриптора. Для последнего специального дескриптора в поле Last
находится отметка Yes.
Для тех, кто интересуется
точным форматом стандартных и расширенных дескрипторов VFAT, мы привели
фрагмент исходных текстов программы CrashUndo 2000. Это объединение двух
структур, первая из которых соответствует стандартному дескриптору, а вторая
- расширенному:
typedef union _FAT_DIR_ENTRY
{
struct _DIR
{
BYTE dir_Name[8]; // имя
BYTE dir_Extension[3]; // расширение имени
BYTE dir_Attributes; // атрибуты
BYTE dir_NTReserved; // зарезервировано для Windows NT
BYTE dir_CreateTimeTenth; // десятые доли времени создания
UINT16 dir_CreateTime; // время создания
UINT16 dir_CreateDate; // дата создания
UINT16 dir_LastAccessDate; // дата последнего доступа
UINT16 dir_FirstClusterHi; // старшее слово номера кластера
UINT16 dir_WriteTime; // время обновления
UINT16 dir_WriteDate; // дата обновления
UINT16 dir_FirstClusterLo; // младшее слово номера кластера
UINT32 dir_FileSize; // размер файла
} dir;
struct _LFN
{
BYTE lfn_Sequence; // номер дескриптора
WCHAR lfn_Name1[5]; // первая часть имени
BYTE lfn_Attributes; // атрибуты
BYTE lfn_LongEntryType; // признак расширенного атрибута
BYTE lfn_Checksum; // контрольная сумма имени
WCHAR lfn_Name2[6]; // вторая часть имени
UINT16 lfn_Reserved; // зарезервировано
WCHAR lfn_Name3[2]; // третья часть имени
} lfn;
} FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
Обратите внимание, что
для хранения номера первого кластера, распределенного файлу или каталогу,
используется два 16-разрядных поля dir_FirstClusterHi и dir_FirstClusterLo.
Что же касается таблицы
размещения файлов FAT, то хотя в операционной системе Microsoft Windows 95/98
она и называется виртуальной таблицей размещения файлов Virtual File
Allocation Table (VFAT), ее формат остался прежним. Это сделано для
совместимости с программами MS-DOS. Сохранились форматы и других логических
блоков файловой системы, таких как таблица разделов диска, таблица логических
дисков, загрузочная запись и расширенный блок параметров BIOS Extended BPB.
Заметим, что для
восстановления файловой системы Microsoft Windows 95/98 нельзя использовать
старые версии пакета Norton Utilities, так как они ничего не знают о
расширенных и альтернативных дескрипторах.
Вслед за корневым
каталогом начинается область данных, простирающаяся до конца логического
диска. Эта область разбита на кластеры, причем нумерация кластеров начинается
с числа 2. Кластеру с номером 2 соответствуют первые секторы области данных.
Приведем формулу,
связывающую номер кластера с номерами секторов, занимаемых им на логическом
диске:
SectNumber = DataStart + ((ClustNumber - 2) * ClustSize)
В этой формуле
использованы следующие обозначения:
Переменная |
Описание |
SectNumber |
Номер
первого сектора, распределенного кластеру с номером ClustNumber |
DataStart |
Начальный
сектор области данных |
ClustNumber |
Номер
кластера, для которого необходимо определить номер первого сектора |
ClustSize |
Количество
секторов, занимаемых одним кластером |
Эта формула может Вам
пригодиться при ручном восстановлении файловой системы.
В этом разделе мы
приведем некоторые рекомендации, направленные на восстановление файлов,
доступ к которым стал невозможен из-за вредоносного действия вирусов или в
результате разрушения файловой системы FAT по любой другой причине. В любом
случае перед началом восстановительных работ следует провести полное
исследование параметров BIOS и файловой системы с использованием сведений,
изложенных нами ранее.
Необходимо также
убедиться, что Вы хорошо владеете структурой файловой системы и знаете
форматы всех ее компонентов, таких как таблица разделов, таблица логических
дисков, таблица размещения файлов FAT и так далее.
Если в процессе
исследования файловой системы Вы обнаружили, что некоторые структуры
оказались полностью разрушены (например, главная загрузочная запись с
таблицей разделов, таблица логических дисков, каталоги и так далее), еще не
все потеряно.
Если сохранность
информации не имеет для Вас решающего значения, то многие повреждения
файловой системы можно исправить в автоматическом режиме при помощи программ
Norton Disk Doctor или SCANDISK. Однако, эти весьма неплохие программы в
некоторых случаях не смогут оказать Вам существенной помощи. Хуже того, они
может окончательно разрушить логическую структуру диска, после чего
восстановление файлов станет невозможным.
Поэтому Вы должны владеть
хотя бы основными приемами ручного восстановления файловой системы. В тяжелых
или ответственных случаях мы настоятельно рекомендуем обращаться к нам в
службу Datarecovery.Ru через сервер http://www.datarecovery.ru
или http://www.frolov.pp.ru.
Основная идея поиска
потерянных файлов и структур данных заключается в том, что Вам известно (хотя
бы приблизительно) их имя или содержимое.
Например, секторы,
содержащие таблицу разделов, таблицу логических дисков и загрузочную запись,
имеют сигнатуру 0xAA55. Из предыдущих разделов этой главы Вы знаете, что
программы начальной загрузки содержат в своем теле известные текстовые
строки. Вы можете использовать их для поиска. Такие строки есть и в теле
расширенного блока параметров BIOS Extended PBP (это строки FAT12, FAT16 или
FAT32).
Если Вы знаете
характерные слова или последовательности байт, встречающиеся в потерянных
файлах данных, они тоже пригодны для поиска секторов файла с целью
восстановления.
Секторы, содержащие
дескрипторы каталогов, легко обнаруживаются, если знать имена описанных в нем
файлов.
Наиболее распространенное
повреждение файловой системы FAT возникает при внезапном отключении питания и
заключается в появлении так называемых потерянных кластеров. Это повреждение
также бывает следствием аппаратного сброса компьютера при работающей
операционной системе Microsoft Windows.
Потерянные кластеры
называются так потому, что на них нет ссылок ни в одном каталоге файловой
системы. Такая ситуация может возникнуть, например, из-за того, что
соответствующий каталог был просто уничтожен и, следовательно, ссылки на
описанные в нем файлы исчезли.
Чаще всего для ремонта
повреждений такого рода пользователи применяют программу SCANDISK, входящую в
состав операционной системы, или программу Norton Disk Doctor.
После восстановления
файловой системы программой Norton Disk Doctor или SCANDISK на диске может
образоваться громадное количество файлов со специфическим расширением имени,
составленные из цепочек потерянных кластеров (каждая программа восстановления
использует свое имя). Таких файлов в зависимости от серьезности повреждений файловой
системы может быть до нескольких тысяч.
Если после сбоя или
вирусной атаки Вы проверили диск одной из перечисленных выше программ, и в
результате нужные Вам файлы исчезли, существует большая вероятность, что они
оказались среди восстановленных файлов. Однако как их найти среди сотен и
тысяч других?
Проще всего это сделать,
например, с помощью программы Norton Find File. Ее можно запустить из
популярной оболочки Norton Commander при помощи комбинации клавиш Alt+F7.
В поле File(s) to find Вы
должны задать шаблон для имени файла и расширения имени, например, *.NDD.
Поиск будет выполняться только среди файлов, имя которых удовлетворяет
указанному шаблону.
Необходимо также указать
в поле Containing контекст для поиска, то есть какую-либо текстовую строку, присутствующую
в файле. Например, для того чтобы найти все файлы, созданные текстовым
процессором Microsoft Word for Windows, Вы можете указать строку контекста
"Microsoft Word", а для того чтобы найти все файлы, подготовленные
в среде процессора электронных таблиц Microsoft Excel, укажите строку
контекста "Microsoft Excel".
Список путей к найденным
файлам отобразится в верхней части окна программы Norton Find File.
В дальнейшем, если
найденных файлов будет все еще очень много, Вы можете переписать их в отдельный
каталог и переименовать, а затем продолжить поиск, используя другие строки в
качестве контекста.
По сравнению с описанной
в предыдущем разделе программой Norton Find File, программа DISKEDIT
предоставляет намного больше возможностей для поиска файлов, а также
различных структур файловой системы.
Обратите внимание на меню
Tools программы DISKEDIT.
Если выбрать из этого
меню строку Find, на экране появится диалоговая панель Enter search text. С
помощью этой диалоговой панели Вы сможете выполнять контекстный поиск строк,
заданных как символьным, так и шестнадцатеричным представлением.
Дополнительно можно указать смещение сектора и выбрать режим Ignore Case. При
использовании этого режима сравнение с образцом будет выполняться без учета
строчных или прописных букв.
Строка Find Object
позволяет выполнить поиск различных структур файловой системы. Если выбрать
эту строку, на экране появится меню второго уровня, где есть строки
Partition/Boot, FAT и Subdirectory.
Попробуйте все это в
действии. Для этого откройте меню Object и выберите из него строку Physical
Sector. Затем укажите самый первый сектор, расположенный на нулевой дорожке.
Этот сектор должен содержать главную загрузочную запись MBR. Перейдите в
режим неформатированного просмотра, выбрав из меню View строку as Hex.
А что делать, если,
взглянув на главную загрузочную запись, Вы увидели, что таблица разделов
разрушена или зашифрована?
В этом случае можно выполнить
контекстный поиск секторов загрузочных записей, содержащих блоки параметров
BIOS BPB. Проще всего это сделать, если после просмотра главной загрузочной
записи по ее физическому адресу и перехода к следующему сектору диска выбрать
из меню Tools/Find Object строку Partition/Boot.
Программа DISKEDIT найдет
сектор, содержащий в конце последовательность байт "55 AA",
соответствующую сигнатуре загрузочного сектора 0xAA55.
После того как Вы нашли
загрузочный сектор, его физический адрес можно вручную подставить в таблицу
разделов, отредактировав ее программой DISKEDIT.
Так как структура
разделов диска в процессе эксплуатации последнего может многократно
изменяться, не исключено, что Вы найдете слишком много загрузочных секторов.
Некоторые из них принадлежали старым разделам и не были уничтожены при
изменении структуры разделов, некоторые вообще могут принадлежать другим
операционным системам. В любом случае проверяйте расположение найденного
загрузочного сектора относительно других найденных вами логических структур
файловой системы. Например, Вы можете использовать для "опознания"
тот факт, что сразу после загрузочного сектора раздела FAT должна следовать
таблица размещения файлов.
Так как в процессе поиска
программа DISKEDIT проверяет только последние два байта сектора, возможны
ложные срабатывания. Вслед за найденным сектором может располагаться сектор,
содержимое которого мало похоже на таблицу размещения файлов.
Теперь выберите из меню
Tools строку Find Object и затем строку FAT. Программа DISKEDIT выполнит
поиск первой копии таблицы размещения файлов FAT, и отобразит ее дамп,
выделив в нем первые три байта.
Если теперь сместить
текстовый курсор вниз или нажать клавишу PgDn, а затем выбрать из меню
Tools/Find Object строку FAT еще раз, будет найдена вторая копия таблицы
размещения файлов FAT.
Учтите, что поиск таблиц
FAT в данном случае сводится к поиску последовательности байт "F8 FF
FF", поэтому выполнив поиск в третий раз, Вы сможете найти еще одну,
ненастоящую "таблицу FAT". Дело в том, что наверняка на диске
имеется какой-нибудь файл, содержащий указанную выше последовательность байт,
поэтому будьте внимательны.
Теперь займемся поиском
потерянных каталогов. На такие каталоги нет ссылок из других каталогов.
Для поиска Вы можете
воспользоваться строкой Subdirectory меню Tools/Find Object. Программа
DISKEDIT просматривает секторы диска в поисках такого, в начале которого
находится последовательность байт "2E 20 20 20 20 20 20 20 20 20
20". Эта последовательность соответствует дескриптору, содержащему
ссылку каталога на себя самого.
Нажимая комбинацию клавиш
Ctrl+G, Вы можете продолжить поиск нужного каталога, пока не найдете тот,
который содержит интересующие Вас файлы. Можно выполнять поиск и по имени
файла, если Вы его знаете.
Как только нужный каталог
найден, необходимо записать физический адрес сектора диска, содержащего
каталог, а затем найти либо вычислить номер кластера, соответствующего
каталогу.
Для поиска номера
кластера, в котором располагается найденный каталог, перейдите в режим
форматированного просмотра каталога, выбрав из меню View строку as Directory.
Затем в меню link выберите строку Cluster chain (fat). На экране появится
содержимое таблицы FAT в режиме форматированного просмотра, при этом искомый
номер кластера будет выделен.
Зная номер кластера
потерянного каталога, Вы можете создать новый дескриптор каталога, например,
в корневом каталоге диска, и сделать в этом дескрипторе ссылку на найденный
каталог. После этого потерянный каталог вновь станет доступным.
Учтите, что для файловой
системы VFAT необходимо правильно заполнять поле контрольной суммы имени в
расширенном дескрипторе, а также указывать 32-разрядный номер первого
кластера, распределенного файлу.
Аналогично можно вручную
восстановить ссылки на потерянные файлы и даже собрать файлы из отдельных
кластеров.
Можно предложить
следующий алгоритм восстановления файла:
Если Вы восстановили файл
документа, созданный текстовым процессором Microsoft Word for Windows или
процессором таблиц Microsoft Excel, загрузите его в соответствующее
приложение и затем сохраните его под другим именем. При этом будет
восстановлена правильная длина файла.
Простой текстовый файл
можно загрузить в текстовый редактор и "отрезать" лишние данные в
конце файла. Затем сохраните файл под другим именем.
Если Вы знаете точную
длину файла, ее можно установить при помощи программы DISKEDIT в режиме
редактирования дескриптора файла (рис. 9).
При восстановлении данных
следует иметь в виду, что, не имея достоверной информации в таблице
расположения файлов (FAT) автоматическое или полуавтоматическое
восстановление файлов размером более одного кластера программами типа
UnFormat носит чисто случайный характер.
Упрощенно говоря,
алгоритм восстановления данных подобными программами основан на поиске
кластеров раздела диска с информацией о подкаталогах, анализе их содержания
на предмет определения места расположения каталогов, определения номеров
начальных кластеров каждого файла и анализе даты создания или стирания
файлов. На базе этой информации строится дерево каталогов на логическом диске
и расположение файлов по подкаталогам. Эта информация восстановима с большой
степенью точности. В случае разрушения корневого каталога (ROOT) информация и
файлах в корневом каталоге не восстанавливается, а имена директорий
заменяются условными именами (типа DIR001).
Содержимое файлов имеющих
размер более одного кластера восстанавливается с большой долей случайности,
путем стыковки свободных последовательно расположенных кластеров, и
вследствие больших объемов информации и интенсивной работы по
созданию/удалению файлов в среде Windows (и не только) чаще всего
некорректно.
Для точного
восстановления информации необходимо либо восстановить FAT, либо осуществлять
восстановление "вручную" поиском и анализом содержимого кластеров
на диске с дальнейшей стыковкой кластеров в необходимом порядке. Ручной
способ в этом документе рассматриваться не будет.
Для попытки хотя бы
частичного восстановления FAT можно воспользоваться особенностью работы ОС
Windows 9x с виртуальной памятью, т.е. наличием на диске своп-файла. В этом
файле могут находиться куски корневой директории ROOT и отдельные фрагменты,
а подчас и полные копии FAT. Поиск этих фрагментов осуществляется в режиме
просмотра секторов диска по уникальным маскам.
В качестве начальной
маски поиска FAT может быть применен идентификатор F8 FF FF FF. В дальнейший
поиск можно осуществлять по произвольным группам, состоящим из пяти
последовательных 16-ти или 32-ти разрядных (FAT16 или FAT32) номеров
кластеров, которые могут принадлежать какому-либо файлу. Поиск занимает
довольно продолжительное время, но, меняя маски поиска, его стоит повторить
несколько раз. Следует иметь в виду, что информация в своп-файле чаще всего
располагается со смещением от начала секторов, что требует определенной
коррекции при просмотре и дальнейшем применении. Основная задача отыскать
максимальное число фрагментов, выбрать из них наиболее "свежие" и
составить из них подобие полной копии FAT. После проведения подобной операции
возможно применение утилит типа UnErase для более полного (но возможно
некорректного) восстановления файлов и DiskDoctor для коррекции дисковых
ошибок.
Если файл(ы), который
необходимо восстановить, находился в подкаталоге, можно предпринять
следующее:
recov-files@narod.ru