Anàlisi de FAT en Linux

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

El sistema d'arxius FAT és un sistema simple de fitxers dissenyat originalment per a discs menuts i estructures de carpetes senzilles. El sistema d'arxius FAT es diu així per la seva forma d'organització, la taula d'assignació d'arxius, que es troba al principi del volum. Per protegir el volum, es mantenen dues còpies de la taula. En cas que un es fa malbé. A més, les taules d'assignació d'arxius i la carpeta arrel s'han d'emmagatzemar en un lloc fix perquè els arxius necessaris per iniciar el sistema es poden localitzar correctament.

Les principals versions del format FAT són el nom del nombre de bits de la taula d'elements: 12 (FAT12), 16 (FAT16), i 32 (FAT32), cadascuna d'aquestes variants es troba encara en ús. L'estàndard FAT també s'ha ampliat en altres aspectes, mentre que en general la preservació de la compatibilitat amb el programari existent.

Fat1.png

Estructura global del sistema d'arxius FAT.

La FAT s'organitza en forma de llista enllaçada. Cada element apunta al següent fins que s'arriba a un FFFF.

Fat2.png


Exercici amb FAT16

Hi ha grans diferències entre FAT12, 16 i 32. La primera utilitza 12 bits per a cada cluster en la FAT i la manera de codificar-los és complicada. FAT16 utlitza 4 bytes per a cada cluster i és prou fàcil d'entendre. En aquest exercici utlitzem una imatge de disc de 10 meges per a que Linux la puga formatar en FAT16. Encara que teòricament FAT16 pot estar en un disc de 4.1 MB, el mkfs.vfat no ha funciona bé en les proves si no es fà molt més gran.

Podem crear una imatge de FAT amb:

$ dd if=/dev/zero of=disc.img bs=512 count=20000

Si volem, podem utilitzar el urandom per donar un aspecte més realista amb un disc que té dades previament:

$ dd if=/dev/urandom of=disc.img bs=512 count=20000

Després, li donem format. Com per a Linux, tot es un fitxer, pots formatejar un fitxer igual que un disc:

$ mkfs.vfat -F 16 disc.img
# Observa que he forçat a que siga FAT16

Per a muntar-lo:

$ sudo mount -o loop -o fat=16 ./disc.img ./imgs/

A partir de ací, podem analitzar el contingut amb xxd en hexadecimal. També podem utilitzar la comanda fsstat del paquet sleuthkit:

$ sudo apt-get install sleuthkit
$ fsstat disc.img

Si analitzem la primera part:

