Zoom Icon

Gestione Disco a Basso Livello

From UIC

Il Disco a Basso Livello

Contents


Infos
Author: b0nu$
Email: bonus@numerica.it
Website:
Date: 01/01/2001 (dd/mm/yyyy)
Level: No brain needed
Language: Italian Image:Flag_Italian.gif
Comments:



Introduction

Negli anni ottanta un giovane signore di nome Peter Norton sorprese i suoi amici recuperando un file cancellato, e questa piccola utility che prese il nome di unerase lo rese famoso nel mondo della programmazione.
In questo tutorial vedremo come è organizzato il file system del DOS, vedremo come esso salva e cancella i file e impareremo ad usare alcune routine messe a disposizione dal sistema operativo.


Tracce e Settori

Un hard-disk è costituito da un certo numero di dischi "impilati" uno sull'altro a cui si accede per leggere e scrivere tramite un pettine di testine:

O I-----------
------------------- |
O I-----------
------------------- <==>|
O I-----------
------------------- |
O I-----------
------------------- |
/ O I-----------
/ \
disco \ testina

Ogni disco è costituito da 2 facce, ogni faccia da n tracce e ogni traccia da m settori.
Il settore è l'unità minima di informazione che può essere letta o scritta e variano a seconda della capacità del disco da 32 a 4096 byte (di solito sono 512); su ogni traccia ci sono da 4 a 32 settori e su ogni superficie da 20 a 1500 tracce.
Un settore è composto da due parti: un numero di identificazione e l'area dei dati.


Struttura fisica di un disco

Un disco fisso è diviso in diverse aree che sono:

  1. Boot Sector
  2. FAT 1
  3. FAT 2
  4. Root directory
  5. Data

Vediamoli uno a uno in dettaglio.

Boot Sector

Il boot sector è situato sul primo settore del disco e contiene vari parametri riguardanti il disco stesso, riporto di seguito la sua struttura:

BOOT STRUCT
bsJMP db 3 dup (?)
bsOEM db 8 dup (?)
bsSECTSIZE dw  ?
bsCLUSTSIZE db  ?
bsRESSECT dw  ?
bsFATCNT db  ?
bsROOTSIZE dw  ?
bsTOTALSECT dw  ?
bsMEDIA db  ?
bsFATSIZE dw  ?
bsTRACKSECT dw  ?
bsHEADCNT dw  ?
bsHIDENSECT dd  ?
bsHUGESECT dd  ?
bsDRIVENUM db  ?
bsRESERV db  ?
bsBOOTSIGN db  ?
bsVOLID dd  ?
bsVOLABEL db 11 dup(?)
bsFILESTYPE db 8 dup(?)
BOOT ENDS

Vediamo cosa contengono:

  • bsJMP: contiene un'istruzione di JMP al codice di BOOT che carica il Sistema Operativo dal disco. Di solito il suo valore è E9h,XX,XX
  • bsOEM: è un identificativo Original Equipment Manufacturer. Non è usato dal dos
  • bsSECTSIZE: byte per settore
  • bsCLUSTER: settori per cluster
  • bsRESSECT: numero di settori riservati contiene di solito il numero di settori fino alla prima FAT
  • bsFATCNT: numero di FAT (di solito 2).Se ne usano due per poter recuperare i dati nel caso una si danneggi
  • bsROOTSIZE: massimo numero di voci in una directory
  • bsTOTALSECT: numero di settori del drive o della partizione. Se la partizione è superiore a 32Mb, questo valore è 0 e il numero di settori è specificato nel campo bsHUGESECT
  • bsMEDIA: specifica il tipo di drive FDD 3.5 1.44, FDD 3.5 2.88, CD-ROM, HD, ecc...
  • bsFATSIZE: numero di settori di una FAT
  • bsTRACKSECT: settori per traccia
  • bsHEADCNT: numero di testine per la lettura/scrittura
  • bsHIDENSECT: numero di settori nascosti
  • bsHUGESECT: numero di settore per dischi con capacità superiore ai 32Mb
  • bsDRIVENUM: 80h se è il drive di boot, 0 altrimenti
  • bsRESERV: non ancora usato (!)
  • bsBOOTSIGN: 29h (??)
  • bsVOLID: numero seriale del volume
  • bsVOLABEL: etichetta del volume
  • bsFILESTYPE: indica il tipo di file system :FAT12 o FAT16

