Описание файловой системы NTFS.

Microsoft, желая защитить диски NTFS от просмотра, не предоставляет документации по структуре NTFS. Это странно, так как у многих есть такие диски, но никто не знает, как с ними работать. Что ж, придётся разбираться в этом самому. Вот какую информацию мне удалось узнать.

Мощный инструмент для работы с NTFS - Microsoft DiskEdit для NTFS. Где его достать, вы можете узнать здесь.

Внимание! Данная информация не претендует на полноту или достоверность. Здесь написано, как я считаю, что должно быть, совсем необязательно, что правильно.

Раздел NTFS в таблице разделов идентифицируется номером 7. Первый сектор раздела - загрузочный.

Загрузочный сектор раздела NTFS
Смещение Размер Пример содержимого Описание
00h 3 0EBh, 52h, 90h Инструкция перехода (jmp) на загрузочный код
03h 8 'NTFS    ' Текстовая строка с именем производителя
0Bh 2 512 (200h) Размер сектора в байтах
0Dh 1 8 Размер кластера в секторах
0Eh 2 0 Число секторов в разделе перед этим сектором (должно быть 0)
10h 3 0 Должно быть 0
13h 2 0 Должно быть 0
15h 1 0F8h Тип носителя информации (не используется NTFS)
16h 2 0 Должно быть 0
18h 2 3Fh Секторов на дорожке
1Ah 2 0FFh Число головок
1Ch 4 3Fh Число секторов перед разделом
20h 4 0 Должно быть 0
24h 4 800080h Зарезервировано
28h 8 100000000h Число секторов в разделе
30h 8 4 Номер первого кластера MFT
38h 8 111911h Номер первого кластера MTFMirr
40h 1 0F5 Размер записи MFT в кластерах*
41h 3 0 Расширение до двойного слова
44h 1 1 Размер записи каталога в кластерах*
45h 3 0 Расширение до двойного слова
48h 8 0FECBA9876543210h Серийный номер раздела
50h 4 0 Зарезервировано
54h 1AAh  - Загрузочный код
1FEh 2 55AAh Сигнатура загрузочного сектора
* - если байт отрицательный, то размер записи в байтах определяется так : 2 в степени (-байт размера)

Данные, находящиеся с 0Bh по 23h называются BPB, их значение идентично тем же значениям в FAT.

Следом за загрузочным сектором идут 15 секторов с загрузочным кодом (тех 246 байт, что находятся в загрузочном секторе, очень мало).

В отличие от FAT, все пространство диска NTFS разделено на кластеры. Поэтому, если данные начинаются с какого-либо кластера, то номер первого сектора в разделе вычисляется так : Номер_кластера * Число_секторов_в_кластере

Чтобы найти файлы на диске, нужно добраться до файла MFT. Это такой большой файл-свалка (12,5% от объёма диска), где находится вся информация о размещении всех файлов на диске. В нём содержатся последовательные записи о файлах и папках.

 Пусть х - байт по смещению 40h в загрузочном секторе (размер записи MFT в кластерах). Тогда размер записи MFT (в секторах) равен :
 - х * Число_секторов_в_кластере, если х положителен
 - 2(-х)/Размер_сектора_в_байтах, если х отрицателен

Такой способ вычисления сделан для того, чтобы размер записи MFT мог быть меньше размера кластера. Если х = 0F6h (-10), то размер записи MFT равен 210 = 1024 (1 Кб), или 2 сектора. Чаще всего запись MFT бывает размером именно 1Кб.

Первые 16 записей файла MFT зарезервированы под так называемые метафайлы.

Номер записи Имя файла Описание
0 $MFT Описатель самого файла MFT. Здесь описано местонахождение всего этого файла, а не только первых 16 элементов
1 $MTFMirr Описатель файла-копии первых четырех элементов MFT (или первого кластера MFT, если он больше)
2 $LogFile Описатель файла, содержащего информацию об изменениях метафайлов
3 $Volume Файл содержит метку диска и версию NTFS
4 $AttrDef Перечисляет возможные атрибуты файлов и их описание
5

.

Корневой каталог диска
6 $Bitmap Карта свободных и занятых кластеров диска
7 $Boot Копия загрузочного сектора и секторов с кодом
8 $BadClus Карта повреждённых кластеров диска
9 $Secure Содержит дескрипторы безопасности для каждого файла
10 $Upcase Содержит информацию о соответствии заглавных и строчных символов Unicode
11 $Extend Содержит различные возможные расширения
12-15 Зарезервированы