0000000: eb3c 906d 6b64 6f73 6673 0000 0204 0100  .<.mkdosfs......
0000010: 0200 0220 4ef8 1400 2000 4000 0000 0000  ........ .@.....
0000020: 0000 0000 0000 293a a2a6 8020 2020 2020  ......):...     
0000030: 2020 2020 2020 4641 5431 3620 2020 0e1f      FAT16   ..
0000040: be5b 7cac 22c0 740b 56b4 0ebb 0700 cd10  .[|.".t.V.......
0000050: 5eeb f032 e4cd 16cd 19eb fe54 6869 7320  ^..2.......This 
0000060: 6973 206e 6f74 2061 2062 6f6f 7461 626c  is not a bootabl
0000070: 6520 6469 736b 2e20 2050 6c65 6173 6520  e disk.  Please 
0000080: 696e 7365 7274 2061 2062 6f6f 7461 626c  insert a bootabl
0000090: 6520 666c 6f70 7079 2061 6e64 0d0a 7072  e floppy and..pr
00000a0: 6573 7320 616e 7920 6b65 7920 746f 2074  ess any key to t
00000b0: 7279 2061 6761 696e 202e 2e2e 200d 0a00  ry again ... ...
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000100: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000110: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000120: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000160: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000170: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000190: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00001b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa  ..............U.


Aquest és el boot record de la partició que hem creat.

Observem el significat de alguns dels camps:

  • eb3c 90: Es tracta d'una instrucció de salt válida per a un x86, serveix per a indicar que els pròxims 3c bytes no són executables.
  • 6d 6b64 6f73 6673 00: OEM ID, Es part del BIOS Parameter Block (BPB)
  • 00 02: Bytes per sector. Està en Little endian, per tant, és 0x0200 = 512
  • 04: Sectors per Cluster.
  • 0100: Sectors reservats. També està en Little endian. 0x0001 = 1 sector reservat. Mínim ha de ser 1, ja que és el del sector de arranc.
  • 02: Número de FATs. És el nombre de cópies de la FAT, normalment és 2.
  • 00 02: Quantitat màxima de arxius en l'arrel del sistema d'arxius. És 512. Però cal dir que si utilitzem noms llargs són menys.
  • 20 4e: Quantitat de sectors. No cal utilitzar-lo si és més de 32MB. En aquest cas es tracta de 0x4e20 = 2048 sectors de 512 bytes. Ja que el disc l'hem fet de 10MB.
  • f8: Tipus de dispositiu (f8 = hard drive; f0 = floppy drive)
  • 1400: Sectors per FAT 0x0002= 2 sectors Donada aquesta informació, juntament amb el nombre dels FAT i els sectors reservats esmentats, podem calcular on comença el directori arrel. Donat el nombre d'entrades al directori arrel, també podem calcular on està l'àrea de dades del disc. En aquest cas són 0x14 = 20 sectors o 5 clusters per cada FAT
  • 2000: Sectors per track. Referència a la geometría del disc.
  • 4000: Número de capçals.
  • 0000 0000: Sectors fins al començament del volume. Poden ser molts si hi han altres particions. Però en aquest cas és 0.
  • 0000 0000: Sectors totals. S'utilitza en cas de que els sectors totals és més de 32MB.
  • 00: Drive id. Sols importa si és arrencable. 00 és floppy 80 disc dur.
  • 00: Reservat per a NT
  • 29: Extended boot signature. Pot ser 0x28 o 0x29 per a ser reconegut per NT.
  • 3a a2a6 80: Número de serie del volume. És un identificador únic i es calcula amb operacions matemàtiques sobre la data en que es va formatejar.
  • 20 2020 2020 2020 2020 2020: Nom del volumen o partició. Pot ser de 11 caracters. Es aquest cas són espais.
  • 4641 5431 3620 2020: Tipus de FAT. Pot ser FAT12 o FAT16. Per a FAT32 pot no utilitzar-se. No és totalment fiable.
  • 0e1f ... : Codi executable
  • 55aa: Signatura de arranc. Sempre ha de ser 0x55aa

La última línia:


És el principi d'una de les FAT. Normalment hi ha dos copies iguals per evitar errors.

0000800: f8ff ffff 0000 0400 ffff 0000 0000 0000  ................
  • f8ff: Tipus de dispositiu. F8 és un disc dur.
  • ffff: Indica quin serà el indicador de final del cluster. En FAT16 i FAT32 s'utilitza per a indicar l'estat de la partició. Si ha estat mal desmuntada o pot tindre errors.
  • 0000 0400 ffff 0000 0000 0000: Les dades començen a partir del cluster 2, ja que els altres 2 estan reservats. El que diu és que hi ha un fitxer que comença en la posició 3, continua en la 4 i termina.

La mida de la FAT depen de la mida de la partició. En aquest cas, comença en el segón cluster i termina en el 6. Per tant, ocupa 5 clusters. Si hi han dos FAT, entre les dos i el primer cluster per al boot record s'utilitzen 11 en aquest cas. Per tant, a partir del cluster 11, comença el directori arrel.


0005800: 4166 0031 002e 0074 0078 000f 00a7 7400  Af.1...t.x....t.
0005810: 0000 ffff ffff ffff ffff 0000 ffff ffff  ................
0005820: 4631 2020 2020 2020 5458 5420 0000 a056  F1      TXT ...V 
0005830: c442 c442 0000 a056 c442 0300 0700 0000  .B.B...V.B......
0005840: 4166 0069 006c 0065 0034 000f 000c 0000  Af.i.l.e.4......
0005850: ffff ffff ffff ffff ffff 0000 ffff ffff  ................
0005860: 4649 4c45 3420 2020 2020 2020 0000 b856  FILE4       ...V
0005870: c442 c442 0000 b856 c442 0400 000a 0000  .B.B...V.B......
0005880: 4166 0069 006c 0065 0035 000f 00a0 0000  Af.i.l.e.5......
0005890: ffff ffff ffff ffff ffff 0000 ffff ffff  ................
00058a0: 4649 4c45 3520 2020 2020 2020 0000 e456  FILE5       ...V
00058b0: c442 c442 0000 e456 c442 0600 0064 0000  .B.B...V.B...d..

Aquest és el principi del directori arrel. El únic que té un lloc fixe en la FAT.

Les entrades estan fetes normalment de 32 bits. En l'exemple tenim 3 fitxers. Anem a analitzar una d'elles:

  • 41: Es tracta d'un camp que indica si és un long name o no. En aquest cas, amb 41, és un nom curt. [1]
  • 66 0031 002e 0074 0078 00 7400 0000 ffff ffff ffff ffff ffff ffff: Long name en Unicode. Si no es pot plenar amb caracters, es plena amb 0000 i ffff fins al final. Unicode utilitza 16 bits per a cada lletra. Per aixó, cada lletra té 00 darrere.
  • a7: Long name checksum.
  • 4631 2020 2020 2020 5458 54 Nom DOS per compatibilitat.
  • 20 Atributs de la entrada. El 20 significa que és un arxiu.
  • 00 Reservat per a NT.
  • 00 a056 Hora de creació.
  • c442 c442 0000 a056 c442: Data de creació, data d'accés, hora d'accés, hora de modificació, data de modificació.
  • 0300: Localizació de les dades en el disc. En aquest cas, les dades comencen a partir del 3 cluster.
  • 0700 0000: Longitut de les dades. En aquest cas 7 bytes (recordem que està en little endian, es a dir, que queda 0000 0007)


Diu que comença en el 3 cluster. És a dir, davant està el 0,1,2. Però el 0 i el 1 no es pdoen utiltizar, per tant, sols tindrà un cluster davant en el sector de les dades.

Si el boot record i les FAT ocupen 11 clusters i el directori arrel 8 més, tenim 19 clusters utilitzats. Les dades comencen en el cluster 19 o la direcció de memòria 19*2048 = 0x9800. La direcció, per tant, del cluster 3 és 0x9800 + 0x800 = 0xa000

0009ff0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000a000: 686f 6c61 310a 0a00 0000 0000 0000 0000  hola1...........
000a010: 0000 0000 0000 0000 0000 0000 0000 0000  ................


http://www.beginningtoseethelight.org/fat16/index.htm http://support.microsoft.com/kb/140418