Аналіз файлових систем (Win) NTFS�Цифрова криміналістика
The project has been funded by the European Commission. The Education, Audiovisual and Culture Executive program (EACEA), TEMPUS IV. The content of this presentation reflects the opinion of the author.
00.00.2010
2
Fußzeile - Titelthema
Концепція NTFS
00.00.2010
3
Fußzeile - Titelthema
Konzept hinter NTFS
00.00.2010
4
Fußzeile - Titelthema
Konzept hinter NTFS
FAT-Система
NTFS-Система
Фізичне розташування системних файлів
Завантажувальна область
1 сектор (FAT12/16)
32++ для FAT 32
FAT 1 та 2
Кореневий каталог
Область даних
Завантажувальна область 1 сектор
MFT
Область даних
Область даних
Номер сектора завантажувального блоку зберігається в таблиці розділів MBR
Завантажувальний блок містить вказівник у BPB (блок параметрів Bios) зі зміщенням 0x30 на�
Master File Table ($MFT)
І ще один покажчик (зі зсувом 0x38) на
Master File Table 2 ($MFTMIRR)
Завантажувальний блок
Завантажувальний блок
Копія завантажувальних блоків зберігається в останньому секторі розділу, який описано в MBR.
Цей сектор не є частиною тому і не може бути видалений або перезаписаний файловою системою.
Структура завантажувального блоку
Зміщення | Довжина | Зміст |
0 | 3 | Перехід до завантажувального коду |
3 | 8 | Системний ID: "NTFS " |
B | 2 | Кількість байтів у секторі |
D | 1 | Кількість секторів у кластері |
E | 7 | не використовується |
15 | 1 | Медіа-дескриптор |
16 | 2 | не використовується |
18 | 2 | Кількість секторів в дорожці |
1A | 2 | heads |
1C | 4 | Приховані сектори |
20 | 4 | не використовується |
24 | 4 | завжди 80 00 80 00? |
28 | 8 | Кількість секторів в томі |
30 | 8 | Стартовий кластер Master File Table ($MFT) |
38 | 8 | Стартовий кластер копії Master File Table ($MFTMirr) |
40 | 4 | Cluster per FILE record |
44 | 4 | Cluster per Index buffer |
48 | 8 | Серійний номер |
50 | 4 | чексума |
54 | | Завантажувальний код |
1FE | 2 | Magic boot sector ID: AA 55 |
Bios parameter block Extended Bios parameter block
Номер кластеру MFT
Кластер/запис
BIOS-сігнатура
Зміщення | Довжина | Опис |
40 dec | 8 | кількість секторів в томі |
48 dec | 8 | Стартовий кластер Master File Table ($MFT) |
56 dec | 8 | Стартовий кластер копії Master File Table ($MFTMirr) |
64 dec | 1 | кількість кластерів на запис FILE (якщо значення >0, це означає кількість кластерів для цієї структури; якщо значення <0, це байтове значення, яке має бути обчислене за спеціальною формулою; 2^(-1*кластер /MFT- або Indexrecord)) |
65 dec | 3 | Не використовується |
68 dec | 4 | кількість кластерів на запис індексу |
Номер кластеру MFTMirr
Кількість секторів
Кластер/INDX-запис
$MFT – Master File Table
$MFT
10
Master File Table
11
Master File Table
Заголовок
Стандартна інформація
Ім’я
записи
Атрибути
дата
NTFS-Система
Завант.область
NT-завантажувач
MFT
Область даних
Область даних
MFT
MFT-запис 0
MFT-запис 1
тощо
Файли метаданих
Номер запису | Ім’я файлу | Опис |
0 | $MFT | Індекс кожного файлу в томі |
1 | $ MFTMirr | Копія перших 4 MFT записів |
2 | $LogFile | Файл реєстрації транзакцій |
3 | $Volume | Назва, версія та стан тому |
4 | $AttrDef | Визначення атрибутів |
5 | . (dot) | Кореневий каталог тому |
6 | $Bitmap | Бітова карта кластерів |
7 | $Boot | Завантажувальний запис |
8 | $BadClus | Погані кластери в томі |
9/Any | $Quota | Інформація про квоту |
9 | $Secure | Дескриптори безпеки тому |
10 | $UpCase | Таблиця символів верхнього регістру |
11 | $Extend | Каталог із додатковими файлами метаданих |
12-15 | | Позначений у використанні, але порожній |
16-23 | | Позначений у використанні, але порожній |
Any | $ObjId | Унікальні ідентифікатори файлів/каталогів |
Any | $Reparse | Повторний аналіз інформації про точку |
Any | $UsnJrnl | Ведення змін в журналі |
>24 | | Файли та каталоги |
14
15
$BitMap — це спеціальний файл у файловій системі NTFS. У цьому файлі зберігаються всі використані та невикористані кластери на томі NTFS. Коли файл займає місце на томі NTFS, його розташування позначається в $BitMap.Спосіб відстеження розподілу кластерів відносно простий. Кожен біт у Bitmap представляє 1 кластер, якщо цей біт дорівнює «1», тоді кластер використовується. Наприклад, якщо байт у BitMap дорівнює «F», це означає, що 4 кластери використовуються як F (hex) = 1111 у двійковому форматі.Отже, якщо два байти $BitMap мають значення «FF», це означає, що використовуються 8 кластерів, оскільки FF = 11111111.
Коли файл видаляється, кластер стає нерозподіленим або невикористовуваним (що дозволяє новим даним перезаписати його), а біти повертаються до нуля. Якщо 8 послідовних кластерів використовувалися файлами FF, а потім було видалено один файл, який зайняв лише 1 кластер із цих 8, запис $BitMap зміниться з FF на 7F, оскільки 7F = 1111111. На знімку екрана нижче показано $BitMap (через EnCase) після того, як диск було щойно відформатовано. Хоча файлів, створених користувачем, немає, $BitMap усе ще має кластери, виділені через системні файли NTFS у розділі. Показані шістнадцяткові значення: FF FF FF FF FF FF FF FF FF 07 00 00 00 00 00, це означає, що використовується 67 кластерів.
16
$Bitmap
17
$BadClus є одним із 16 ключових файлів метаданих NTFS. Його роль полягає у відстеженні секторів, які пошкоджені/неможливі для використання на диску.
Bad Clus має номер запису MFT 8, а в MFT він знаходиться трохи нижче $BitMap і $Boot.
Файл $BadClus, як випливає з назви, призначений для зберігання посилання на погані кластери на жорсткому диску. Це та сама концепція, що і $BitMap, яка зберігає список доступних і недоступних секторів у всьому розділі.
Однак $BadClus відстежує сектори, які вважаються поганими/несправними та не повинні записуватися в них. Якщо в секторі є дані, вони залишаться там, навіть якщо $BadClus позначає сектор як поганий.
Це не означає, що сектор поганий, лише те, що файлова система NTFS так вважає.
Якщо диск відформатовано «Швидко», $BadClus буде порожнім, оскільки він не знає, що є та не є поганим кластером. Якщо диск відформатовано за допомогою довшого методу, буде перевірено кожен кластер і $BadClus буде повністю оновлено.
Master File Table
18
$MFT Заголовок | Атрибут стандартної інформації 10 00 00 00 | Атрибут імені файлу 30 00 00 00 | Атрибут Object_ID 40 00 00 00 | ~ | Атрибут даних 80 00 00 00 |
MFT заголовок запису
19
Master File Table
20
Attribute Name | Identifier | | Attribute Name | Identifier |
$STANDARD_INFORMATION | 10 00 00 00 | $INDEX_ROOT | 90 00 00 00 | |
$ATTRIBUTE_LIST | 20 00 00 00 | $INDEX_ALLOCATION | A0 00 00 00 | |
$FILE_NAME | 30 00 00 00 | $BITMAP | B0 00 00 00 | |
$OBJECT_ID | 40 00 00 00 | $REPARSE_POINT | C0 00 00 00 | |
$SECURITY_DESCRIPTOR | 50 00 00 00 | $EA_INFORMATION | D0 00 00 00 | |
$VOLUME_NAME | 60 00 00 00 | $EA | E0 00 00 00 | |
$VOLUME_INFORMATION | 70 00 00 00 | $LOGGED_UTILITY_STREAM | 00 01 00 00 | |
$DATA | 80 00 00 00 | | |
Не всі атрибути потрібні в кожному файлі. Які атрибути будуть потрібні, залежить від того, описує запис файл чи каталог. Атрибути з ID 0x10 00 00 00 і 0x 30 00 00 00 присутні завжди.
Заголовок MFT-запису
Атрибут: стандартна інформація
Атрибут: Ім’я файлу
Атрибут: Дані
Атрибут: бітова карта
Атрибути
Маркер кінця запису
MFT Заголовок запису
22
Зміщення | Розмір (байт) | Призначення | | Зміщення | Розмір (байт) | Призначення |
00 | 4 | Ідентифікатор файлу | 24 | 4 | Логічний розмір запису MFT | |
04 | 2 | Зсув до послідовності оновлення (виправлення) | 28 | 4 | Фізичний розмір запису MFT | |
06 | 2 | Розмір послідовності оновлення та масиву | 32 | 8 | Посилання на базовий файл | |
08 | 8 | Порядковий номер файлу журналу (LSN) | 40 | 2 | ID наступного атрибута | |
16 | 2 | Порядковий номер | 42 | 2 | «00 00» Доповнення | |
18 | 2 | Кількість жорстких посилань | 44 | 4 | Номер запису $MFT | |
20 | 2 | Зсув до початку атрибутів | 48 | 2 | Оновлений порядковий номер виправлення | |
22 | 2 | Мітки: 00 00 – Видалений файл 01 00 – Існуючий файл 02 00 – Видалений каталог 03 00 – Існуючий каталог | | 50 | 4 | Оновлений масив послідовності |
MFT Заголовок запису
23
Заголовки атрибутів
24
Заголовок резидентного атрибута
25
Зміщення | Розмір | Призначення |
0 | 4 | Тип атрибута (наприклад 10 00 00 00) |
4 | 4 | Довжина атрибута (включаючи цей заголовок) |
8 | 1 | 00 – резидентний 01 – не резидентний |
9 | 1 | Довжина імені в Unicode |
10 | 2 | Зміщення до назви |
12 | 2 | Мітки: 01 00 Стиснений 00 40 Зашифрований 00 80 Розріджений |
14 | 2 | ID атрибута |
16 | 4 | Довжина атрибута від кінця заголовка |
20 | 2 | Зсув до початку потоку атрибуту |
22 | 1 | Мітка Індексації (00 Ні 01 Так) |
23 | 1 | Padding |
24 | L | Потік атрибуту |
Заголовок нерезидентного атрибуту
26
Зміщення | Розмір | Призначення |
0 | 4 | Тип атрибута (наприклад 10 00 00 00) |
4 | 4 | Довжина атрибута (включаючи цей заголовок) |
8 | 1 | 00 – резидентний 01 – не резидентний |
9 | 1 | Довжина імені в Unicode |
10 | 2 | Зміщення до назви |
12 | 2 | Мітки: 01 00 Стиснений 00 40 Зашифрований 00 80 Розріджений |
14 | 2 | ID атрибута |
16 | 8 | Стартовий VCN |
24 | 8 | Останній VCN |
32 | 2 | Зсув до потоку даних |
34 | 2 | Розмір блоку стиснення |
36 | 4 | Padding |
40 | 8 | Виділений розмір атрибута |
48 | 8 | Логічний розмір атрибута |
56 | 8 | Ініціалізований розмір даних потоку |
64 | | Потік даних |
Заголовок MFT-запису
Атрибут: стандартна інформація
Завжди резидентний
Атрибут: ім’я файлу
Завжди резидентний
Атрибут: Дані
Тут нерезидентний
Атрибут: бітова карта
Тут нерезидентний
Маркер кінця
Атрибут резидентний
Identificator
2
E
Flags 0x0001 compressed, 0x4000 encrypted, 0x8000 sparse
2
C
Offset to name(if no name; offset to datapart)
2
A
Length of the name (0x00 if no name)
1
9
non-resident Flag (0x00 resident; 0x01 non-resident)
1
8
Length of the attribute
4
4
Type (0x10, 0x30..)
4
0
призначення
розмір
зміщення
Index Flag and padding
2
16
Offset to datapart
2
14
Length of datapart
4
10
Атрибут нерезидентний
Identificator
2
E
Compress Flag
2
C
Offset to name(if no name; offset to datapart)
2
A
Length of the name (0x00 if no name-normal case)
1
9
non-resident Flag (0x00 resident; 0x01 non-resident)
1
8
Length of the attribute
4
4
Typ (0x10, 0x30..)
4
0
призначення
довжина
зміщення
Actual size
8
30
Actual size, or initialised size
8
38
Physical size = multiple of clustersize
8
28
2 byte compression and 4 byte padding
6
22
Offset to Datarun
2
20
Least VCN
8
18
Start VCN
8
10
призначення
довжина
зміщення
Атрибут стандартної інформації
30
Атрибут стандартної інформації
31
Зміщення | Розмір (байт) | Призначення |
00 | 8 | Дата/час створення файлу |
08 | 8 | Дата/час зміни файлу (останній запис). |
16 | 8 | Дата/час зміни запису |
24 | 8 | Дата/час останнього доступу |
32 | 4 | Атрибути файлів DOS |
36 | 4 | Максимальна кількість версій - вимкнено 00 00 00 00 |
40 | 4 | Номер версії |
44 | 4 | ID Класу |
48 | 4 | ID власника |
52 | 4 | ID безпеки |
56 | 8 | Розмір даних квоти |
64 | 8 | Оновлений порядковий номер |
Атрибут стандартної інформації
32
Мітка | Призначення | | Мітка | Призначення |
01 00 00 00 | Тільки для читання | 00 01 00 00 | Тимчасовий | |
02 00 00 00 | прихований | 00 02 00 00 | Розріджений файл | |
04 00 00 00 | системний | 00 04 00 00 | Точка повторного аналізу | |
10 00 00 00 | каталог | 00 08 00 00 | Стиснений | |
20 00 00 00 | архів | 00 10 00 00 | Офлайн | |
40 00 00 00 | пристрій | 00 20 00 00 | Вміст не проіндексовано | |
80 00 00 00 | нормальний | 00 40 00 00 | Зашифровано |
DOS атрибут
Атрибут стандартної інформації
Завжди резидентний
Attribut-Type (Std.)
length of Attr.
non-resident Flag
Offset to the data portion
Атрибут стандартної інформації
Завжди резидентний
Times UTC
Flags
Атрибут імені файлу
35
Атрибут імені файлу
36
Зміщення | Розмір (байт) | Призначення |
00 | 6 | Довідник батьківського каталогу (посилальний номер файлу батьківського каталогу) |
06 | 2 | Порядковий номер (із батьківського заголовка запису MFT) |
08 | 8 | Дата/час створення файлу |
16 | 8 | Дата/час зміни файлу (останній запис). |
24 | 8 | Дата/час зміни запису |
32 | 8 | Дата/час останнього доступу |
40 | 8 | Фізичний розмір файлу |
48 | 8 | Логічний розмір файлу |
56 | 4 | Атрибути файлів DOS |
60 | 4 | Розширені атрибути/Повторний аналіз |
64 | 1 | Кількість символів у назві файлу |
65 | 1 | Тип простору імен (00-Posix 01-Win32 02-DOS Коротке ім’я файлу 03-Win32/Dos є однаковим і потрібен лише один атрибут імені файлу) |
66 | L | Ім'я файлу (Юнікод) |
Атрибут імені файлу
завжди резидент
Attribut-Typ (Name)
Length of Attr.
non-resident Flag
Offset to the data portion
Атрибут імені файлу
завжди резидент
Times are UTC
Physical size
Actual size
Record number of the father directory
Атрибут імені файлу
завжди резидент
Times are UTC
Flags
Number of characters for the name
Record number of the father directory
Атрибут імені файлу
завжди резидент
Times are UTC
Type the name �0x00 Posix�0x01 WIN32�0x02 DOS8.3 Name�0x03 WIN 32+8.3 Name
File name in Unicode
File Name attribute always resident
Покажчик на початковий каталог, тобто каталог, де зберігається файл, що відповідає номеру в MFT.�
Приклад: каталог "DIR1" знаходиться в корені (файл № 5) і має в MFT номер 500, тобто це 500-й запис. Покажчик на батьківський каталог "Dir1" містить номер 5 (корінь), а всі файли, які містяться в каталозі "DIR1", мають номер 500 як посилання на базовий каталог.
MFT
Dir1, Покажчик на батьківський каталог = 5
тощо
499
498
…
500
Файл 1, покажчик на батьківський каталог = 500
Файл 2, Покажчик на батьківський каталог = 500
501
502
…
Логіка нумерації розміщення файлів та каталогів
Атрибут дата (резидентний)
Вміст файлу як самі дані розглядатиметься в NTFS як атрибут.
Якщо тип даних атрибута настільки малий, що він поміщається в записі MFT (як у стандарті та атрибуті імені файлу), це частина головної таблиці файлів.
Header
Standard Info�03.06.2004, 19.38
Name: �MFT.txt
Data: In the Masterfile
end identifier FF FF FF FF
Запис MFT із частиною резидентних даних
Attribut-Type (Data)
length of Attr.
resident Flag
Offset to the data portion
Contents of Boot.ini
Attribut-Type (Std.)
Attribut-Type (Name)
length of Attr.
length of Attr.
Атрибут дата (нерезидентний)
Атрибути, які не є резидентними, тобто частина даних яких не вміщується в запис MFT, повинні зберігатися поза MFT.
Зберігання здійснюється в суміжних, тобто послідовних кластерах.
Кожен запуск визначається початковим кластером і його довжиною
Початковий кластер циклу зберігається як зсув до початкового кластера попередніх циклів. Зсув 1 Проходить 0.
Довжина циклів даних залежить від доступних суміжних кластерів і тому є змінною.
Data Runs
Атрибут дата (нерезидентний)
Якщо тип даних атрибута занадто великий, щоб поміститися в запис MFT, дані повинні десь зберігатися в нерозподілених кластерах на диску.
У MFT має бути посилання на один або більше суміжних діапазонів кластерів.
Header
Standard Info�03.06.2004, 19.38
Name: �BIG.txt
Date:�31 02 00 4F 3C 00..
End-ID
FF FF FF FF
Такий безперервний ланцюжок кластерів називається Run
У файловій системі FAT для кожного з виділених файлів кластерів потрібен табличний простір у FAT.
Приклад:
Файл, потрібний для кластерів від 2 до 1002, має, відповідно, 1000 записів у FAT.
Початковий кластер — це запис каталогу (тут Кластер 2) у FAT
Тим часом потік у NTFS визначається його початковим кластером і його довжиною.
У наведеному вище прикладі NTFS збереже лише початковий кластер і необхідну кількість кластерів. -> 1000 кластерів з кластера 2
3
4
5
6
..
10
..
..
7
11
..
..
..
8
9
12
1000
1001
EOF
Різниця між адресацією в FAT та NTFS
Запис MFT із не резидентними даними
Attrib.-Type (Data)
Lange of Attr.
non-resident Flag
Attrib.-Type (Std.)
Attrib.-Type (Name)
Lange of Attr.
Lange of Attr.
Зміщення | Довжина | Опис |
10 | 8 | стартовий VCN |
18 | 8 | останній VCN |
20 | 2 | Зміщення до потоку даних |
22 | 6 | Стиснення та 4 байти доповнення |
28 | 8 | Фізичний розмір = кратний розміру кластера |
30 | 8 | Реальний розмір |
38 | 8 | Фактичний або ініціалізований розмір |
Запис MFT із не резидентними даними
Offset to the data portion
Attrib.-Type (Std.)
Attrib.-Type (Name)
Lange of Attr.
Lange of Attr.
Зміщення | Довжина | Опис |
10 | 8 | стартовий VCN |
18 | 8 | останній VCN |
20 | 2 | Зміщення до потоку даних |
22 | 6 | Стиснення та 4 байти доповнення |
28 | 8 | Фізичний розмір = кратний розміру кластера |
30 | 8 | Реальний розмір |
38 | 8 | Фактичний або ініціалізований розмір |
Header of the attribute $ Data
Заголовок артибута $Data
Runlist
Запис MFT із не резидентними даними
Кількість байт для довжини потоку (2)
Приклад потоку (Run)
Кількість кластерів в потоці (0x1370)
Кількість байтів для зміщення (3)
Номер кластера відносно попереднього потоку (0x053ABA)
Початок наступного потоку
0x00-> якщо немає наступних потоків
Декодування одиночного потоку даних
Потік даних 31 03 58 BC 37
51
Другий Ніббл
Кількість байтів, що використовуються для позначення кількості безперервних кластерів у потоці
Перший Ніббл
Кількість байтів, що використовуються для позначення початкового кластера
Кількість суміжних кластерів у потоці (3)
Зміщення – коли є лише один потік даних, це значення є початковим номером логічного кластера (3652696)
3 | 1 | | 03 | | 58 BC 37 |
Attrib.-Type (Data)
Lange of Attr.
Offset to the data portion
non-resident Flag
Side portion of the attributes (Runlist)
Приклад двох потоків
Кількість байтів для довжини потоку (1)
Кількість кластерів в потоці (0x04)
Кількість байтів для зміщення (3)
Номер кластера відносно попереднього циклу (0x021A1F)
Приклад двох потоків
Runlist
31 04 1F 1A 02 21 02 2C 37 00...............................
Зміщення
Довжина
04h Cluster from Offset 0x21A1F (137759 dec) 1. Run
02h Cluster from Offset 0x21A1F+0x372C=0x2514B (151883 dec) 2. Run
00 End
Runlist
Run 1:
Header = 0x21 - 1 Byte Lange, 2 Byte Offset
Lange = 0x18 (1 Byte)
Offset = 0x5634 (2 Bytes)
Run 2:
Header = 0x00 – End�
Summary: �0x18 Cluster @ LCN (logical cluster number) 0x5634
Example 1 is a fragmented file, which is 0x18 cluster from LCN 0x5634
Example 1 - Normal file
Data Runs:
21 18 34 56 00
21 18 34 56 - 00 (grouped)
Example 2 - Normal file Fragmented
Data Runs:
31 38 73 25 34 32 14 01 E5 11 02 31 42 AA 00 03 00
31 38 73 25 34 - 32 14 01 E5 11 02 - 31 42 AA 00 03 - 00 (grouped)
Run 1:
Header = 0x31 - 1 Byte Lange, 3 Byte Offset
Lange = 0x38
Offset = 0x342573
Run 2:
Header = 0x32 - 2 Byte Lange, 3 Byte Offset
Lange = 0x114
Offset = 0x363758 (0x211E5 plus 0x342573)
Run 4:
Header = 0x00 - End
Summary :
0x38 Clusters @ LCN 0x342573
0x114 Clusters @ LCN 0x363758
0x42 Clusters @ LCN 0x393802
Example 2 is a fragmented file with a size of 0x18E cluster, with fragments at the LCN 0x342573, 0x363758 and 0x393802.
Run 3:
Header = 0x31 - 1 Byte Lange, 3 Byte Offset
Lange = 0x42
Offset = 0x393802 (0x300AA plus 0x363758)