Файл, с точки зрения NTFS - это набор атрибутов, описанный в MFT. Для каждого файла на диске создаётся запись в MFT (базовая). В ней описывается переменное количество атрибутов файла (вся информация файла содержится в различных атрибутах). Если список атрибутов не помещается в базовую запись, то создаётся одна или несколько расширенных записей, где продолжается описание атрибутов. Запись MFT состоит из заголовка и списка атрибутов переменной длины. Из всей записи MFT фиксированное положение занимает только её заголовок.

Давайте рассмотрим формат заголовка записи MFT

Смещение Размер Пример значения Описание
00h 4 'FILE' Сигнатура, признак записи MFT
04h 2Ah Смещение начала массива восстановления
06h 2 3 Размер массива восстановления в словах
08h 8 12345678h Номер первой записи в файле $LogFile, описывающей изменение этой записи
10h 2 1 Последовательный номер описываемого файла (наверное)
12h 2 1 Количество ссылок на эту запись
14h 2 30h Смещение начала списка атрибутов файла
16h 2 0 Флаги
биты :
 0 - Запись сейчас обновляется
 1 - Это каталог, а не файл
 2 - ?
 3 - ?
18h 4 2F0h Число байтов, использованных в этой записи
1Ch 4 400h Байт доступно в этой записи
20h 8 0 Структура FileReference, описывающая базовую запись файла. Содержит 0, если запись базовая
28h 2 6 Число атрибутов в записи

Для контроля целостности записи MFT Windows записывает в последнее слово (слово - это двухбайтовое число, если кто не знает) каждого сектора записи уникальное число для каждой записи. Это число содержится в первом слове массива восстановления. Числа, которые изначально были в последних словах секторов, сохраняются в последующих словах массива восстановления. Таким образом, его размер в словах равен: (Число секторов в записи)+1. Прежде чем работать с записью, необходимо выполнить следующие действия: а) Считать первое слово массива восстановления. Проверить последнее слово каждого сектора записи на равенство ему. Если хоть одно из них не равно, запись повреждена. б). Заменить эти слова значениями, сохранёнными в последующих словах массива восстановления.

Каждый файл в разделе идентифицируется 6-байтовым числом - номером его базовой записи в файле MFT. Чтобы найти эту запись, нужно взять информацию обо всём файле MFT из записи № 0, и прочитать нужную запись из его данных. Она находятся по смещению : № записи*размер записи.

Структура FileReference
Смещение Размер Описание
0 6 Номер записи MFT, описывающей файл
6 2 Последовательный номер файла (наверное)

После заголовка в записи следуют массив восстановления и список атрибутов. Больше в записи ничего нет. Атрибуты имеют фиксированный заголовок и область данных переменного размера.

Заголовок атрибута
Смещение Размер Описание
0 4 Тип атрибута
4 4 Размер атрибута, включая заголовок
8 1 Флаг: 0 - атрибут резидентный
          1 - атрибут нерезидентный
9 1 Длина имени атрибута
0Ah 2 Смещение имени атрибута
0Ch 2 Флаги :
бит 0 - данные атрибута упакованы
0Eh 2 Номер атрибута по порядку

Тип атрибута - это номер, идентифицирующий назначение атрибута. Атрибуты в списке отсортированы по возрастанию типа. Смещение первого атрибута в списке указано по смещению 14h в заголовке записи. Чтобы найти следующий атрибут, нужно к смещению прибавить размер атрибута. Значение 0FFFFFFFFh (-1) в поле типа атрибута или размер атрибута 0 сигнализируют, что атрибутов больше нет. Если список атрибутов выходит за смещение, указанное в поле 18h записи MFT, значит запись повреждена. Атрибуты, кроме типа, могут иметь ещё необязательное имя. Атрибут является резидентным, если его данные целиком находятся в записи MFT (в области данных атрибута). Если атрибут нерезидентный, в его области данных находится информация о том, где эти данные находятся. Далее содержимое заголовка различается у резидентных и нерезидентных атрибутов.

Заголовок резидентного атрибута
Смещение Размер Описание
10h 4 Размер области данных
14h 2 Смещение области данных от начала атрибута
16h 2 Ещё какие-то флаги

У резидентного атрибута все данные обычно находятся сразу за концом заголовка

