Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная робота3.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
369.66 Кб
Скачать

Структура заголовка атрибута

Каждый атрибут состоит из заголовка и области данных (содержания) атрибута. Структура заголовка одинакова у всех атрибутов и не зависит от их типа и содержания:

Смещение, байт

Размер, байт

Описание

0x00

4

Тип атрибута

0x04

4

Размер области памяти, занимаемой атрибутом

0x08

1

Флаг нерезидентного атрибута

0x09

1

Длина имени атрибута

0x0A

2

Смещение области данных атрибута

0x0C

2

Флаг упакованного атрибута

0x0E

2

Идентификатор атрибута

По смещению 0x08 находится признак резидентности атрибута. Если его значение равно 1, запись $MFT хранит только список кластеров, выделенных файлу (то есть атрибут нерезидентный), а если 0 — файл находится внутри самой записи $MFT, (то есть является резидентным).

Поле со смещением 0x0C содержит флаг упакованного атрибута. Если этот флаг установлен, данные атрибута хранятся в упакованном или зашифрованном виде. Итак, таким образом, первые 16 байт атрибута файла хранят заголовок фиксированного формата. Далее со смещением 0x10 начинается область данных атрибута, формат который различен для различных атрибутов.

Рассмотрим теперь структуру области данных отдельных атрибутов.

Структура области данных атрибута $STANDARD_INFORMATION

Как уже упоминалось выше, в нем записана дата и время создания и изменения файла, а также флаги доступа. Ниже приводится формат области данных атрибута $STANDARD_INFORMATION:

Смещение, байт

Размер, байт

Описание

0x18

8

Дата и время создания файла

0x20

8

Дата и время последнего изменения файла

0x28

8

Дата и время последнего изменения записи $MFT

0x30

8

Дата и время последнего доступа к файлу

0x38

4

Флаги доступа

0x3С

12

Поле зарезервировано, содержит нулевые байты

В свою очередь, флаги доступа представляют собой набор отдельных битов, комбинируемых при помощи логической операции ИЛИ:

Бит

Описание

0x0001

Для файла или каталога разрешено только чтение

0x0002

Скрытый файл или каталог

0x0004

Системный файл или каталог

0x0020

Было выполнено архивирование файла

0x0400

Символическая ссылка - ярлык (Symbolic Link)

0x0800

Упакованный файл или каталог

Структура области данных атрибута $FILE_NAME

В этом атрибуте снова повторяются данные, связанные с датой и временем создания, последнего изменения файла и т.д. Однако, главные являются данные об имени файла и его характеристиках:

Смещение, байт

Размер, байт

Описание

0x18

8

Номер записи $MFT для каталога, содержащего данный файл

0x20

8

Дата и время создания файла

0x28

8

Дата и время последнего изменения файла

0x30

8

Дата и время последнего изменения записи $MFT данного файла

0x38

8

Дата и время последнего доступа к файлу

0x40

8

Размер дискового пространства, использованного для хранения файла

0x48

8

Реальная длина файла

0x50

8

Флаги доступа

0x58

1

Длина имени файла N

0x59

1

Код пространства имени файла

0x5A

2*N

Имя файла в коде UNUCODE. Это поле имеет длину 2*N, где N - длина имени файла из поля со смещением 0x50

Структура области данных атрибута $DATA

Этот атрибут представляет наибольший интерес, поскольку он имеет отношение к содержимому файла. Как указывалось выше, атрибуты могут быть резидентными и нерезидентными. В отличие от атрибутов $STANDARD_INFORMATION и $FILE_NAME, которые всегда резидентные, атрибут $DATA может быть нерезидентным. Все зависит от объема файла, для которого создана запись в $MFT.

Если длина файла не превышает 1500 байт, то содержимое файла целиком размещается в области данных атрибута $DATA, и тогда атрибут является резидентным. Если объем файла больше, чем 1500 байт, то в области данных атрибута хранится только список блоков кластеров, где хранится данный файл, а сам атрибут $DATA является нерезидентным.

Резидентный атрибут $DATA

Формат области данных резидентного атрибута приведен ниже:

Смещение, байт

Размер, байт

Описание

0x10

4

Размер блока данных в байтах

0x14

2

Смещение блока данных

0x16

2

Флаг индексированного атрибута

Рассмотрим на примере, как выглядит область данных атрибута $DATA для файла Samll28.txt, содержащего текст "Small resident file" и имеющего объем 19 байт. Просмотр с помощью программы Diskprobe 1.0 записи для данного файла в $MFT дает следующую картину:

