Структуры данных
Структура данных 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 также помечены как нераспределенные.
Еще по теме Структуры данных:
- Структуры данных
- Структуры данных
- Структуры данных журнала
- Структуры данных
- Атрибуты и структуры данных индексов
- Структуры данных i386
- Структуры данных Sparc
- 14.1. ЗАДАЧИ И СТРУКТУРА. ИСТОЧНИКИ ДАННЫХ
- Структуры данных FAT
- Структуры данных NTFS
- Структуры данных Ext2 и Ext3
- Структуры данных UFS1 и UFS2
- Структура основных данных стартового маркетингового анализа