Заголовок нерезидентного атрибута
Смещение Размер Описание
10h 8 Первый виртуальный кластер (VCN) данных атрибута
18h 8 Последний виртуальный кластер данных
20h 2 Смещение списка экстентов от начала атрибута
22h 1 Метод сжатия или шифрования данных (0-данные не сжаты)
28h 8 Размер места, выделенного под данные
30h 8 Размер данных атрибута
38h 8 Размер действительных данных (наверное, отличается от размера данных, если они запакованы)

Виртуальный кластер описываемых данных - это фактически смещение (в единицах, равных размеру кластера) от начала данных . Эти виртуальные кластеры заданы здесь для того, чтобы можно было "склеить" данные, описанные в двух атрибутах одного типа. Обычно сразу за заголовком следует список экстентов. Список экстентов данных - это информация о том, где на диске находится каждая часть данных. Экстент - участок непрерывной записи данных. Он характеризуется тройкой значений : VCN, LCN, k , где VCN - виртуальный кластер начала экстента, LCN - физический номер на диске первого кластера экстента, k - длина экстента в кластерах. Список экстентов данных атрибута довольно интересно запакован (для экономии места):

Список экстентов
Смещение Размер Описание
0 1 Байт, описывающий размеры, отведённые под следующие величины
  • биты 0 -3 : M - размер записи длины экстента (k)
  • биты 4-7 : N - размер записи начала экстента (LCN)

В hex-записи это число выглядит как NMh. Если оно равно 0, то экстентов больше нет. M или N может быть равно нулю, тогда значение и длина k или LCN соответственно, тоже равны нулю. 

1 M Длина экстента в кластерах (k)
M+1 N Номер первого кластера экстента на диске (LCN). Значение должно быть расширено до 8-байтового числа со знаком. Это число - смещение в кластерах относительно предыдущего LCN.
M+N+1

Следующий экстент

 

Стандартные типы атрибутов
Номер типа Название Описание
10h Стандартная информация  Дата/время создания, размер файла, скрытый/системный и т.п.
20h Полный список всех атрибутов  Этот атрибут используется для нахождения всех атрибутов, не входящих в базовую запись MFT
30h Имя файла  Имя файла + копия стандартной информации
40h Версия раздела  
50h Дескриптор безопасности  
60h Имя раздела  
70h Информация о разделе  
80h Данные файла Да, данные файла - это всего лишь один из его атрибутов
90h Корень индекса  В этих двух атрибутах в записи каталога находятся записи о содержащихся файлах
0A0h Размещение индексов 
0B0h Битовая карта  
0C0h Символическая ссылка  
0D0h    
0E0h    

Все эти атрибуты необязательны, и каждый атрибут может повторяться несколько раз, но атрибуты одного типа должны иметь разные имена. (Как вам, например, файл с пятью разными именами, или файл с тремя областями данных?). Кроме указанных, пользователь может ввести свои, специфические атрибуты. Но обычно у файла обычно один неименованный атрибут данных и один - имени (или два, одно - MS-DOS, другое -Windows). Что это, файл или каталог, можно определить только по содержимому атрибута "Имя файла". В каталоге информация о файлах, входящих в него находится не в данных файла, а в атрибутах "Корень индекса" и "Размещение индексов". Обычно резидентны атрибуты "Стандартная информация", "Имя файла" и "Корень индекса".

Нас будут интересовать атрибуты : "Стандартная информация", "Полный список атрибутов" (если он есть), "Имя файла", "Данные файла", "Корень индекса" и "Размещение индексов".

Далее идёт информация только о структуре данных атрибута, заголовки у всех атрибутов одинаковы (описаны выше).

Атрибут "Имя файла" содержит в своих данных только структуру FILENAME

Структура FILENAME
Смещение Размер Описание
0 8 Структура FileReference, описывающая родительский каталог
8 8 Дата/время создания
10h 8 Дата/время изменения
18h 8 Дата/время изменения записи MFT этого файла
20h 8 Дата/время последнего доступа
28h 8 Занятое файлом место на диске
30h 8 Размер файла
38h 8 Файловые флаги
  • бит 0 : 1 - только для чтения
  • бит 1 : 1 - скрытый
  • бит 2 : 1 - системный
  • бит 24 : 1 - это каталог
