Windows - статьи

       

Общие концепции NTFS


  • Метафайлы NTFS – служебные файлы, используемые NTFS для поддержания своей внутренней структуры.
  • Том (volume) NTFS – раздел, отформатированный под NTFS.
  • Главная загрузочная запись (Master Boot Record) – первый сектор жесткого диска, который содержит загрузочный код (bootstrap code) и таблицу разделов (partition table). Загрузочный код читает таблицу разделов, ищет активный (флаг 0x80) раздел и передает управление на его первый сектор (загрузочный сектор).
  • Загрузочный сектор (boot sector) – первый сектор тома, в котором хранятся параметры ФС. Также в загрузочный сектор входит код, который отвечает за чтение ntldr в память. Такой код несет смысл только если том является системным (т. е. только для диска C). В процессе монтирования тома, ntfs.sys проводит валидацию загрузочного сектора и признает его своим в случае совпадение необходимых параметров.
  • Системный том (system volume) – том, на котором располагается ntldr. Для NT системным томом может быть только первый том – С:. Загрузочный том (boot volume) – том, на котором располагается папка windows (winnt).

    Формат загрузочного сектора NTFS описывается следующей таблицей (как и все остальные описываемые структуры, наилучшим руководством по ним может служить книга Брайана Кэрриэ «Криминалистический анализ файловых систем»).

    Смещение

    Размер в байтах

    Описание



    0x0 3 Команда перехода на загрузочный код.
    0x3 8 Сигнатура ‘NTFS    ’.
    0xB 2 Количество байт на сектор
    0xD 1 Количество секторов в кластере.
    0xE 2 Должно равняться нулю.
    0x10 1 Должно равняться нулю.
    0x11 2 Должно равняться нулю.
    0x13 2 Должно равняться нулю.
    0x15 1 Тип носителя
    0x16 2 Должно равняться нулю.
    0x18 2 Должно равняться нулю.
    0x1A 2 Должно равняться нулю.
    0x1C 4 Не используется.
    0x20 4 Должно равняться нулю.
    0x24 4 Не используется.
    0x28 8 Число секторов в томе.
    0x30 8 Стартовый кластер MFT.
    0x38 8 Стартовый кластер копии MFT.
    0x40 1 Кластеров на запись MFT.
    0x41 3 Не используется.
    0x44 1 Кластеров на индексную запись.
    0x45 3 Не используется.
    0x48 8 Серийный номер тома. Уникален. Создается в процессе форматирования.
    0x50 4 Не используется.
    0x54 426 Загрузочный код.
    0x1FE 2 Маркер конца. Равен 0xAA55.
    <


    Соответствующие структуры имеют вид (определения взяты из исходников Linux- NTFS Project, там же можно найти очень много информации о структурах ntfs). Так же как и FAT, NTFS хранит часть информации в блоке, называемом BIOS Parameter Block, который входит в состав boot sector.

    typedef struct _BIOS_PARAMETER_BLOCK { /*0x0b*/USHORT bytes_per_sector; /* Размер сектора, в байтах */ /*0x0d*/UCHAR sectors_per_cluster; /* Секторов в кластере */ /*0x0e*/USHORT reserved_sectors; /* должен быть ноль */ /*0x10*/UCHAR fats; /* должен быть ноль */ /*0x11*/USHORT root_entries; /* должен быть ноль */ /*0x13*/USHORT sectors; /* должен быть ноль */ /*0x15*/UCHAR media_type; /* тип носителя, 0xf8 = hard disk */ /*0x16*/USHORT sectors_per_fat; /* должен быть ноль */ /*0x18*/USHORT sectors_per_track; /* не используется */ /*0x1a*/USHORT heads; /* не используется */ /*0x1c*/ULONG hidden_sectors; /* не используется */ /*0x20*/ULONG large_sectors; /* должен быть ноль */ /* sizeof() = 25 (0x19) bytes */ } BIOS_PARAMETER_BLOCK, *PBIOS_PARAMETER_BLOCK;

    typedef struct _NTFS_BOOT_SECTOR { /*0x00*/UCHAR jump[3]; /* переход на загрузочный код */ /*0x03*/ULARGE_INTEGER oem_id; /* сигнатура "NTFS ". */ /*0x0b*/BIOS_PARAMETER_BLOCK bpb; /*0x24*/UCHAR physical_drive; /* не используется */ /*0x25*/UCHAR current_head; /* не используется */ /*0x26*/UCHAR extended_boot_signature; /* не используется */ /*0x27*/UCHAR reserved2; /* не используется */ /*0x28*/ULARGE_INTEGER number_of_sectors; /* Количество секторов на томе. */ /*0x30*/ULARGE_INTEGER mft_lcn; /* Стартовый кластер MFT. */ /*0x38*/ULARGE_INTEGER mftmirr_lcn;/* Стартовый кластер копии MFT */ /*0x40*/CHAR clusters_per_mft_record; /* Размер MFT записи в кластерах. */ /*0x41*/UCHAR reserved0[3]; /* зарезервировано */ /*0x44*/CHAR clusters_per_index_record;/* Размер индексной записи в кластерах. */ /*0x45*/UCHAR reserved1[3]; /* зарезервировано */ /*0x48*/ULARGE_INTEGER volume_serial_number; /* уникальный серийный номер тома */ /*0x50*/ULONG checksum; /* не используется */ /*0x54*/UCHAR bootstrap[426]; /* загрузочный-код */ /*0x1fe*/USHORT end_of_sector_marker; /* конец загрузочного сектора, сигнатура 0xaa55 */ /* sizeof() = 512 (0x200) bytes */ } NTFS_BOOT_SECTOR, *PNTFS_BOOT_SECTOR;

    При проверке факта, что том является NTFS, необходимо прежде всего проверить сигнатуру «NTFS ».

    if( NtfsBootSector->oem_id.QuadPart != 0x202020205346544E ) return FALSE;

    Потом некоторые параметры бут сектора, как например кол-во байт в секторе и количество секторов в кластере на кратность двойки в степени.

    if( NtfsBootSector->bpb.bytes_per_sector < 0x100 NtfsBootSector->bpb.bytes_per_sector > 0x1000 ) return FALSE;

    //check sectors per cluster switch( NtfsBootSector->bpb.sectors_per_cluster ) { case 1: case 2: case 4: case 8: case 16: case 32: case 64: case 128: break; default: return FALSE; }

    Все проверки в функции ntfs_boot_sector_is_ntfs из Linux-NTFS Project.


    Содержание раздела