Структуры данных

  От рассмотрения системы разделов DOS мы переходим к подробному описанию структур, заложенных в основу этой системы. Если структуры данных вас не интересуют, описание можно пропустить, однако в нем встречается интересный пример использования расширенных разделов. Материал состоит из трех подразделов с описанием MBR, расширенных разделов и примером вывода данных для образа.
Структура данных MBR
Таблицы разделов DOS находятся в MBR и в первом секторе каждого расширенного раздела. Во всех случаях используется одна и та же 512-байтовая структура. Первые 446 байт зарезервированы для загрузочного кода. Код должен находиться в MBR, поскольку он используется при запуске компьютера, однако для расширенных разделов он не нужен, и на его месте могут храниться скрытые данные. Структура MBR в табличной форме показана в табл. 5.1.
Таблица 5-1- Структуры данных в таблице разделов DOS

Диапазон байтов

Описание

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

0-445

Загрузочный код

Нет

446-461

Запись таблицы разделов №1 (см. табл. 5.2)

Да

462—477

Запись таблицы разделов №2 (см. табл. 5.2)

Да

478—493

Запись таблицы разделов №3 (см. табл. 5.2)

Да

494-509

Запись таблицы разделов №4 (см. табл. 5.2)

Да

510-511

Сигнатура (0хАА55)

Нет


Таблица разделов содержит четыре 16-байтовых записи, структура которых представлена в табл. 5.2. Адреса CHS необходимы для старых систем, в которых они используются, но в новых системах они не нужны.
Таблица 5-2. Структура данных записи раздела DOS

Диапазон байтов

Описание

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

0-0

Флаг загрузочного раздела

Нет

1-3

Начальный адрес CHS

Да

4-4

Тип раздела (см. табл. 5.3)

Нет

5-7

Конечный адрес CHS

Да

8-11

Начальный адрес LBA

Да

12-15

Размер в секторах

Да


Флаг загрузочного раздела необходим не всегда. Стандартный загрузочный код компьютера с единственной ОС ищет запись, у которой этот флаг равен 0x80. Например, если на компьютере установлена Microsoft Windows, а диск разбит на

два раздела, то у раздела с операционной системой (например, C:\windows) будет установлен флаг загрузочного раздела. С другой стороны, если загрузочный код предлагает пользователю выбрать раздел для загрузки системы, флаг может оказаться лишним. Впрочем, некоторые загрузочные программы устанавливают его после того, как пользователь выберет соответствующий раздел для загрузки.
Начальный и конечный адреса CHS состоят из головки (8 бит), сектора (6 бит) и цилиндра (10 бит). Теоретически для каждого раздела должен быть задан только один из двух адресов (CHS или LBA). ОС и код загрузки системы должны определить, какие значения необходимо задать. Например, Windows 98 и ME используют адреса CHS для разделов, находящихся в первых 7,8 Гбайт диска, a Windows 2000 и последующие системы всегда игнорируют адреса CHS [Microsoft, 2003]. Некоторые программы создания разделов стараются задавать адреса обоих типов для обеспечения совместимости. Использование этих полей зависит от приложения.
Поле типа раздела идентифицирует тип файловой системы, которая должна находиться в разделе. Список наиболее распространенных типов приведен в табл. 5.3, а более подробную информацию можно найти в документе «Partition Types» [Brouwer, 2004].
Таблица 5.3. Некоторые типы разделов DOS

Тип

Описание

0x00

Пусто

0x01

FAT12, CHS

0x04

FAT16, 16-32 Мбайт, CHS

0x05

Расширенный раздел Microsoft, CHS

0x06

FAT 16, 32 Мбайт-2 Гбайт, CHS

0x07

NTFS

0x0b

FAT32, CHS

0x0с

FAT32, LBA

ОхОе

FAT 16, 32 Мбайт-2 Гбайт, LBA

0x0f

Расширенный раздел Microsoft, LBA

0x11

Скрытый раздел FAT12, CHS

