Восстановление данных. Практическое руководство, стр. 38
00000000: 46 49 4C 45-2A 00 03 00-7C 77 1A 04-02 00 00 00 FILE*...|w......00000010: 01 00 02 00-30 00 01 00-28 02 00 00-00 04 00 00 ....0...(.......00000020: 00 00 00 00-00 00 00 00-06 00 06 00-00 00 47 11 ..............G....000001F0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00 ................<-- Конец первого сектора файловой записи000003F0: 07 СС E1 0D-00 09 00 00-FF FF FF FF-82 79 47 11 .Іа..... ВyG.<-- Конец второго сектора файловой записиFILE RecordINDEX RecordRCRD RecordRSTR RecordАтрибуты
Структурно всякий атрибут состоит из атрибутного заголовка (attribute header) и тела атрибута (attribute body). Заголовок атрибута всегда хранится в файловой записи, расположенной внутри MFT. Тела резидентных атрибутов хранятся там же. Нерезидентные атрибуты хранят свое тело вне MFT, в одном или нескольких кластерах, перечисленных в заголовке данного атрибута в специальном списке. Если 8-разрядное поле, расположенное по смещению
08hПервые четыре байта атрибутного заголовка определяют его тип. Тип атрибута, в свою очередь, определяет формат представления тела атрибута. В частности, тело атрибута данных (тип:
80h$DATA10h$STANDARD_INFORMATIONСледующие четыре байта заголовка содержат длину атрибута, выражаемую в байтах. Длина нерезидентного атрибута равна сумме длин его тела и заголовка, а длина резидентного атрибута равна длине его заголовка. Если к смешению атрибута добавить его длину, мы получим указатель на следующий атрибут (или маркер конца, если текущий атрибут — последний в цепочке).
Длина тела резидентных атрибутов, выраженная в байтах, хранится в 32- разрядном поле, расположенном по смещению 10h байт от начала атрибутного заголовка. 16-разрядное поле, следующее за его концом, хранит смещение резидентного тела, отсчитываемое от начала атрибутного заголовка. С нерезидентными атрибутами в этом плане все намного сложнее, и для хранения длины их тела используется множество полей. Реальный размер тела атрибута (real size of attribute), выраженный в байтах, хранится в 64-разрядном поле, находящемся по смещению 30h байт от начала атрибутного заголовка. Следующее за ним 64-разрядное поле хранит инициализированный размер потока (initialized data size of the stream), выраженный в байтах. Судя по всему, инициализированный размер потока всегда равен реальному размеру тела атрибута. 64-разрядное поле, расположенное по смещению
28hДва 64-разрядных поля, расположенные по смещениям
10h18h20hData RunsКаждый атрибут имеет свой собственный идентификатор (attribute ID), уникальный для данной файловой записи и хранящийся в 16-разрядном поле, расположенном по смещению
0EhЕсли атрибут имеет имя (attribute Name), то 16-разрядное поле, расположенное по смещению
0Ah09hЕсли тело атрибута сжато, зашифровано или разрежено, 16-разрядное поле флагов, расположенное по смещению
0ChОсновные поля резидентных и нерезидентных атрибутов кратко описаны в табл. 6.4 и 6.5. Остальные поля не играют существенной роли, и потому здесь они не рассматриваются.
Таблица 6.4. Структура резидентного атрибута
| Смещение | Размер (байт) | Значение | Описание | |
|---|---|---|---|---|
00h | 4 | Тип атрибута (например, 0x100x600xB0 | ||
04h | 4 | Длина атрибута, включая этот заголовок | ||
08h | 1 | 00h | Флаг нерезидентности (non-resident flag) | |
09h | 1 | N | Длина имени атрибута (ноль, если атрибут безымянный) | |
0Ah | 2 | 18h | Смещение имени (ноль, если атрибут безымянный) | |
0Ch | 2 | 00h | Флаги | |
| Значение | Описание | |||
0001h | Сжатый атрибут (compressed) | |||
4000h | Зашифрованный атрибут (encrypted) | |||
8000h | Разреженный атрибут (sparse) | |||
0Eh | 2 | Идентификатор атрибута (attribute ID) | ||
10h | 4 | L | Длина тела атрибута, без заголовка | |
14h | 2 | 2N+18h | Смещение тела атрибута | |
16h | 1 | Индексный флаг | ||
17h | 1 | 00h | Используется для выравнивания | |
18h | 2N | UNICODE | Имя атрибута (если есть) | |
2N+18h | L | Тело атрибута | ||