40h 1 Длина имени файла (в символах Unicode) - N
41h 1 Формат имени файла
  • бит 0 : 1 - это полное Windows-имя файла
  • бит 1 : 1 - это имя соответствует стандарту 8.3 имени MS-DOS
42h 2*N Имя файла, записанное символами Unicode (без завершающего нуля)

Дата/время записаны в 100-наносекундных интервалах с 1 января 1601 года (причём по Гринвичу). Для получения их в нормальном виде можете использовать функцию FileTimeToSystemTime, а можете делить сами (а, ну-ка, сколько в году секунд?). Формат имени файла будет 3 у файла "pagefile.sys", 1 у "Program Files", и 2 у "PROGRA~1", 0 у ".шму*n...   ?fg".

Данные атрибута "Стандартная информация" совпадают с участком структуры FILENAME со смещения 8 до смещения 3Ah, то есть без измени файла и FileReference..

В атрибуте "Полный список атрибутов" содержится информация обо всех атрибутах файла, даже о тех, которые содержатся в базовой записи MFT.

Данные атрибута "Полный список атрибутов"
Смещение Размер Описание
0 4 Тип атрибута
4 2 Размер атрибута
6 1 Длина имени атрибута (в сиволах)
7 1 Смещение имени атрибута
8 8 Первый виртуальный кластер данных атрибута
10h 8 FileReference - указатель на запись MFT, содержащую атрибут
18h 2 Порядковый номер атрибута
? ? Следующий атрибут

Данными для атрибута "Данные файла" является содержимое файла.

В данных атрибутов "Корень индекса" и "Размещение индексов" находится список файлов, входящих в этот каталог. Оба этих атрибута имеют имя '$I30'."Корень индекса" должен присутствовать обязательно, а, если список индексов не вмещается в этот резидентный атрибут, то дополнительные индексы делятся на записи индексов, и помещаются в нерезидентный атрибут "Размещение индексов".

Данные атрибута "Корень индекса"
Смещение Размер Описание
0 4 Номер атрибута, по которому отсортированы индексы (обычно 30h - "Имя файла")
4 4 ?
8 4 Размер записи индексов в байтах
0Ch 2 Размер записи индексов в кластерах (зачем?)
10h  4 Смещение первого индекса в данных этого атрибута (относительно смещения 10h)
14h 4 Использовано байт в данных атрибута
18h 4 Байт доступно
1Ch 4 Флаги

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

Остальные файловые индексы находятся в записях индексов. Записи следуют одна за другой в данных атрибута "Размещение индексов". Каждой записи соответствует бит в данных атрибута "Битовая карта". По-моему, если бит сброшен, то запись недействительна. Размер записи указан в атрибуте "Корень индекса".

Заголовок записи индексов
Смещение Размер Описание
0 4 Сигнатура 'INDX'
4 2 Смещение массива восстановления
6 2 Размер массива восстановления в словах
10h 8 Номер этого VCN
18h 4 Смещение первого индекса (относительно смещения 18h)
1Ch 4 Число байт, использованных в записи
20h 4 Всего доступно байтов
24h 4 Ещё какие-то флаги

 Как вы заметили, в данных атрибута, как и в записи MFT, тоже есть массив восстановления. Работать с ним нужно точно так же. Обычно сразу за ним следуют файловые индексы (записи о содержащихся в каталоге файлах).

Файловый индекс
Смещение Размер Описание
0 8 Структура FileReference, описывающая файл
8 2 Размер индекса
0Ah 2 Размер структуры FILENAME - N
0Ch 4 Флаги :
бит 0 - ?
бит 1 - это последний индекс
10h N Структура FILENAME с именем и атрибутами файла

Эта страница обновляется по мере того, как я что-то узнаю.

Автор: Droopy   www.droopy.narod.ru

Приложение:

Русские символы Unicode
Младшая цифра

Старшие три hex-цифры

040x 041x 042x 043x 044x 045x
0 А Р а р
1 Ё Б С б с ё
2 В Т в т
3 Г У г у
4 Д Ф д ф
5 Е Х е х
6 Ж Ц ж ц
7 З Ч з ч
8 И Ш и ш
9 Й Щ й щ
A К Ъ к ъ
B Л Ы л ы
C М Ь м ь
D Н Э н э
E О Ю о ю
F П Я п я

Английские символы Unicode - точно те же первые 128 символов ASCII со старшим нулевым байтом.

Сайт управляется системой uCoz