0x14

Скрытый раздел FAT16, 16-32 Мбайт, CHS

0x16

Скрытый раздел FAT 16, 32 Мбайт-2 Гбайт, CHS

Oxlb

Скрытый раздел FAT32, CHS

Oxlc

Скрытый раздел FAT32, LBA

Oxle

Скрытый раздел FAT16, 32 Мбайт-2 Гбайт, LBA

0x42

Microsoft MBR, динамический диск

0x82

Solaris х86

0x82

Раздел подкачки Linux

0x84

Данные спящего режима

0x85

Расширенный раздел Linux

0x86

Набор томов NTFS

0x87

Набор томов NTFS

OxaO

Спящий режим

Oxal

Спящий режим

0xa5

FreeBSD

0xa6

OpenBSD

0xa8 Mac OSX
0xa9 NetBSD
Oxab Mac OSX
0xb7 BSDI
0xb8 Раздел подкачки BSDI
Oxee Диск EFI GPT
Oxef Системный раздел EFI
Oxfb Файловая система Vmware
Oxfc Раздел подкачки Vmware


Обратите внимание, сколько разных типов разделов существует для файловых систем Microsoft в диапазоне от 0x01 до OxOf. Это объясняется тем, что операционные системы Microsoft используют тип раздела для определения способа чтения и записи данных в раздел. Как говорилось в главе 2, Windows может использовать как традиционные, так и расширенные обработчики прерывания BIOS INT13h. Расширенные обработчики INT 13h необходимы для работы с дисками объемом более 8,1 Гбайт и применения адресации LBA (вместо CHS). Следовательно, типы FAT16 0x04 и ОхОЕ одинаковы, но во втором случае ОС будет использовать расширенные обработчики при работе с BIOS. Аналогично, типы 0x0В и ОхОС представляют обычную и расширенную версии FAT32, а типы 0x05 hOxOF— обычную и расширенную версии расширенных разделов [Microsoft, 2004b]. «Скрытые» версии этих типов разделов содержат 1 вместо 0 в верхнем полубайте, а для их создания применяются различные системные программы.
Чтобы продемонстрировать работу с MBR и таблицами разделов, мы извлечем информацию из реальной системы и разберем ее вручную. В качестве примера будем использовать компьютер с альтернативной загрузкой Windows и Linux, на жестком диске которого находятся восемь разделов файловых систем.
Первый пример взят из первого сектора диска. Данные выводятся утилитой xxd в Linux, но для получения информации также можно было воспользоваться шестнадцатеричным редактором для Windows или UNIX. В Linux командная строка выглядела так: dd if=disk3.dd bs=512 skiр=0 count=l | xxd
В левом столбце выводится десятичное смещение в байтах, средние восемь столбцов содержат данные в шестнадцатеричном формате, а последний столбец — те же данные в кодировке ASCII. Данные взяты из системы на базе IA32 с прямым порядком байтов, при котором младшие (менее значащие) байты располагаются по меньшим адресам, поэтому байты в средних столбцах переставляются. Содержимое MBR выглядит так: dd if=disk3.dd bs=512 skiр=0 count=l | xxd
0000000: eb48 9010 8ed0 bcOO Ь0Ь8 0000 8ed8 8ec0 .H
0048 6172              6420              4469              736b              0052              6561              6400              .Hard Disk.Read.
2045 7272              6f72              OObb              0100              b40e              cdlO              асЗс Error              lt;
0075 f4c3              0000              0000              0000              0000              0000              0000              .u 0000              0000              0000              0000              0000              0000              0001                           
0100 07fe 3f7f 3f00 0000 4160 lfOO 8000              .A'....
0180 83fe 3f8c 8060 lfOO cd2f 0300 0000

alt="" />


