Κεφάλαιο – 15
Προγραμματισμός για υαλοκαθαριστήρες δεδομένων
Εισαγωγή
Έχουμε ήδη συζητήσει ότι όταν διαγράφουμε οποιοδήποτε αρχείο από το δίσκο, οι πληροφορίες δεν διαγράφονται εντελώς από τη μονάδα δίσκου, αλλά επισημαίνονται ως διαθέσιμες για την εγγραφή νέων δεδομένων πάνω της.
Όταν διαμορφώνουμε μια μονάδα δίσκου, όλες οι πληροφορίες των αρχείων και των καταλόγων της μονάδας, όπως τα FAT και οι καταχωρήσεις καταλόγου ρίζας, διαγράφονται, αλλά η περιοχή δεδομένων παραμένει αμετάβλητη και τίποτα από την περιοχή δεδομένων του δίσκου δεν διαγράφεται. Τα δεδομένα που διαγράφονται ή μορφοποιούνται χρησιμοποιώντας το λειτουργικό σύστημα παραμένουν στην περιοχή δεδομένων ως έχουν και μπορούν να ανακτηθούν με ορισμένες προσπάθειες ανάκτησης δεδομένων και λογισμικό ανάκτησης δεδομένων.
Επομένως, η ανάγκη να εξαλειφθούν πλήρως τα δεδομένα από μια μονάδα δίσκου οδηγεί στην απαίτηση για ένα τέτοιο πρόγραμμα που διαγράφει εντελώς τα δεδομένα από το δίσκο. Για να γίνει αυτό, δεν αρκεί απλώς να διαγράψετε τα αρχεία ή απλώς να μορφοποιήσετε τη μονάδα δίσκου, αλλά τα δεδομένα στο δίσκο πρέπει να αντικατασταθούν από κάποια άλλα δεδομένα.
Τα προγράμματα που χρησιμοποιούνται για την πλήρη διαγραφή των δεδομένων από το δίσκο είναι γνωστά ως προγράμματα διαγραφής δεδομένων. Αυτά τα προγράμματα γράφουν τυχαίους χαρακτήρες στην περιοχή δεδομένων για να αντικαταστήσουν τα δεδομένα και να διαγράψουν όλες τις πληροφορίες που είχαν αποθηκευτεί προηγουμένως στο δίσκο.
Όταν τα δεδομένα γίνουν εντελώς μη ανακτήσιμα
Για να διαγράψετε τα δεδομένα, η περιοχή δεδομένων του δίσκου θα πρέπει να αντικατασταθεί από κάποια άλλα δεδομένα σε αυτήν, αλλά το πρόβλημα δεν τελειώνει εδώ. Για να περιπλέξει ακόμη περισσότερο τα πράγματα, η τάση των μαγνητικών μονάδων να θυμούνται δεδομένα που έχουν αντικατασταθεί απαιτεί επίσης τα δεδομένα να επαναγράφονται πολλές φορές από τυχαίες ακολουθίες δεδομένων, έτσι ώστε να μην μπορούν να ανακτηθούν ακόμη και με εξελιγμένα εργαλεία ανάκτησης δεδομένων
Αυτό συμβαίνει επειδή οι τεχνολογίες που μπορούν να ανακτήσουν δεδομένα ακόμη και μετά τη χρήση κάποιων απλών υαλοκαθαριστήρων είναι διαθέσιμες σήμερα.
Ορισμένα προϊόντα διαγραφής δεδομένων εκτελούν δυαδικά μηδενικά και δυαδικά αντικαθιστώντας σε δεδομένα. Η εγγραφή μιας σειράς από δυαδικά μηδενικά και δυαδικά επιτυγχάνει το βαθύτερο αποτέλεσμα αντικατάστασης, καθώς αυτές οι τιμές είναι οι ελάχιστες και οι μέγιστες μαγνητικές τιμές αντίστοιχα.
Αν και αυτή είναι η θεωρία ενός ιδανικού προγράμματος διαγραφής δεδομένων, αλλά γενικά, η εγγραφή δεδομένων με τυχαίο χαρακτήρα ASCII είναι επαρκής. Ο λόγος για να το πούμε αυτό είναι ότι η ανάκτηση από εξελιγμένα εργαλεία και τεχνολογία ανάκτησης δεν μπορεί να χρησιμοποιηθεί για την ανάκτηση των δεδομένων οποιουδήποτε οργανισμού για μια τακτική ανάκτηση δεδομένων, επειδή αυτές οι τεχνολογίες είναι πολύ ακριβές και κοστίζουν εκατομμύρια ακόμη και για μεμονωμένη ανάκτηση. Όχι μόνο αυτό αλλά και αυτές οι τεχνολογίες είναι διαθέσιμες μόνο σε λίγες χώρες σε όλο τον κόσμο.
Θα συζητήσουμε μόνο την απλή αντικατάσταση δεδομένων για τη διαγραφή των δεδομένων από το δίσκο. Ωστόσο, μπορείτε να τροποποιήσετε περαιτέρω τα ίδια προγράμματα για να γράψετε τους τυχαίους χαρακτήρες μόνο με λίγη προσπάθεια. Τα δεδομένα που διαγράφονται από αυτήν την ιδέα δεν μπορούν επίσης να ανακτηθούν από κανένα λογισμικό ανάκτησης δεδομένων.
Γιατί η διαγραφή δεδομένων είναι τόσο σημαντική
Όταν συζητάμε για τις τεχνικές ανάκτησης δεδομένων, διαβεβαιώνουμε τον χρήστη ότι τα δεδομένα μπορούν να ανακτηθούν με ορισμένες γενικές ή συγκεκριμένες προσπάθειες ανάκτησης δεδομένων. Ωστόσο, η ανάκτηση δεδομένων δεν είναι πάντα μια επιθυμητή και αναμενόμενη λειτουργία για όλους.
Μπορεί να υπάρχουν πολλά άτομα ή οργανισμοί που είναι πάντα πρόθυμοι να διαγράψουν τα δεδομένα του δίσκου τους με τέτοιο τρόπο που δεν θα πρέπει να ανακτηθούν με κανέναν τρόπο. Σε τέτοιες περιπτώσεις, ενδέχεται να έχουν αποθηκευτεί στο παρελθόν πολύ ευαίσθητα δεδομένα στο δίσκο, τα οποία, εάν πάνε σε λάθος χέρια, μπορεί να βλάψουν τον οργανισμό ή τον χρήστη κάνοντας κακή χρήση των πληροφοριών.
Όπως γνωρίζουμε ότι η απαίτηση για όλο και περισσότερο χώρο στους σκληρούς δίσκους αυξάνεται μέρα με τη μέρα. Ως αποτέλεσμα αυτού, οι παλαιότεροι δίσκοι μικρής χωρητικότητας αντικαθίστανται από νέους δίσκους μεγάλης χωρητικότητας σε μεγάλη κλίμακα κάθε χρόνο σχεδόν σε κάθε οργανισμό. Εάν αυτοί οι παλαιότεροι δίσκοι αποκτηθούν από λάθος χέρια, μπορεί να δημιουργήσει ένα πολύ σοβαρό πρόβλημα για αυτόν τον οργανισμό.
Σύμφωνα με νέα που δημοσιεύθηκαν από το CNET News.com, στις 16 Ιανουαρίου 2003, οι φοιτητές του Ινστιτούτου Τεχνολογίας της Μασαχουσέτης, Simon Garfinkel και Abbi Shelat, αγόραζαν παλιούς σκληρούς δίσκους, στο όνομα της έρευνας, από τον Ιστό και άλλα μεταχειρισμένα πωλήσεις για να αποκαλύψουν τις τεράστιες ποσότητες προσωπικών πληροφοριών που οι άνθρωποι δεν μπαίνουν στον κόπο να διαγράψουν.
Αφού αγόρασαν 158 μονάδες δίσκου για περίπου 1000$, κατάφεραν να συλλέξουν πάνω από 5000 αριθμούς πιστωτικής κάρτας, ιατρικά αρχεία, λεπτομερείς προσωπικές και εταιρικές οικονομικές πληροφορίες και αρκετά gigabyte e-mail, πηγαίους κώδικες και άλλες πληροφορίες.
Το ζεύγος αυτών των μαθητών συγκέντρωσε τα ευρήματά του σε μια αναφορά με τίτλο "Remembrance of Data Passed: A Study of Disk Sanitation" δημοσιεύθηκε στην έκδοση Φεβρουαρίου του IEEE Security and Privacy.
Τα κύρια σημεία που προέκυψαν από την έρευνα είναι ότι η αγορά μεταχειρισμένων σκληρών δίσκων είναι γεμάτη με προσωπικές πληροφορίες που καθιστούν πολύ εύκολο για έναν κακόβουλο αγοραστή να υποθέσει την ταυτότητα κάποιου άλλου.
Πρόγραμμα εγγραφής για μη καταστρεπτικό υαλοκαθαριστήρα δεδομένων
Ο μη καταστρεπτικός υαλοκαθαριστήρας δεδομένων είναι ένα είδος προγράμματος σκουπίσματος δεδομένων χρησιμοποιώντας το οποίο μπορούμε να εξαλείψουμε ολόκληρο τον “μη εκχωρημένο χώρο” του όγκου του δίσκου, χωρίς να βλάπτονται τα δεδομένα που είναι αποθηκευμένα στο δίσκο, με οποιονδήποτε τρόπο.
Το πεδίο εφαρμογής αυτού του υαλοκαθαριστήρα δεδομένων είναι στις περιπτώσεις όπου θέλετε να διαγράψετε όλο τον μη εκχωρημένο χώρο του τόμου του δίσκου ενώ τα εκχωρημένα δεδομένα που είναι αποθηκευμένα στον τόμο θα πρέπει να παραμείνουν ανέγγιχτα. Αυτός ο τύπος προγράμματος σκουπίσματος δεδομένων διαγράφει επίσης την περιοχή δεδομένων των διαγραμμένων αρχείων.
Το πρόγραμμα που κωδικοποιεί έναν τύπο μη – Το πρόγραμμα διαγραφής καταστροφικών δεδομένων έχει δοθεί στη συνέχεια:
///// Πρόγραμμα για μη καταστρεπτικό υαλοκαθαριστήρα δεδομένων \\\\\
#include <stdio.h>
unsigned int file_num=0; /* Provides File Number
During the Auto Creation
of Temporary Data files */
float status=0; /* How Much Disk space is
still Written */
static char dbuf[40000]; /* Data Buffer to write
Temporary Files with */
char file_extension[5]=".ptt";/* Unique Extensions for
Temporary Files */
char temp[5]; /* File Number converted to
String */
char filename[40]; /* Temporary File name */
void main()
{
unsigned int i=0;
clrscr();
while(i<40000)
{
dbuf[i] = ' ';
i++;
}
gotoxy(10,14);cprintf(" MB Still Written...");
while(1)
{
/* Λογική δημιουργίας προσωρινών αρχείων αυτόματα με μοναδικό όνομα */
strcpy(filename,"TTPT");
itoa(file_num,temp,10);
strcat(filename,temp);
strcat(filename,file_extension);
file_num++;
write_to_temp(filename);
}
} //// End of Main \\\\
///// Λειτουργία εγγραφής δεδομένων σε προσωρινό αρχείο \\\\\
write_to_temp(char *filename)
{
unsigned int i, count=1;
float buf_status=0;
FILE *tt;
if((tt=fopen(filename,"wb"))==NULL)
{
fclose(tt);
printf("\n Error occurred while creating temporary
file, ");
printf("\n Removing temporery Files After KEY BOARD
HIT");
getch();
remove_temp_file();/* Remove All temporary files */
}
while(1)
{
for(i=0;i<50;i++)
{
fprintf(tt,"%s",dbuf);
}
buf_status = (float)((40000*50*count)/512);
status= status+(40000*50);
count++;
gotoxy(10,14);
cprintf("%.0f",(float)(status/1000000));
if(kbhit())
{
fclose(tt);
printf("\n Removing Temporery Files, Please
Wait...");
remove_temp_file();
}
if(buf_status>=10000)
{
fclose(tt);
return;
}
}
}
/* Λειτουργία αυτόματης διαγραφής των προσωρινών αρχείων */
remove_temp_file()
{
int i=0;
for(i=0;i<=file_num;i++)
{
strcpy(filename,"TTPT");
itoa(i,temp,10);
strcat(filename,temp);
strcat(filename,file_extension);
remove(filename);
}
exit(1);
return 0;
}
Σχόλια για τη λογική και την κωδικοποίηση του προγράμματος:
Σε αυτό το πρόγραμμα βασικά ακολουθούμε τα ακόλουθα δύο βήματα για να σκουπίσουμε τον μη εκχωρημένο χώρο του δίσκου:
- Αυτόματη δημιουργία προσωρινών αρχείων δεδομένων: Πρώτα δημιουργούμε προσωρινά αρχεία με μοναδικά ονόματα και με ορισμένα δεδομένα σε αυτά μέχρι να γεμίσει ο όγκος του δίσκου με αυτά τα προσωρινά αρχεία δεδομένων. Με αυτόν τον τρόπο, όλη η περιοχή μη εκχωρημένων δεδομένων της λογικής μονάδας δίσκου καταλαμβάνεται από τα δεδομένα των προσωρινών αρχείων και όλα τα μη εκχωρημένα δεδομένα αντικαθίστανται.
Για να το κάνω αυτό, επέλεξα τα ονόματα των προσωρινών αρχείων σε μορφή TTPTxxxx.PTT, που σημαίνει ότι οι τέσσερις πρώτοι χαρακτήρες των προσωρινών αρχείων είναι TTPT και η επέκταση των αρχείων είναι .PTT. Αυτό γίνεται για να παρέχονται στα προσωρινά αρχεία τα μοναδικά ονόματα αρχείων.
Έχω ορίσει το μέγιστο μέγεθος του μεμονωμένου προσωρινού αρχείου, που ισοδυναμεί με περίπου 11.718 δεδομένα τομέων, ωστόσο μπορείτε να το ορίσετε σύμφωνα με εσάς. Επέλεξα τον χαρακτήρα space “ ” (χαρακτήρας ASCII 32) για να συμπληρώσετε τα δεδομένα σε προσωρινά αρχεία. Ωστόσο, μπορούν επίσης να χρησιμοποιηθούν τυχαίοι χαρακτήρες αντί για κενό.
- Κατάργηση όλων των προσωρινών αρχείων: Όταν η λογική μονάδα δίσκου είναι γεμάτη με προσωρινά αρχεία, υποδηλώνει ότι όλη η περιοχή δεδομένων που δεν έχει εκχωρηθεί έχει πλέον αντικατασταθεί. Τώρα όλα τα προσωρινά αρχεία που δημιουργούνται από το πρόγραμμα αφαιρούνται αυτόματα. Και έτσι επιτυγχάνεται ο μη εκχωρημένος χώρος.
Στην κωδικοποίηση του προγράμματος, το όνομα αρχείου του πίνακα χαρακτήρων αποθηκεύει το όνομα του αρχείου για να δημιουργήσει αυτόματα προσωρινά αρχεία, με διαφορετικά ονόματα.
Η συνάρτηση write_to_temp(όνομα αρχείου); γεμίζει το προσωρινό αρχείο έως και 11.718 τομείς (επειδή δεν υπάρχουν 10.000 τομείς στην καθορισμένη ομαδική εγγραφή του buffer) ισοδύναμα δεδομένα με τη βοήθεια του buffer δεδομένων dbuf των 40.000 byte. Γράφεται 50 φορές η προσωρινή μνήμη δεδομένων κάθε φορά για να επιταχυνθεί η εγγραφή.
Τα προσωρινά αρχεία δημιουργούνται μέχρι να γεμίσει ο όγκος του δίσκου και να παρουσιαστεί σφάλμα δημιουργίας αρχείου. Η συνάρτηση remove_temp_file() αφαιρεί όλα τα προσωρινά αρχεία που έχουν δημιουργηθεί από το πρόγραμμα.
Με αυτόν τον τρόπο όλος ο μη εκχωρημένος χώρος διαγράφεται χωρίς να βλάπτονται τα δεδομένα του τόμου του δίσκου.
Πρόγραμμα γραφής για Destructive Data Wiper:
Τα καταστροφικά προγράμματα σκουπίσματος δεδομένων είναι αυτά που γράφουν απευθείας στην επιφάνεια του δίσκου. Αυτός ο τύπος προγραμμάτων σκουπίσματος δεδομένων λειτουργούν σε χαμηλότερο επίπεδο από το σύστημα αρχείων και το λειτουργικό σύστημα, πράγμα που σημαίνει ότι όλα τα δεδομένα και άλλες λογικές πληροφορίες, συμπεριλαμβανομένων του λειτουργικού συστήματος, των συστημάτων αρχείων, της καταχώρισης καταλόγου και ό,τι είναι γραμμένο στο δίσκο, διαγράφονται.
Αυτά τα προγράμματα σκουπίσματος δεδομένων σκουπίζουν απευθείας τους τομείς της επιφάνειας του δίσκου και σβήνουν ό,τι είναι γραμμένο σε αυτόν. Καθώς όλα τα δεδομένα του δίσκου, συμπεριλαμβανομένου του λειτουργικού συστήματος χάνονται, αυτά τα προγράμματα ονομάζονται καταστροφικά προγράμματα διαγραφής δεδομένων.
Αυτοί οι τύποι προγραμμάτων σκουπίσματος προτιμώνται σε τέτοιες περιπτώσεις, όπου ο χρήστης είναι πρόθυμος να αντικαταστήσει τα πάντα στο δίσκο, συμπεριλαμβανομένου του λειτουργικού συστήματος και όλων των δεδομένων στο δίσκο.
Ωστόσο, υπάρχουν μερικά ακόμη πλεονεκτήματα αυτού του τύπου προγραμμάτων διαγραφής δεδομένων. Καθώς αυτά τα καταστροφικά προγράμματα σκουπίσματος δεδομένων λειτουργούν εντελώς απαλλαγμένα από το λειτουργικό σύστημα και το σύστημα αρχείων και γράφουν απευθείας στην επιφάνεια του δίσκου, είναι αρκετά πιο γρήγορα από τα μη καταστρεπτικά προγράμματα καθαρισμού δεδομένων.
Επίσης, εάν δημιουργούνται λογικοί κακοί τομείς στο δίσκο λόγω της παράνομης αποθήκευσης κάποιων τυχαίων δεδομένων, αυτοί οι λογικοί κακοί τομείς εξαφανίζονται επίσης εντελώς με τα δεδομένα του δίσκου.
Η κωδικοποίηση για ένα καταστροφικό πρόγραμμα διαγραφής δεδομένων έχει δοθεί στη συνέχεια. Το πρόγραμμα έχει γραφτεί για να υποστηρίζει και δίσκους μεγάλου μεγέθους. Το πρόγραμμα σκουπίζει τα δεδομένα του δεύτερου φυσικού σκληρού δίσκου που είναι συνδεδεμένος στον υπολογιστή.
///// Κωδικοποίηση για ένα καταστροφικό πρόγραμμα διαγραφής δεδομένων \\\\\
#include<stdio.h>
#include<dos.h>
/* Δομή που θα χρησιμοποιηθεί από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, Αριθμός συνάρτησης 0x48. */
struct geometry
{
unsigned int size ; /* (call) size of Buffer */
unsigned int flags ; /* Information Flags */
unsigned long cyl ; /* Number of Physical Cylinders on
Drive */
unsigned long heads ;/* Number of Physical Heads on
Drive */
unsigned long spt ; /* Number of Physical Sectors Per
Track */
unsigned long sectors[2] ; /* Total Number of
Sectors on Drive */
unsigned int bps ; /* Bytes Per Sector */
} ;
/* Δομή της μορφής πακέτου διεύθυνσης δίσκου, για χρήση από τη συνάρτηση writeabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Size of Packet,
generally 10H */
char reserved ; /* Reserved (0) */
int blockcount ; /* Number of Blocks to
Transfer */
char far *bufferaddress ; /* address to Transfer
Buffer */
unsigned long blocknumber[2] ; /* Starting Absolute
Block Number */
} ;
///// Λειτουργία λήψης παραμέτρων μονάδας δίσκου \\\\\
unsigned long getdrivegeometry (int drive)
{
union REGS i, o ;
struct SREGS s ;
struct geometry g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
i.h.ah = 0x48 ; /* Function Number 0x48 of INT 13H
Extensions */
i.h.dl = drive; /* Drive Number */
i.x.si = FP_OFF ( (void far*)&g ) ;
s.ds = FP_SEG ( (void far*)&g ) ;
/* Επικαλέστε τον καθορισμένο αριθμό συνάρτησης της επέκτασης INT 13H με Τιμές καταχώρησης τμήματος */
int86x ( 0x13, &i, &o, &s ) ;
printf("\n Head = %lu, Sectors Per Track = %lu, Cylinder =
%lu\n",
g.heads,g.spt,g.cyl);
/* Εάν η λειτουργία λήψης μονάδας γεωμετρίας αποτύχει, εμφανίστε το μήνυμα σφάλματος και πραγματοποιήστε έξοδο */
if(g.spt==0)
{
printf("\n Get Drive Geometry Function Fails....");
printf("\n Extensions Not Supported, Press any Key to
Exit...");
getch();
exit(1);
}
return *g.sectors; /* Return The Number of
Sectors on Drive */
}
void main()
{
unsigned long loop=0, Sectors_in_ HDD2=0;
unsigned char buffer[61440]; /* Data buffer of 61440
bytes Equivalent to
120 Sectors */
unsigned long i=0;
char choice;
clrscr();
/* Εάν συνολικά όχι. των συνδεδεμένων σκληρών δίσκων είναι λιγότερο από δύο Εμφάνιση Μήνυμα Σφάλματος και Έξοδος. */
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n You Must Have At least Two Hard Disks
Attached to your Computer To Run This");
printf("\n Program. This Program has been developed
to Wipe the Data of Second Hard Disk.");
printf("\n Press any Key to Exit... ");
getch();
exit(1);
}
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Total Sectors in Second Hard Disk =
%lu\n\n",
Sectors_in_HDD2);
///// Πρώτα Επιβεβαίωση και μετά Συνέχεια \\\\\
printf("\n It is A Data Wiping Program, and Writes on
the Surface of the Disk,");
printf("\n After running this program, Data can not
be recovered by any Software,");
printf("\n All The Data in Second Hard Disk will be
lost !!!");
printf("\n Press \'Y\' to Continue, Else any key to
Exit... ");
choice = getche();
switch(choice)
{
case 'y':
case 'Y':
break;
default:
exit(0);
}
gotoxy(10,15);cprintf(" Initializing, Please Wait...");
for(i=0;i<61440;i++)
{
buffer[i]='\0';
}
gotoxy(10,15);cprintf(" ");
gotoxy(10,15);
printf("Currently Wiping Absolute Sector: ");
for(loop=0;loop<= Sectors_in_HDD2;loop=loop+120)
{
writeabsolutesectors (0x81, loop, 120, buffer);
gotoxy(44,15); printf("%ld",loop);
if(kbhit())
{
exit(0);
}
///// Εμφάνιση μηνύματος όταν ολοκληρωθεί \\\\\
printf("\n\n Data wiping is Now Completed, All the Data in
Second Hard Disk is now");
printf("\n Completely Erased, Press any Key to Exit...");
getch();
}
//// Συνάρτηση για τη γραφή απόλυτων τομέων \\\\
int writeabsolutesectors ( int drive, unsigned long sectornumber, int numofsectors, void *buffer )
{
union REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* Packet Size = 10H */
pp.reserved = 0 ; /* Reserved = 0 */
pp.blockcount = numofsectors ;/* Number of Sectors to
be written */
/* για την προσωρινή μνήμη δεδομένων */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ; /* Sector number
to be written*/
pp.blocknumber[1] = 0 ; /* Block number = 0 */
i.h.ah = 0x43 ; /* Function Number */
i.h.al = 0x00 ; /* Write Flags */
i.h.dl = drive ; /* Physical Drive
number */
i.x.si = FP_OFF ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ; /* ds:si for
buffer Parameters */
/* Επικαλέστε την καθορισμένη συνάρτηση του INT 13H με τιμές καταχωρητή τμημάτων */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; //failure
else
return 1 ; // success
}
Σχόλια σχετικά με την κωδικοποίηση:
Η γεωμετρία της δομής χρησιμοποιείται από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, Function Number 0x48 για να ληφθούν οι διάφορες παραμέτρους του δίσκου.
Η δομή diskaddrpacket είναι για μορφή πακέτου Διεύθυνσης δίσκου, που θα χρησιμοποιηθεί από τη συνάρτηση writeabsolutesectors.
Η συνάρτηση getdrivegeometry (int drive) είναι να λαμβάνει τις παραμέτρους της μονάδας δίσκου της μονάδας με αριθμό φυσικής μονάδας δίσκου που έχει καθοριστεί. Το buffer [61440] είναι το buffer δεδομένων των 61440 byte, που ισοδυναμεί με 120 Sectors.
Το
(char) peekb(0x0040, 0x0075) χρησιμοποιείται για την εύρεση του αριθμού των σκληρών δίσκων που είναι συνδεδεμένοι στον υπολογιστή, που είναι αποθηκευμένοι στη θέση μνήμης που αντιπροσωπεύεται από το τμήμα 0040H:offset 0075H. Εάν ο συνολικός αριθμός των συνδεδεμένων σκληρών δίσκων είναι μικρότερος από δύο Εμφάνιση Μήνυμα Σφάλματος και Έξοδος.
Η συνάρτηση
writeabsolutesectors ( 0x81, loop, 120, buffer ) χρησιμοποιείται για την εγγραφή των δεδομένων της προσωρινής μνήμης δεδομένων σε 120 τομείς κάθε φορά ξεκινώντας από τον απόλυτο αριθμό τομέα που καθορίζεται από τον βρόχο.
Επέλεξα ‘\0’ (χαρακτήρας NULL, κωδικός ASCII 0) για εγγραφή στους τομείς για αντικατάσταση των δεδομένων. Ωστόσο, μπορείτε να χρησιμοποιήσετε τυχαίους χαρακτήρες για να αντικαταστήσετε τα δεδομένα.
Για λεπτομερή περιγραφή σχετικά με τις συναρτήσεις writeabsolutesectors και getdrivegeometry, ανατρέξτε στα κεφάλαια που δόθηκαν νωρίτερα σε αυτό το βιβλίο.
Διαγραφή περιοχής δεδομένων συγκεκριμένου αρχείου
Συζητήσαμε για τα προγράμματα σκουπίσματος δεδομένων που διαγράφουν τα δεδομένα του μη εκχωρημένου χώρου του δίσκου ή σκουπίζουν ολόκληρο τον δίσκο. Ωστόσο, εάν ο χρήστης είναι πρόθυμος να σκουπίζει τα δεδομένα κάθε φορά που διαγράφει τα δεδομένα, μπορεί να είναι μια χρονοβόρα διαδικασία για να σκουπίσει ολόκληρο τον μη εκχωρημένο χώρο του δίσκου.
Χρειαζόμαστε αυτόν τον τύπο προγραμμάτων σκουπίσματος δεδομένων για να σκουπίσουμε την περιοχή δεδομένων που καταλαμβάνεται μόνο από το συγκεκριμένο αρχείο. Για να το κάνουμε αυτό, λαμβάνουμε τη βοήθεια από τις καταχωρήσεις καταλόγου FAT και Root, για να βρούμε την περιοχή δεδομένων που καταλαμβάνεται από τα συγκεκριμένα αρχεία
Ακόμα και σε περίπτωση δισκέτας, εάν τα δεδομένα δεν είναι κατακερματισμένα, μπορούμε να το κάνουμε μόνο με τη βοήθεια των πληροφοριών καταλόγου Root. Ο παρακάτω πίνακας δείχνει τις πληροφορίες που αποθηκεύονται από μια καταχώρηση ριζικού καταλόγου με 32 byte, για οποιοδήποτε αρχείο:
Όπως βλέπουμε στον πίνακα περιεχομένων της καταχώρισης ριζικού καταλόγου, είμαστε σε θέση να βρούμε το αρχικό και το τελικό σύμπλεγμα των αρχείων. Το πρώτο Byte του ονόματος αρχείου μπορεί επίσης να περιέχει ορισμένες σημαντικές πληροφορίες σχετικά με το αρχείο. Οι πληροφορίες που δίνονται από αυτό το byte μπορεί να είναι μία από τις παρακάτω:
Ας δοκιμάσουμε αυτές τις πληροφορίες για να διαγράψουμε τα δεδομένα οποιουδήποτε αρχείου είναι αποθηκευμένο σε 1,44 Mb, 3 ½ δισκέτα ιντσών, με τη βοήθεια πληροφοριών ριζικού καταλόγου. Υποθέτοντας ότι τα δεδομένα στη δισκέτα δεν είναι κατακερματισμένα, το πρόγραμμα που δίνεται στη συνέχεια διαγράφει τα δεδομένα του καθορισμένου αρχείου από την περιοχή δεδομένων του:
/* Πρόγραμμα για να σκουπίσετε την περιοχή δεδομένων του καθορισμένου αρχείου στη δισκέτα */
#include<stdio.h>
#include<dos.h>
///// Δομή για ανάγνωση 32 byte Καταχώρισης αρχείου στον κατάλογο ρίζας \\\\\
struct root
{
unsigned char filename[8]; /* File name Entry of
8 Bytes */
unsigned char extension[3]; /* Extension of File of
3 Bytes */
unsigned char attribute; /* File Attribute Byte */
unsigned char reserved[10]; /* Reserved Bytes 10 */
unsigned int time; /* Time, 2 Bytes */
unsigned int date; /* Date, 2 Bytes */
unsigned int starting_cluster;/* Starting Cluster of File,
2 Bytes */
unsigned long file_size; /* File Size in Bytes,
4 Bytes */
};
/* Θα πρέπει να ληφθεί αυτό για να διαβάσετε όλες τις καταχωρήσεις καταλόγου ρίζας */
//struct root entry[224];
/* Δομή για την ανάγνωση και των 16 καταχωρήσεων αρχείων σε έναν τομέα του καταλόγου ρίζας */
struct one_root_sector
{
struct root entry[16];
};
struct one_root_sector one;
void main()
{
int result, i, num_sectors,j;
char wipe_buf[512]; /* Data Buffer to be used to wipe
out the data Area of file */
clrscr();
result= absread(0x00, 1, 19, &one); /* Read Absolute Sector
19 (First Sector of Root Directory) */
if (result != 0)
{
perror("Error in Reading Sector, Press any key to
Exit...");
getch();
exit(1);
}
/* Εμφάνιση πληροφοριών αρχείων μετά την ανάγνωση από τον κατάλογο ρίζας */
printf(" FILE NO. FILENAME EXTENSION STARTING CLUSTER
FILESIZE \n\n");
for(i=1;i<16;i++)
{
printf("\n %5d %8.8s %3.3s %5u %10lu ",
i, one.entry[i].filename, one.entry[i].extension,
one.entry[i].starting_cluster, one.entry[i].file_size);
}
//// Λάβετε στοιχεία χρήστη για να διαγράψετε το αρχείο \\\\
printf("\n\n Enter The File Number, you Want to Delete and
Wipe out Completely ");
scanf("%d", &i);
if(i<1 || i>15)
{
printf(" \"%d\" is an Invalid Choice..., Press any
Key to Exit...", i);
getch();
exit(1);
}
///// Πρώτα επιβεβαιώστε και μετά συνεχίστε \\\\\\
printf("\n You are About to wipe-out,
The File \"%.8s.%s\"",
one.entry[i].filename,
one.entry[i].extension);
printf("\n Do you Want to Continue...(Y/N) ");
switch(getche())
{
case 'y':
case 'Y':
break;
default:
exit(0);
}
///// Υπολογίστε το μέγεθος του αρχείου σε τομείς \\\\\
num_sectors = one.entry[i].file_size/512;
if((one.entry[i].file_size%512)>0)
{
num_sectors = num_sectors+1;
}
/* Ενδιάμεση μνήμη δεδομένων 512 byte με 512 NULL χαρακτήρες */
for(j=0;j<512;j++)
{
wipe_buf[j] = '\0';
}
///// Τομέας έναρξης του αρχείου \\\\\
j= one.entry[i].starting_cluster+31;
/* Διαγράψτε την περιοχή δεδομένων μέχρι να τελειώσουν οι τομείς του αρχείου */
while(j!=(one.entry[i].starting_cluster +
num_sectors+31) )
{
if((abswrite(0x00, 1, j, &wipe_buf))!=0)
{
printf("\n Error Writing on Disk Sectors");
getch();
exit(0);
}
j++;
}
printf("\n\n File \"%.8s.%.3s\" Deleted !!!" ,
one.entry[i].filename,
one.entry[i].extension);
one.entry[i].attribute = 0; /* Set the File Attribute
to 0 */
one.entry[i].time = 0; /* Wipe The Time information
of File */
one.entry[i].date = 0; /* Wipe The Date information
of File */
one.entry[i].starting_cluster = 0; /* Set the Starting cluster to 0
*/
one.entry[i].file_size = 0; /* Set the file Size to 0 */
one.entry[i].filename[0]=0xE5; /* Give the Deleted
file Status to the File */
///// Γράψτε τις παραπάνω πληροφορίες στον ριζικό κατάλογο \\\\\\
result= abswrite(0x00, 1, 19, &one);
if (result != 0)
{
perror("Error in Reading Sector, Press any key to
Exit...");
getch();
exit(1);
}
}
Σχόλια σχετικά με τη λογική και την κωδικοποίηση του προγράμματος:
Η ρίζα της δομής χρησιμοποιείται για την ανάγνωση 32 byte καταχώρισης αρχείου στον κατάλογο ρίζας και η δομή του one_root_sector διαβάζει και τις 16 καταχωρήσεις αρχείων σε έναν τομέα του καταλόγου ρίζας
Εάν θέλετε να διαβάσετε όλους τους τομείς των πληροφοριών του ριζικού καταλόγου, θα πρέπει να τους λάβετε ως καταχώριση ρίζας δομής[224]. Ωστόσο, έχω γράψει το πρόγραμμα για να αναλύσω τις 16 καταχωρήσεις ενός μόνο τομέα του ριζικού καταλόγου.
Ο τομέας έναρξης του αρχείου έχει υπολογιστεί ως εξής:
j= one.entry[i].starting_cluster+31;
Έχει γίνει επειδή η περιοχή δεδομένων των 1,44 MB, 3 ½ Η δισκέτα ιντσών ξεκινά μετά τους πρώτους 32 τομείς της δισκέτας. Και στη δισκέτα καθορισμένης χωρητικότητας, ένα σύμπλεγμα είναι ενός τομέα.
Ο παρακάτω πίνακας δείχνει τον λογικό χάρτη των 1,44 MB, 3½ δισκέτα ιντσών:
Η έξοδος του προγράμματος εμφανίζεται ως εξής:
Εδώ διαγράψαμε και σκουπίσαμε τα δεδομένα του αρχείου PARTBOOT.C. Όταν βλέπουμε τα περιεχόμενα της δισκέτας με την εντολή DIR, το αρχείο PARTBOOT.C δεν εμφανίζεται εκεί. Όταν εκτελούμε περαιτέρω το πρόγραμμα, η καταχώρηση του διαγραμμένου αρχείου εμφανίζεται ως εξής:
Εδώ, ο χαρακτήρας “” (0xE5), αντιπροσωπεύει ότι το αρχείο έχει διαγραφεί. (δείτε τον πίνακα για τον πρώτο χαρακτήρα του ονόματος αρχείου).
Εάν θέλετε να γράψετε το ίδιο πρόγραμμα για μονάδα σκληρού δίσκου, πρέπει επίσης να χρησιμοποιήσετε τον κατάλογο FAT με root για να λάβετε τις πληροφορίες της περιοχής δεδομένων οποιουδήποτε αρχείου.
Αυτό συμβαίνει επειδή ο ρυθμός κατακερματισμού δεδομένων στις μονάδες σκληρού δίσκου αυξάνεται με την πάροδο του χρόνου καθώς διαγράφονται τα παλαιότερα αρχεία και δημιουργούνται νέο αρχείο. Τότε δεν είναι απαραίτητο όλα τα συμπλέγματα δεδομένων οποιουδήποτε αρχείου στη μονάδα δίσκου να παραμένουν ένα μετά το ένα συνεχώς στην περιοχή δεδομένων. Με την πρόσβαση στο FAT, μπορείτε να αποκτήσετε πρόσβαση σε όλα αυτά τα συμπλέγματα.
Σελίδα Τροποποιήθηκε στις: 18/01/2022