В данном примере атрибут $DATA имеет смещение 0x128 от начала сектора. Согласно приведенному выше формату резидентного атрибута $DATA, размер блока данных, предназначенного для хранения содержимого файла Samll28.txt, находится в четырех-байтном поле с адресом 0x128+0x10=0x0138 и равен 0x13 байт, то есть 19 байт в десятичной системе счисления. Это поле выделено на нашем рисунке рамкой зеленого цвета.

Аналогично, смещение начала блока данных файла Samll28.txt хранится в слове со смещением 0x128+0x14=0x013C от начала сектора. Соответствующее поле выделено на рисунке рамкой синего цвета, и его содержимое равно 0x18. Таким образом, содержимое резидентного файла Samll28.txt располагается со смещением 0x128+0x18=0x0140 от начала сектора и занимают 19 байт (на рисунке выделено рамкой желтого цвета).

Читаем их, используя кодирование ASCII, и получаем текст, записанный в файл, то есть "Small resident file".

Нерезидентный атрибут $DATA

Хранение данных резидентных файлов непосредственно в записях $MFT увеличивает скорость доступа, однако, очевидно, для файлов большого размера этот способ хранения не подходит. Такие файлы хранятся на диске в отдельных кластерах, причем список кластеров, выделенных файлу, указывается в специальном формате в нерезидентном атрибуте $DATA, образуя цепочку так называемых блоков виртуальных номеров кластеров Virtual Cluster Number (VCN), или экстендов.

Чтобы в процессе восстановления извлечь нерезидентный файл, необходимо отыскать в соответствующем атрибуте $DATA и все VCN данного файла. Далее нужно скопировать все эти экстенды в один файл и установить для полученного файла правильную длину, взятую из атрибута $DATA.

Процесс этот далеко не всегда прост, так как файл может храниться в упакованном или зашифрованном виде. Кроме того, у одного файла может быть несколько атрибутов $DATA. Эти атрибуты могут располагаться в главной записи $MFT и в расширенных записях $MFT одновременно.

Ниже приведен формат области данных нерезидентного атрибута $DATA:

Смещение, байт

Размер, байт

Описание

0x10

8

Начальный номер VCN

0x18

8

Конечный номер VCN

0x20

2

Смещение списка экстентов Runlist

0x22

2

Код метода упаковки атрибута (0 – упаковки и шифрования нет)

0x28

8

Размер области данных, занимаемой файлом на диске

0x30

8

Реальная длина файла

0x38

8

Размер инициализированной области дисковой памяти, выделенной для хранения файла

Список экстентов Runlist необходим нам для получения номеров кластеров раздела NTFS, выделенных для хранения восстанавливаемого файла. Каждый элемент данного списка описывает размер и расположение одного экстента (непрерывного фрагмента) файла. Реальная длина файла может быть получена из поля со смещением 0x30. Рассмотрим практический пример:

В данном примере атрибут $DATA начинается со смещения 0x1B0 от начала сектора.

Поле смещения списка Runlist выделено рамкой синего цвета и расположено в записи $MFT со смещением 0x1B0+0x20=0x1D0 от начала сектора. Там хранится значение 0x40 - смещение списка Runlist относительно начала атрибута $DATA. Таким образом, список Runlist начинается с байта, имеющего смещение 0x1B0+0x40=0x1F0 от начала сектора. Этот список выделен рамкой фиолетового цвета.

Код метода упаковки находится в байте со смещением 0x1B0+0x22=0x1D2 и равен 0 (файл не упакован). Соответствующее поле выделено рамкой красного цвета.

Реальный размер файла хранится в поле длинной 8 байт, которое расположено в записи $MFT со смещением 0x1B0+0x30=0x1E0 от начала сектора. Он равен 0x3EC00 байт в шестнадцатеричной или 257024 байт в десятичной системе счисления.

Теперь просматриваем список Runlist. Первый байт списка содержит код 21. Это означает, что в первый блок VCN входят еще два поля общей длиной три байта. Таким образом, в нашем случае первый блок VCN равен

21 05 0E 45.

Первое поле, имеющее длину один байт, хранит количество кластеров, выделенных экстенту файла. Второе поле размером два байта содержит номер первого кластера. В данном случае первому экстенту файла $MFT выделено 5 кластеров, а номер первого кластера для первого экстента равен 450E. Таким образом определяем размер и расположение первого экстента файла.

Второй блок VCN расположен сразу вслед за первым:

21 0A 99 7F.

Для того чтобы определить первый кластер второго экстента, необходимо прибавить к адресу первого экстента смещение, указанное во втором блоке VCN (с учетом знака). В данном случае второй экстент размещен в кластере с номером 450E+7F99=C4A8. Длина второго экстента составляет 0A кластеров.

Анализируя остальные блоки VCN , можно определить размеры и расположение всех экстентов файла. Список блоков VCN закрывается байтом с нулевым значением.