Questa struttura è seguita dal codice di boot che carica il S.O. e termina con 0AA55h.

FAT

Il DOS mappa lo spazio usando i Cluster non i settori e ogni cluster consiste di un certo numero di settori consecutivi. Quando si crea un file il sistema alloca una catena di cluster per il file, ci scrive dentro i dati e memorizza le informazioni circa la locazione dei cluster nella File Allocation Table (FAT).
La FAT è un array con elementi di 12 o 16 bit (dipende dal numero dei cluster), i primi 3 byte (12bit) o 4 byte (16bit) sono riservati, per quanto riguarda il resto riporto una tabella con i valori dei possibili elementi:

ValoreSignificato
(0)000hCluster libero
(F)FF0h-(F)FF6hCluster riservato
(F)FF7hCluster danneggiato
(0)002h-(F)FEFhCluster allocato, il numero è quello del prossimo cluster nella catena
(F)FF8h-(F)FFFhUltimo cluster della catena

Quando il DOS crea un nuovo file o directory memorizza l'indice del primo cluster nella directory destinazione all'offset 1Ah e allo stesso tempo questo è l'indice del primo elemento nella FAT. Il valore nella FAT indica il prossimo cluster nella catena e cosi via fino all'ultimo cluster indicato con (F)FF8h-(F)FFFh.
Vediamo un esempio.
Consideriamo un file (PIPPO.EXE) situato nella root directory e supponiamo che inizi al cluster 04h. La struttura della FAT potrebbere essere questa:

indice000102030405060708090A0B0C0D
ValoreIDFFF00000000500600900A000FFF00BFFF000000

Quelli sottolineati sono i cluster del nostro file.

ROOT DIRECTORY

Qualsiasi disco ha una root directory ed eventualmente altre sotto-directory, ogni dir è un array di record.
La root directory è memorizzata subito dopo la seconda FAT mentre le altre dir sono trattate come normali file.
La struttura di un elemento della directory è:

DIRENTRY STRUCT
deFILENAME db 8 dup(?)
deFILEEXT db 3 dup(?)
deATRIB db  ?
deRESERV db 0Ah dup (?)
deTIME dw  ?
deDATE dw  ?
deCLUSTNUM dw  ?
deFILESIZE dd  ?
DIRENTRY ENDS

Vediamo il significato di ogni campo:

  • deFILENAME: Contiene il nome del file. Il primo carattere può avere un significato particolare:
ValoreSignificato
0L'elemento non è mai stato usato
05hSignifica che il primo carattere del nome è 0E5h (ASCII)
02EhSe il resto di questo campo sono spazi (20h) allora il campo deCLUSTNUM contiene il primo cluster della directory. Se anche il secondo valore è 02Eh e gli altri sono spazi, il campo deCLUSTNUM contiene il primo cluster della directory padre, oppure 0 se è la ROOT dir
0E5hQuesto file o directory è stato cancellato (il resto del nome rimane uguale)
  • deFILEEXT: 3 caratteri che contengono l'estensione del file.
  • deATRIB: Attributi del file:
7 6 5 4 3 2 1 0 bits
A D V S H R
| | | | | |_ 1 = Read only
| | | | |____ 1 = Hidden
| | | |_______ 1 = System
| | |__________ 1 = Volume label
| |_____________ 1 = Subdirectory
|________________ 1 = New or modified
  • deRESERV: Riservato (!)
  • deTIME: L'ora in cui il file è stato creato o modificato l'ultima volta. Il formato è il seguente:
15141312111009080706050403020100
HHHHHMMMMMMSSSSS
  • deDATE: Data in cui il file è stato creato o modificato l'ultima volta. Il formato è il seguente:
15141312111009080706050403020100
YYYYYMMMMMMDDDDD
  • deCLUSTNUM: Cluster iniziale della directory o del file.
  • deFILESIZE: dimensione del file in bytes


Note Finali

Per ora non mi vengono in mente esempi significativi da mostrarvi, ci sono vari interrupt che servono per creare file, leggerli, scrivere settori ecc.. quindi lascio a voi il compito di scrivere qualcosa....

bonus@numerica.it


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.