<<
>>

Атрибуты и структуры данных индексов

В предыдущем разделе рассматривались атрибуты и концепции, относящиеся ко всем файлам. В этом разделе речь пойдет о структурах данных и атрибутах, специфических для индексов. Напомню, что индексы реализуются в виде структур данных, которые представляют собой отсортированное дерево.

Дерево состоит из одного или нескольких узлов, а каждый узел содержит один или несколько индексных элементов. Корень дерева находится в атрибуте $INDEX_R00T, а другие узлы — в индексных записях атрибута $INDEX_ALL0CATI0N. Атрибут $В1ТМАР содержит информацию о состоянии выделения индексных записей.

В этом разделе мы начнем с внешнего уровня и будем постепенно продвигаться вовнутрь.

Атрибут $INDEX_ROOT

Атрибут $INDEX_R00T (идентификатор типа 144) всегда является резидентным. Он всегда представляет корневой узел индексного дерева, а храниться в нем может лишь небольшой список индексных элементов. Атрибут $INDEX_R00T обладает 16- разрядным заголовком, за которым следует заголовок узла и список индексных элементов (рис. 13.5). Заголовок узла описан в разделе «Структура данных заголовка индексного узла», а индексные элементы — в разделе «Структура данных обобщенного индексного элемента», а этот раздел посвящен заголовку $INDEX_R00T.

Заголовок $INDEX_R00T начинается с байта 0 содержимого атрибута, а его поля перечислены в табл. 13.12.

Таблица 13.12. Структура данных атрибута $INDEX_ROOT

Диапазон

Описание

Необходимость

0-3

Тип атрибута в индексе (0, если элемент не использует атрибута)

Да

4-7

Правило сортировки

Да

8-11

Размер каждой индексной записи в байтах

Да

12-12

Размер каждой индексной записи в кластерах

Да

13-15

Не используется

Нет

16+

Заголовок узла (см.

табл. 13.14)

Да

Структура данных определяет тип атрибута, содержащегося в индексных элементах, способ их сортировки и размер каждой индексной записи в атрибуте $INDEX_ALLOCATION. Значение размера в байтах 8-11 задается в байтах, а значение поля в байте 12 представляет собой либо количество кластеров, либо логарифм размера. Способ кодирования более подробно описан в разделе «Файл $Boot». Помните, что размер индексной записи также задается в загрузочном секторе.

Для просмотра содержимого атрибута $INDEX_R00T можно воспользоваться программой icat с указанием типа 144: icat -f ntfs ntfsl.dd 7774-144 | xxd

0000000: 3000 0000 0100 0000 0010 0000 0400 0000 0

0000016: 1000 0000 a000 0000 a000 0000 0100 0000

[...]

Байты 0-3 показывают, что атрибут в индексе относится к типу 48 (0x30), что соответствует атрибуту $FILE_NAME. Байты 8-11 показывают, что размер каждой индексной записи равен 4096 байтам.

Атрибут $INDEX_ALLOCATION

В больших каталогах все индексные элементы не помещаются в резидентном атрибуте $INDEX_R00T, поэтому для их размещения необходим нерезидентный атрибут $INDEX_ALLOCATION. Атрибут $INDEX_ALLOCATION заполняется индексными записями. Индексная запись имеет статический размер и представляет один узел отсортированного дерева. Размер индексной записи определяется в заголовке атрибута $INDEX_R00T и в загрузочном секторе; типичный размер равен 4096 байтам. Атрибут $INDEX_ALLOCATION обладает идентификатором типа 160 и не может существовать без атрибута $INDEX_R00T.

Каждая индексная запись начинается со структуры данных заголовка, за которой следует заголовок узла и список индексных элементов. Заголовок узла и индексные элементы представлены одинаковыми структурами данных, используемыми в атрибуте $INDEX_R00T. Первая индексная запись начинается с байта О атрибута. На рис. 13.6 показан атрибут $INDEX_ALLOCATION с двумя индексными записями.

Поля, из которых состоит заголовок индексной записи, перечислены в табл.

13.13.

Таблица 13.13. Структура данных заголовка индексной записи

Диапазон

Описание

Необходимость

0-3

Сигнатура («INDX»)

Нет

4-5

Смещение массива с данными замены маркеров

Да

6-7

Количество элементов в массиве замены маркеров

Да

8-15

Номер LSN для $LogFile

Нет

16-23

Номер VCN записи в полном индексном потоке

Да

24+

Заголовок узла (см. табл. 13.14)

Да

Атрибут

$INDEX_ALLOCATION

Заголовок

Рис. 13.6. Внутренняя структура атрибута $INDEX_ALLOCATION с заголовками записей, заголовками узлов и индексными элементами

