FAT32 – analiza systemu plików
Schemat budowy partycji typu FAT:
BootSector || FAT1 || FAT2 || Root directory || Data region
Najpierw znajdujemy początek partycji w MBR/LBA0, zakładając, że jest to partycja podstawowa szukamy jej początku w zależności od tego, którą z kolei jest nasza szukana partycja, jeżeli:
- pierwsza: to offset początkowy opisujący tę partycję zaczyna się w 0x1BE,
- druga: offset 0x1CE,
- trzecia: offset 0x1DE,
- czwarta: offset 0x1EE.
Następnie przesuwamy się jeszcze o 0x08 i pobieramy 4 bajty. One opisują położenie początku naszej szukanej partycji, bajty zapisane są od końca. Czyli załóżmy, że nasza szukana partycja to partycja numer 1, idziemy do offsetu 0x1BE + 0x08 = 0x1C6. W naszym przykładzie znajdujemy wpis:
3F 00 00 00 (4 bajty)
Przestawiamy wg LIFO i mamy:
00 00 00 3F
Teraz wg wzoru:
Przeliczamy z systemu heksadecymalnego na decymalny i otrzymujemy 63. To adres LBA pierwszego sektora naszej partycji. Bootsektora/bootrecord badanego systemu plików FAT. Idziemy do niego i analizujemy dalej. Tu można odczytać nazwę programu formatującego/tworzącego partycję, typ partycji.
Za bootsektorem znajduje się Fat Alloccation Table 1 (FAT1) i jego kopia FAT2, a następnie RootDirectory – który ma zapisane, gdzie znajdują się poszczególne pliki i katalogi.
Z bootsektora możemy wyciągnąć następujące informacje:
- Ile bajtów mieści jeden sektor, dowiadujemy się tego na offsecie 0x000B (2 bajty), w naszym przykładzie to 00 02, LIFO: 02 00, przeliczamy na system decymalny i wychodzi 512 bajtów na sektor.
- Ile sektorów mieści się w jednym klastrze, mówi o tym offset 0x000D (1 bajt), w tym przykładzie 04, z czego możemy wywnioskować: 4sek_in_clu * 512byt_in_sec = 2048B = 2kB. Czyli w jednym klastrze zapisane mogą być 2kB.
- Zarezerwowane sektory, offset 0x000E (1 bajt), w przykładzie odczytujemy 20, przeliczamy i otrzymujemy 32.
- Ilość kopii FAT, offset 0x0010 (1 bajt), w naszym przykładzie 02 czyli są dwie kopie FAT (główna = FAT1 i jedna dodatkowa FAT2).
- Ilość wpisów w Root Directory, offset 0x0011 (2 bajty), w naszym przykładzie 00 00. Nie używane w FAT32.
- Sektorów zarezerwowanych na FAT, offset 0x0016 (2 bajty), w naszym przykładzie 00 00. Nie używane w FAT32.
Aby obliczyć położenie FAT1 musimy skorzystać z tego wzoru:
Adres_FAT1 = Pierwszy_Sektor_Partycji + Zarezerwowane_Sektory. Pierwszy_Sektor_Partycji odczytaliśmy z MBR. A Zarezerwowane_sektory odczytujemy z Bootsektora z offsetu kolejno 0x000E. W naszym przykładzie wygląda to następująco:
63 + 32 = 95LBA.
Dalsza analiza wkrótce...
Autor: Marcin Banasik