Microsoft, желая защитить диски NTFS от просмотра, не предоставляет документации по структуре NTFS. Это странно, так как у многих есть такие диски, но никто не знает, как с ними работать. Что ж, придётся разбираться в этом самому. Вот какую информацию мне удалось узнать.
Мощный инструмент для работы с NTFS - Microsoft DiskEdit для NTFS. Где его достать, вы можете узнать здесь.
Внимание! Данная информация не претендует на полноту или достоверность. Здесь написано, как я считаю, что должно быть, совсем необязательно, что правильно.
Раздел NTFS в таблице разделов идентифицируется номером 7. Первый сектор раздела - загрузочный.
Смещение | Размер | Пример содержимого | Описание |
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 | 2 | 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, и прочитать нужную запись из его данных. Она находятся по смещению : № записи*размер записи.
Смещение | Размер | Описание |
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 | Байт, описывающий размеры,
отведённые под следующие величины
В 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
Смещение | Размер | Описание |
0 | 8 | Структура FileReference, описывающая родительский каталог |
8 | 8 | Дата/время создания |
10h | 8 | Дата/время изменения |
18h | 8 | Дата/время изменения записи MFT этого файла |
20h | 8 | Дата/время последнего доступа |
28h | 8 | Занятое файлом место на диске |
30h | 8 | Размер файла |
38h | 8 | Файловые флаги
|
40h | 1 | Длина имени файла (в символах Unicode) - N |
41h | 1 | Формат имени файла
|
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
Приложение:
Младшая цифра |
Старшие три 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 со старшим нулевым байтом.