Начальный адрес в записи вторичной файловой системы задается по отношению к текущей таблице разделов — и это вполне логично, потому что вторичные расширенные разделы служат «обертками» для разделов файловых систем. С другой стороны, начальный адрес вторичного расширенного раздела задается относительно первичного расширенного раздела.
Разберем пример, показанный на рис. 5.6. Первичный расширенный раздел начинается с сектора 1000 и занимает 11 ООО секторов. Его таблица разделов содержит две записи. Первая запись описывает файловую систему FAT с начальным сектором 63, который в сумме с сектором текущей таблицы разделов дает 1063. Вторая запись предназначена для расширенного раздела и начинается с сектора 4 000. В сумме с начальным сектором первичного расширенного раздела (1000) это дает сектор 5000.
т“ у 1 "gt; ь h т“
FAT NTFS EXT3FS FAT

I I

I
о
о
о


Первичный расширенный раздел




Начало

Размер

Тип

1

63

3 937

FAT

2

4 000

2 500

Extend




Вторичный


FAT

расширенный



раздел






Начало

Размер

Тип

1

63

2 437

NTFS

2

6 500

2 500

Extend




Вторичный


NTFS

расширенный



раздел






Начало

Размер

Тип

1

63

2 437

EXT3FS

2

9 000

2 000

Extend

alt="" />
Вторичный
EXT3FS расширенный
раздел

FAT





Рис.
5.6. Диск с тремя вторичными расширенными разделами. Обратите внимание: начальный сектор вторичных расширенных разделов задается по отношению к началу первичного расширенного раздела в секторе 1000
Перейдем ко вторичному расширенному разделу (в секторе 5000). Первая запись таблицы разделов описывает файловую систему NTFS с начальным сектором 63, который в сумме с адресом текущей таблицы разделов дает сектор 5063. Вторая запись описывает расширенный раздел с начальным сектором 6500, который в сумме с сектором первичного расширенного раздела дает сектор 7500.

Давайте разберем еще один цикл, чтобы все окончательно прояснилось. Следующий расширенный раздел начинается с сектора 7500. Первая запись файловой системы EXT3FS начинается с сектора 63, который в сумме с 7500 дает 7563. Вторая запись описывает вторичный расширенный раздел, а ее начальное значение 9000 в сумме с 1000 дает сектор 10 000.
Вернемся к практическому примеру, в котором мы разбирали вручную таблицу разделов. Далее приводится содержимое первого сектора первичного расширенного раздела, находящегося в секторе 3 293 325: dd if=disk3.dd bs=512 skip=0 count=l | xxd
0000432: 0000              0000              0000              0000              0000              0000              0000              0001
0000448: Olcd              83fe              7fcb              3f00              0000              0082              3e00              0000                            ?              gt;...
0000464: 41cc              05fe              bfOb              3f82              3e00              40b0              OfOO              0000 A              ?.gt;.@
0000480: 0000              0000              0000              0000              0000              0000              0000              0000
0000496: 0000 0000 0000 0000 0000 0000 0000 55aa               U.
Четыре записи таблицы разделов выделены жирным шрифтом. Мы видим, что две последние записи не содержат данных. В табл. 5.5 представлена расшифровка первых двух записей таблицы разделов (нумерация разделов продолжает табл. 5.4):
Таблица 5.5. Содержимое первичной таблицы разделов в образе диска


Флаг

Тип

Начальный сектор

Размер

5

0x00

0x07

0x0000003f(63)

0x001f6041 (2 056 257)

6

0x00

0x05

0x003e823f (4 096 575)

0x000fb040 (1 028 160)


