Общие концепции NTFS
Формат загрузочного сектора 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.