Первые четыре поля практически идентичны полям записи MFT, но отличаются сигнатурой. Маркеры и массивы замены описаны в начале главы.

Номер VCN в байтах 16-23 определяет местонахождение записи в дереве. Ат- рибут $INDEX_ALLOCATION заполнен индексными записями, которые могут следовать в произвольном порядке. Значение VCN в заголовке указывает местонахождение записи в буфере. Когда индексный элемент ссылается на свой дочерний узел, он использует адрес VCN из заголовка индексной записи узла.

Вот как выглядит содержимое атрибута $INDEX_ALLOCATION того лее каталога, для которого мы просматривали атрибут $INDEX_R00T: icat -f ntfs ntfsl.dd 7774-160 | xxd

0000000: 494e 4458 2800 0900 4760 2103 0000 0000 INDX(...G'!

0000016: 0000 0000 0000 0000 2800 0000 f808 0000               (

[...]

В первой строке видна сигнатура «INDX», а в байтах 4-5 и 6-7 содержатся заменители маркеров.

Байты 16-23 показывают, что индексная запись соответствует буферу VCN 0. Заголовок узла начинается с байта 24. Атрибут $INDEX_ALLOCATION имеет длину 8192 байта, поэтому в нем хватает места еще для одной индексной записи, начинающейся с байта 4096:

[...]

0004096: 494е 4458 2800 0900 ed5d 2103 0000 0000 INDX(....]!             

0004112: 0400 0000 0000 0000 2800 0000 6807 0000                            (...h...

0004128: e80f 0000 0000 0000 ЗЬОО 0500 6900 с401                            :.. .1.. .

[...]

Байты 4112-4119 показывают, что это VCN 4 (каждый кластер в файловой системе состоит из 1024 байт). Мы еще вернемся к этому примеру после рассмотрения заголовков узлов и индексных элементов.

Атрибут $В1ТМАР

В предыдущем разделе приводился атрибут $INDEX_ALLOCATION с двумя 4096-байтовыми индексными записями. Может оказаться, что некоторые индексные записи не используются. Атрибут $В1ТМАР содержит информацию о том, какие индексные записи в атрибуте $INDEX_ALLOCATION выделены для хранения данных. Как правило, Windows выделяет индексные записи только по мере необходимости, однако в каталоге могут появиться свободные записи — например, в результате удаления множества файлов. Учтите, что атрибут $В1ТМАР также используется в таблице MFT для отслеживания состояния выделения записей MFT.

Атрибут $В1ТМАР (идентификатор типа 176) делится на байты; каждый байт соответствует индексной записи. Для просмотра атрибута $ BITMAP в предыдущем примере можно воспользоваться программой icat: icat -f ntfs ntfsl.dd 7774-176 | xxd

0000000: 0300 0000 0000 0000

В байте 0 находится значение 0x03, или в двоичном представлении 0000 ООН. Следовательно, индексные записи 0 и 1 выделены для использования.

Структура данных заголовка индексного узла

До настоящего момента мы рассматривали атрибуты $INDEX_R00T и $INDEX_AL- L0CATI0N. Оба атрибута содержат заголовочные данные, за которыми следует заголовок узла и список индексных элементов.

В этом разделе описывается структура данных заголовка узла. Заголовок присутствует в $INDEX_R00T и в каждой структуре данных индексной записи; он показывает, где начинается и заканчивается список индексных элементов. Поля заголовка перечислены в табл. 13.14.

Таблица 13.14. Структура данных заголовка индексного узла

Диапазон

Описание

Необходимость

0-3

Смещение начала списка индексных элементов (относительно начала заголовка узла)

Да

4-7

Смещение конца используемой части списка индексных элементов (относительно начала заголовка узла)

Да

8—11

Смещение конца выделенного буфера списка индексных элементов (относительно начала заголовка узла)

Да

12-15

Флаги

Нет

Индексные элементы узла $INDEX_R00T начинаются сразу же за заголовком узла, но индексные элементы в индексном буфере могут смещаться из-за массива

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

Поле флагов содержит всего один флаг 0x01: он устанавливается в том случае, если элементы этого списка ссылаются на дочерние узлы. Этот флаг присутствует в каждом индексном элементе.

Давайте снова вернемся к уже рассмотренным атрибутам. Атрибут $INDEX_R00T содержит следующие данные: icat -f ntfs ntfsl.dd 7774-144 | xxd

0000000: 3000 0000 0100 0000 0010 0000 0400 0000 0

0000016: 1000 0000 a000 0000 a000 0000 0100 0000

[...]

Заголовок узла начинается с байта 16; байты 16-19 показывают, что список начинается со смещением 16 (0x10) байт, то есть с байта 32, и заканчивается со смещением 160 (ОхаО) байт, то есть в байте 176.

В этом случае выделенное и используемое пространство совпадают, потому что они относятся к атрибуту $IN- DEX_R00T, который является резидентным и должен занимать как можно меньше места. В байте 28 установлен флаг 0x01, из чего следует, что у этого узла имеются дочерние узлы (находящиеся в $INDEX_ALL0CATI0N).

Теперь снова рассмотрим атрибут $1N D ЕХ_А LLOCATIО N: icat -f ntfs ntfsl.dd 7774-160 | xxd

0000000: 494e 4458 2800 0900 4760 2103 0000 0000 INDXC...G'!

0000016: 0000 0000 0000 0000 2800 0000 f808 0000               (

0000032: e80f 0000 0000 0000 2100 0000 0600 0000                            !

[...]

Первые 24 байта принадлежат заголовку индексной записи, после которого начинается заголовок узла. Байты 24-27 показывают, что список индексных элементов начинается со смещением 40 (0x28). Не забывайте, что значение задается относительно начала заголовка узла, поэтому к нему необходимо прибавить 24; сумма равна 64. В данном случае список индексных элементов не следует непосредственно за заголовком списка, потому что между заголовком списка индексных элементов и самим списком находится массив заменителей. Вспомните, что байты 4-5 заголовка индексной записи показывают, что массив хранится со смещением 40 (0x28).

Байты 28-31 показывают, что смещение конца последнего элемента равно 2296 байтам (0x08f8), а байты 32-35 — что смещение конца выделенного буфера равно 4072 байтам (0x0fe8). Следовательно, буфер содержит 1776 байт неиспользуемого пространства, где могут храниться данные из файлов с именами, хранившимися в этих элементах. Согласно байтам 36-39, флаги равны 0, то есть узел не имеет дочерних узлов.

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

До настоящего момента мы рассматривали общие концепции индексов NTFS, но еще не уделили внимания индексным элементам. Структуры, о которых речь пойдет в дальнейшем, зависят от типа индекса, однако во всех индексных элементах присутствует общая структура данных, которая будет описана в этом разделе.

В табл. 13.15 перечислены стандартные поля индексных элементов.

Таблица 13.15. Структура данных обобщенного индексного элемента

Диапазон              Описание

0-7              Не определено

8-9              Длина элемента

10-11              Длина содержимого 15              Флаги (см. табл. 13.16)

16+              Содержимое (см. табл. 13.16)

Последние 8 байт элемента,              Номер VCN дочернего узла в $INDEX_ALLOCATION

начиная с 8-байтовой              границы              (поле существует только при установленном флаге)

Первые 8 байт используются для хранения данных, специфических для индексного элемента. Байты 8-9 определяют размер индексного элемента, а байты 11 — длину содержимого индексного элемента, которое начинается с байта 16. В содержимом могут храниться любые данные. Поле флагов содержит значения, перечисленные в табл. 13.16.

Таблица 13.16. Флаги, используемые в поле флагов индексных элементов
border="1" cellspacing="0" cellpadding="0">

Значение

Описание

0x001

Существует дочерний узел

0x002

Последний элемент в списке

Если у индексного узла имеется дочерний узел, флаг 0x01 устанавливается, а адрес VCN дочернего узла находится в последних 8 байтах индексного элемента. Вспомните, что каждая индексная запись обладает номером VCN. Флаг 0x02 устанавливается для последнего элемента в списке.

Структура данных индексного элемента каталога

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

Таблица 13.17. Структура данных индексного элемента каталога Диапазон              Описание              Необходимость

0-7 Базовый адрес MFT для имени файла Да
8-9 Длина элемента Да
10-11 Длина атрибута $FILE_NAME Нет
12-15 Флаги (см. табл. 13.16) Да
16+ Атрибут $FILE_NAME (если длина gt; 0) Да
Последние 8 байт элемента, Номер VCN дочернего узла в $INDEX_AL- Да
начиная с 8-байтовой LOCATION (поле существует только
границы при установленном флаге)

Базовый адрес ссылается на запись MFT, которой соответствует индексный элемент. В индексных элементах этого типа используются стандартные флаги: 0x01 — признак наличия дочерних узлов, и 0x02 — признак последней записи в списке.

Теперь рассмотрим остаток содержимого атрибутов $INDEX_R00T и $INDEX_AL- L0CATI0N, которые были частично проанализированы ранее. Начнем с атрибута $INDEX_R00T: icat -f ntfs ntfsl.dd 7774-144 | xxd

0000000: 3000 0000 0100 0000 0010 0000 0400 0000 0

0000016: 1000 0000 aOOO 0000 aOOO 0000 0100 0000

0000032: c51e 0000 0000 0500 7800 5a00 0100 0000                            x.Z

0000048: 5ele 0000 0000 0300 e03d ca37 5029 c401 x              = .7P)..

0000064: 004c c506 0202 c401 e09a 2a36 5029 c401 .L              *6P)..

0000080: d0e4 22b5 096a c401 0004 0000 0000 0000              .."..j

0000096: 7003 0000 0000 0000 2120 0000 0000 0000 p              !

0000112: 0c02 4d00 4100 5300 5400              4500              5200              7e00              ..M.A.S.T.E.R.-.

0000128: 3100 2e00 5400 5800 5400              0000              0000              0300              1...T.X.T

0000144: 0000 0000 0000 0000 0000              0000              0000              0000

0000160: 1800 0000 0300 0000 0400 0000 0000 0000

[...]

Первые 32 байта уже обработаны; начальные 16 байт образуют заголовок $IN- DEX_R00T, а следующие 16 байт — заголовок узла. Байты 32-37 показывают, что элемент относится к записи MFT 7877 (0х1ес5). Байты 40-45 показывают, что размер индексного элемента равен 120 байтам (0x78), поэтому в выходных данных он завершается в байте 152. Байты 26-27 показывают, что размер атрибута равен 90 байтам (0x5а). Флаг в байте 28 сообщает о наличии дочернего узла, адрес которого содержится в последних 8 байтах элемента, но мы уже об этом знаем благодаря флагу в заголовке узла.

Атрибут $FILE_NAME находится в байтах 48-137, а байты 144-151 завершают индексный элемент и содержат номер VCN дочернего узла (кластер 0). В качестве имени файла приводится строка «MASTER~1.TXT». Байты 152-175 содержат пустой индексный элемент, а флаг в байте 164 равен 3; он указывает на то, что элемент завершает список и имеет дочерний узел. Байты 168-175 содержат адрес дочернего узла (VCN 4). В нем находятся две индексные записи, которые мы видели в атрибуте $INDEX_ALLOCATION. Строение этого атрибута показано на рис. 13.7.

Процесс можно было бы повторить для каждой индексной записи в атрибуте $INDEX_ALLOCATION. Вместо этого мы рассмотрим кое-какие интересные данные, следующие за заголовком узла. Ранее было показано, что индексные элементы в индексной записи 0 заканчиваются на смещении 2296, но узлу выделены еще

1776 байт, в которых может содержаться информация об удаленных именах файлов. Попробуем просмотреть неиспользуемую область и найти в ней действительные индексные элементы. Содержимое атрибута со смещением 2400 выглядит так:

alt="" />

Индексный элемент относится к файлу в записи MFT 7870 (Oxlebe), а файл называется psapi.dll. Вследствие природы механизма пересортировки индексов мы не можем сказать, был ли файл удален или перемещен в другую позицию из-за добавления или удаления файла. На этот вопрос можно ответить только после анализа всех остальных индексных элементов. TSK отображает все элементы, а пользователь может самостоятельно разобраться, почему элемент был освобожден. Впрочем, программа Autopsy фильтрует вывод TSK и отображает только уникальные имена.

На рис. 13.8 показаны отношения между индексными элементами $INDEX_R00T и индексными записями $INDEX_ALLOCATION. Мы видим, что корневой узел индекса содержит два элемента. Любой файл с именем, меньшим MASTER—1.ТХТ, находится в индексной записи с номером VCN 0, а любой файл с большим именем — в индексной записи VCN 4. В конце индексной записи VCN 0 присутствует свободное пространство, в котором мы нашли данные файла psapi.dll. Обратите внимание на то, что это имя больше MASTER—1.ТХТ; вероятно, на момент его сохранения в этом узле корневой узел содержал другой элемент.

<< | >>
Источник: Кэрриэ Б.. Криминалистический анализ файловых систем. 2007

Еще по теме Атрибуты и структуры данных индексов:

  1. Атрибуты индексов NTFS
  2. Структуры данных
  3. Структуры данных
  4. Структуры данных журнала
  5. Структуры данных
  6. Структуры данных
  7. Структуры данных i386
  8. Структуры данных Sparc
  9. 6.8. ИНДЕКС ПОТРЕБИТЕЛЬСКИХ НАСТРОЕНИЙ. ИНДЕКС ПОТРЕБИТЕЛЬСКИХ ОЖИДАНИЙ НАСЕЛЕНИЯ
  10. 14.1. ЗАДАЧИ И СТРУКТУРА. ИСТОЧНИКИ ДАННЫХ
  11. Структуры данных FAT
  12. Структуры данных NTFS
  13. Структуры данных Ext2 и Ext3