Запись 5 помечена типом файловой системы Linux (0x83); таким образом, раздел является вторичным разделом файловой системы, а его начальный сектор задается по отношению к началу текущего расширенного раздела (сектор 3 293 325):
3 293 325 + 63 - 3 293 388 Запись 6 помечена типом расширенного раздела DOS, а начальный сектор этого раздела задается по отношению к первичному расширенному разделу, который является текущим: 293 325 + 4 096 575 = 7 389 900 Структура диска в том виде, в котором она нам известна, показана на рис. 5.7. Прежде чем продолжить, обратите внимание на размеры двух разделов. В MBR первичный расширенный раздел имеет размер 76 999 545 секторов. В этой таблице размер следующего вторичного расширенного раздела составляет всего 1 028 160 секторов. Вспомните, что размер первичного расширенного раздела складывается из размеров всех вторичных файловых систем и вторичных расширенных разделов, тогда как размер вторичного расширенного раздела складывается из размера следующего вторичного раздела файловой системы и размера области, необходимой для хранения таблицы разделов.
Пример можно продолжить и проанализировать следующий вторичный расширенный раздел, находящийся в секторе 7 389 900. Его содержимое представлено в табл. 5.6.


Рис. 5.7. Структура диска после обработки второй таблицы разделов (без соблюдения масштаба)
Таблица 5.6. Содержимое первой вторичной расширенной таблицы разделов в образе диска


Флаг

Тип

Начальный сектор

Размер

7

0x00

0x82

0x0000003f(63)

0x000fb001 (1 028 097)

8

0x00

0x05

0x004e327f (5 124 735)

0x000fb040 (1 028 160)


Запись 7 описывает раздел подкачки Linux; это вторичная файловая система, а начальный адрес сектора задается по отношению к текущему расширенному разделу, то есть сектору 7 389 900: 389 900 + 63 = 7 389 963 Запись 8 описывает расширенный раздел файловой системы DOS, поэтому его адрес начального сектора задается по отношению к первичному расширенному разделу, то есть сектору 3 293 325: 293 325 + 5 124 735 - 8 418 060 Структура диска с информацией из этой таблицы разделов показана на рис. 5.8. Полное содержимое таблицы разделов будет приведено далее, при рассмотрении программ вывода содержимого таблицы разделов.
Вывод информации о разделах
Познакомившись с внутренней структурой таблицы разделов, давайте посмотрим, как она обрабатывается некоторыми аналитическими программами. Те, кто предпочитает обрабатывать структуры данных вручную и не пользуется вспомогательными программами, могут пропустить этот материал. Мы рассмотрим две программы для Linux, но эта функция также выполняется многими Windows-ripo- граммами (в том числе системами экспертного анализа и шестнадцатеричными редакторами).
Команда fdisk входит в поставку Linux и отличается от одноименной программы, поставляемой с системой Windows. Fdisk может работать с устройством Linux или файлом образа, сгенерированным программой dd. При запуске с флагом -L
программа выводит список разделов вместо перехода в интерактивный режим с возможностью редактирования разделов. Флаг - и означает, что информация должна выводиться в секторах (вместо цилиндров). Для диска с разделами DOS, который мы обрабатывали вручную, программа выдала следующий результат: fdisk -lu disk3.dd
Disk disk3.dd: 255 heads. 63 sectors, 0 cylinders Units = sectors of 1 * 512 bytes
Device Boot Start End Blocks Id System
di sk3.ddl 63 2056319 1028128+ 7 HPFS/NTFS
disk3.dd2 * 2056320 2265164 104422+ 83 Linux
disk3.dd3 2265165 3293324 514080 83 Linux
disk3.dd4 3293325 80292869 38499772+ 5 Extended
disk3.dd5 3293388 7389899 2048256 83 Linux
di sk3.dd6 7389963 8418059 514048+ 82 Linux swap
di sk3.dd7 8418123 9446219 514048+ 83 Linux
di sk3.dd8 9446283 17639369 4096543+ 7 HPFS/NTFS
disk3.dd9 17639433 48371714 15366141 83 Linux



Обратите внимание на некоторые обстоятельства. В выходных данных указан только первичный расширенный раздел (disk3.dd4). Вторичный расширенный раздел, в котором находится раздел подкачки Linux, обнаружен, но информация о нем не выводится. Такой подход приемлем в большинстве случаев, потому что для анализа абсолютно необходимы только первичный и вторичный разделы файловых систем, но все же следует помнить, что в результатах отображаются не все записи таблицы разделов.

Выходные данные программы mmls из пакета The Sleuth Kit выглядят несколько иначе. В них помечаются секторы, не используемые разделами, указывается местонахождение таблиц разделов и расширенных разделов. Для диска, использованного в первом примере с fdisk, выходные данные mmls выглядят так: mmls -t dos disk3.dd
Units are in 512-byte sectors




Start
0000000000
0000000001
0000000063
0002056320
0002265165
0003293325
0003293325 0003293388 0007389900
0007389900 0007389963 0008418060
0008418060 0008418123 0009446220
0009446220 0009446283 0017639370
0017639370 0017639433
End
0000000000
0000000062
0002056319
0002265164 0080292869 0003293387 0008418059 0007389962 0009446219 0008418122 0017639369 0009446282 0048371714 0017639432 0048271714
Length
0000000001
0000000062
0002056257
0000208845
0001028160
0076999545
0000000001
0000000062
0004096512
0001028160
0000000001
0000000062
0001028097
0001028160
0000000001
0000000062
0001028097
0008193150
0000000001
0000000062
0008193087
0030732345
0000000001
0000000062
0030732282
Description Table #0 Unallocated NTFS (0x07)
Linux (0x83)
Linux (0x83)
DOS Extended (0x05) Table #1 Unallocated Linux (0x83)
DOS Extended (0x05) Table #2 Unallocated Linux swap (0x82) DOS Extended (0x05) Table #3 Unallocated Linux (0x83)
DOS Extended (0x05) Table #4 Unallocated NTFS (0x07)
DOS Extended (0x05) Table #5 Unallocated Linux (0x83)



Строки с пометкой Unallocated обозначают пространство между разделами, а также между концом таблицы разделов и началом первого раздела. В выходных данных mmls указан как конечный адрес, так и результат, что упрощает их использование для извлечения содержимого разделов программой dd.
Результаты mmls сортируются по начальному сектору раздела, поэтому первый столбец содержит только порядковый номер строки и не имеет отношения к положению записи в таблице разделов. Во втором столбце выводится таблица разделов и положение записи в ней. Первое число определяет таблицу (0 — первичная таблица, 1 — первичная расширенная таблица), а второе определяет запись в таблицу. Сортировка упрощает идентификацию секторов, не принадлежащих разделам. Для примера возьмем следующий образ: mmls -t dos diskl.dd

Units are in

512-byte sectors



Slot

Start

End

Length

Description

00:

0000000000

0000000000

0000000001

Table #0

01:

0000000001

0000000062

0000000062

Unallocated

02: 00:00

0000000063
/>0001028159
0001028097

Win95 FAT32 (OxOB)

03:

0001028160

0002570399

0001542240

Unallocated

04: 00:03

0002570400

0004209029

0001638630

OpenBSD (0xA6)

05: 00:01

0004209030

0006265349

0002056320

NTFS (0x07)


Из листинга видно, что раздел NTFS находится в позиции перед разделом OpenBSD, но раздел NTFS начинается после раздела OpenBSD. Также можно заметить, что запись с пометкой 00:02 отсутствует, а 1 542 240 секторов между FAT и OpenBSD также помечены как нераспределенные.
<< | >>
Источник: Кэрриэ Б.. Криминалистический анализ файловых систем. 2007

Еще по теме Структуры данных:

  1. Структуры данных
  2. Структуры данных
  3. Структуры данных журнала
  4. Структуры данных
  5. Атрибуты и структуры данных индексов
  6. Структуры данных i386
  7. Структуры данных Sparc
  8. 14.1. ЗАДАЧИ И СТРУКТУРА. ИСТОЧНИКИ ДАННЫХ
  9. Структуры данных FAT
  10. Структуры данных NTFS
  11. Структуры данных Ext2 и Ext3
  12. Структуры данных UFS1 и UFS2
  13. Структура основных данных стартового маркетингового анализа