Κεφάλαιο – 15
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΙΑ ΚΑΘΑΡΙΣΤΕΣ ΔΕΔΟΜΕΝΩΝ
Εισαγωγή
Έχουμε ήδη συζητήσει ότι όταν διαγράφετε οποιοδήποτε αρχείο από έναν δίσκο, οι πληροφορίες δεν διαγράφονται πλήρως από το δίσκο, αλλά επισημαίνονται ως διαθέσιμες για εγγραφή νέων δεδομένων σε αυτόν.
Όταν διαμορφώνουμε έναν δίσκο, όλες οι πληροφορίες σχετικά με τα αρχεία και τους καταλόγους του δίσκου, όπως οι εγγραφές καταλόγου FAT και ριζικού καταλόγου, διαγράφονται, αλλά η περιοχή δεδομένων παραμένει αμετάβλητη και τίποτα από την περιοχή δεδομένων του δίσκου δεν διαγράφεται. Τα δεδομένα που διαγράφονται ή μορφοποιούνται από το λειτουργικό σύστημα παραμένουν στην περιοχή δεδομένων ως έχουν και μπορούν να ανακτηθούν με ορισμένες προσπάθειες ανάκτησης δεδομένων και λογισμικό ανάκτησης δεδομένων.
Επομένως, η ανάγκη για πλήρη διαγραφή δεδομένων από το δίσκο οδηγεί στην ανάγκη για ένα πρόγραμμα που διαγράφει πλήρως τα δεδομένα από το δίσκο. Για να γίνει αυτό, δεν αρκεί απλώς να διαγράψετε αρχεία ή απλά να μορφοποιήσετε το δίσκο, τα δεδομένα στο δίσκο πρέπει να αντικατασταθούν με άλλα δεδομένα.
Τα προγράμματα που χρησιμοποιούνται για την πλήρη διαγραφή δεδομένων από έναν δίσκο είναι γνωστά ως προγράμματα διαγραφής δεδομένων. Αυτά τα προγράμματα γράφουν τυχαίους χαρακτήρες στην περιοχή δεδομένων για να αντικαταστήσουν τα δεδομένα και να διαγράψουν όλες τις πληροφορίες που είχαν αποθηκευτεί προηγουμένως στο δίσκο.
Όταν τα δεδομένα γίνονται εντελώς μη ανακτήσιμα
Για να διαγράψετε δεδομένα, η περιοχή δεδομένων στο δίσκο πρέπει να αντικατασταθεί με άλλα δεδομένα, αλλά το πρόβλημα δεν τελειώνει εκεί. Για να περιπλέξει περαιτέρω τα πράγματα, η τάση των μαγνητικών δίσκων να θυμούνται δεδομένα που έχουν αντικατασταθεί απαιτεί τα δεδομένα να αντικαθίστανται πολλές φορές με τυχαίες ακολουθίες δεδομένων, έτσι ώστε να μην μπορούν να ανακτηθούν ακόμη και με εξελιγμένα εργαλεία ανάκτησης δεδομένων.
Αυτό συμβαίνει επειδή σήμερα υπάρχουν διαθέσιμες τεχνολογίες που επιτρέπουν την ανάκτηση δεδομένων ακόμα και μετά τη χρήση κάποιων απλών εργαλείων διαγραφής δεδομένων.
Ορισμένα προϊόντα διαγραφής δεδομένων αντικαθιστούν τα δεδομένα με δυαδικά μηδενικά και δυαδικά. Η εγγραφή μιας σειράς δυαδικών μηδενικών και δυαδικών παρέχει το βαθύτερο αποτέλεσμα επανεγγραφής, καθώς αυτές οι τιμές είναι οι ελάχιστες και οι μέγιστες μαγνητικές τιμές, αντίστοιχα.
Αν και αυτή είναι η θεωρία του ιδανικού προγράμματος διαγραφής δεδομένων, αλλά γενικά, αρκεί η αντικατάσταση των δεδομένων με έναν τυχαίο χαρακτήρα ASCII. Ο λόγος που το λέμε αυτό είναι ότι η ανάκτηση με εξελιγμένα εργαλεία και τεχνολογίες ανάκτησης δεν μπορεί να χρησιμοποιηθεί για την ανάκτηση δεδομένων οποιουδήποτε οργανισμού για ανάκτηση δεδομένων ρουτίνας, καθώς αυτές οι τεχνολογίες είναι πολύ ακριβές και κοστίζουν εκατομμύρια ακόμη και για μία μόνο ανάκτηση. Όχι μόνο αυτό, αλλά αυτές οι τεχνολογίες είναι διαθέσιμες μόνο σε λίγες χώρες σε όλο τον κόσμο.
Θα συζητήσουμε μόνο την απλή αντικατάσταση δεδομένων για τη διαγραφή δεδομένων από το δίσκο. Ωστόσο, μπορείτε να τροποποιήσετε περαιτέρω τα ίδια προγράμματα για να γράφετε μόνο τυχαίους χαρακτήρες με λίγη προσπάθεια. Τα δεδομένα που διαγράφονται από αυτήν την ιδέα επίσης δεν μπορούν να ανακτηθούν από κανένα λογισμικό ανάκτησης δεδομένων.
Γιατί είναι τόσο σημαντική η διαγραφή δεδομένων;
Όταν συζητάμε μεθόδους ανάκτησης δεδομένων, διαβεβαιώνουμε τον χρήστη ότι τα δεδομένα μπορούν να ανακτηθούν με ορισμένες γενικές ή ειδικές προσπάθειες ανάκτησης δεδομένων. Αλλά η ανάκτηση δεδομένων δεν είναι πάντα μια επιθυμητή και αναμενόμενη λειτουργία για όλους.
Μπορεί να υπάρχουν πολλά άτομα ή οργανισμοί που είναι πάντα έτοιμοι να διαγράψουν τα δεδομένα στο δίσκο τους με τέτοιο τρόπο ώστε να μην μπορούν να ανακτηθούν με κανέναν τρόπο. Σε τέτοιες περιπτώσεις, ο δίσκος ενδέχεται να περιέχει προηγουμένως πολύ ευαίσθητα δεδομένα που, εάν πέσει σε λάθος χέρια, θα μπορούσαν να προκαλέσουν βλάβη στον οργανισμό ή τον χρήστη λόγω ακατάλληλης χρήσης των πληροφοριών.
Όπως γνωρίζουμε, η ανάγκη για όλο και περισσότερο χώρο στον σκληρό δίσκο αυξάνεται καθημερινά. Ως αποτέλεσμα, οι παλιοί δίσκοι χαμηλής χωρητικότητας αντικαθίστανται από νέους δίσκους υψηλής χωρητικότητας σε μεγάλη κλίμακα κάθε χρόνο σχεδόν σε κάθε οργανισμό. Εάν αυτοί οι παλιοί δίσκοι πέσουν σε λάθος χέρια, θα μπορούσε να δημιουργήσει ένα πολύ σοβαρό πρόβλημα για αυτόν τον οργανισμό.
Σύμφωνα με μια είδηση που δημοσιεύτηκε από το CNET News.com στις 16 Ιανουαρίου 2003, οι φοιτητές του MIT Simon Garfinkel και Abby Shelat αγόραζαν παλιούς σκληρούς δίσκους για ερευνητικούς σκοπούς από το Διαδίκτυο και άλλες πωλήσεις μεταχειρισμένων μονάδων δίσκου για να αποκτήσουν πρόσβαση σε τεράστιες ποσότητες προσωπικών πληροφοριών που οι άνθρωποι δεν μπαίνουν στον κόπο να διαγράψουν.
Αφού αγόρασαν 158 δίσκους για περίπου 1000 $, κατάφεραν να συλλέξουν πάνω από 5000 αριθμούς πιστωτικής κάρτας, ιατρικά αρχεία, λεπτομερείς προσωπικές και εταιρικές οικονομικές πληροφορίες και αρκετά gigabyte e-mail, πηγαίους κώδικες και άλλες πληροφορίες.
Το ζευγάρι αυτών των μαθητών συγκέντρωσε τα ευρήματά του σε μια έκθεση με τίτλο "Remembrance of Data Passed: A Study of Disk Sanitation" που δημοσιεύτηκε στην έκδοση Φεβρουαρίου του IEEE Security and Privacy.
Τα κύρια σημεία που προέκυψαν από την έρευνα είναι ότι η αγορά μεταχειρισμένων σκληρών δίσκων είναι γεμάτη με προσωπικές πληροφορίες που καθιστούν πολύ εύκολο για έναν κακόβουλο αγοραστή να υποθέσει την ταυτότητα κάποιου άλλου.
Πρόγραμμα εγγραφής για μη καταστρεπτικό υαλοκαθαριστήρα δεδομένων
Ο μη καταστρεπτικός υαλοκαθαριστήρας δεδομένων είναι ένα είδος προγράμματος σκουπίσματος δεδομένων με το οποίο μπορούμε να σκουπίσουμε ολόκληρο τον «μη εκχωρημένο χώρο» του όγκου του δίσκου, χωρίς να βλάψουμε τα δεδομένα που είναι αποθηκευμένα στο δίσκο, με οποιονδήποτε τρόπο.
Το πεδίο εφαρμογής ενός τέτοιου υαλοκαθαριστήρα δεδομένων είναι στις περιπτώσεις όπου θέλετε να διαγράψετε όλο τον μη εκχωρημένο χώρο του τόμου του δίσκου ενώ τα εκχωρημένα δεδομένα που είναι αποθηκευμένα στον τόμο θα πρέπει να παραμείνουν ανέγγιχτα. Αυτός ο τύπος προγράμματος σκουπίσματος δεδομένων διαγράφει επίσης την περιοχή δεδομένων των διαγραμμένων αρχείων.
Η κωδικοποίηση προγράμματος για έναν τύπο μη καταστρεπτικού προγράμματος σκουπίσματος δεδομένων έχει δοθεί στη συνέχεια:
///// Πρόγραμμα για έναν μη καταστρεπτικό υαλοκαθαριστήρα δεδομένων \\\\\
#include <stdio.h>
ανυπόγραφο int file_num=0; /* Παρέχει τον αριθμό αρχείου
Κατά την Αυτόματη Δημιουργία
των προσωρινών αρχείων δεδομένων */
κατάσταση float=0; /* Πόσος είναι ο χώρος στο δίσκο
ακόμα γραμμένο */
στατικό char dbuf[40000]; /* Data Buffer για εγγραφή
Προσωρινά αρχεία με */
char file_extension[5]=".ptt";/* Μοναδικές επεκτάσεις για
Προσωρινά Αρχεία */
char temp[5]; /* Ο αριθμός αρχείου μετατράπηκε σε
Συμβολοσειρά */
όνομα αρχείου char[40]; /* Όνομα προσωρινού αρχείου */
void main()
{
ανυπόγραφο int i=0;
clrscr();
ενώ (i<40000)
{
dbuf[i] = ' ';
i++;
}
gotoxy(10,14);cprintf(" MB ακόμα γραμμένο...");
ενώ (1)
{
/* Λογική για αυτόματη δημιουργία προσωρινών αρχείων με μοναδικό όνομα */
strcpy(όνομα αρχείου"TTPT");
itoa(αριθμός_αρχείου, θερμοκρασία, 10);
strcat(όνομα αρχείου, temp);
strcat(όνομα αρχείου,επέκταση_αρχείου);
file_num++;
write_to_temp(όνομα αρχείου);
}
} //// Τέλος κύριας \\\\
///// Λειτουργία εγγραφής των δεδομένων στο προσωρινό αρχείο \\\\\
write_to_temp(char *όνομα αρχείου)
{
ανυπόγραφο int i, count=1;
float buf_status=0;
ΑΡΧΕΙΟ *tt;
if((tt=fopen(όνομα αρχείου,"wb"))==NULL)
{
fclose(tt);
printf("\n Παρουσιάστηκε σφάλμα κατά τη δημιουργία προσωρινού
αρχείο, ");
printf("\n Αφαίρεση προσωρινών αρχείων μετά το KEY BOARD
ΕΠΙΤΥΧΙΑ");
getch();
remove_temp_file();/* Κατάργηση όλων των προσωρινών αρχείων */
}
ενώ (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)(κατάσταση/1000000));
if(kbhit())
{
fclose(tt);
printf("\n Αφαίρεση προσωρινών αρχείων, παρακαλώ
Περιμένετε...");
remove_temp_file();
}
if(buf_status>=10000)
{
fclose(tt);
απόδοση;
}
}
}
/* Λειτουργία για αυτόματη διαγραφή των προσωρινών αρχείων */
remove_temp_file()
{
int i=0;
for(i=0;i<=αρχείο_αριθμός;i++)
{
strcpy(όνομα αρχείου"TTPT");
this(i,temp,10);
strcat(όνομα αρχείου, temp);
strcat(όνομα αρχείου,επέκταση_αρχείου);
αφαιρέστε(όνομα αρχείου);
}
exit(1);
επιστροφή 0;
}
Σχόλια για τη λογική και την κωδικοποίηση του προγράμματος:
Σε αυτό το πρόγραμμα βασικά ακολουθούμε τα ακόλουθα δύο βήματα για να σκουπίσουμε τον μη εκχωρημένο χώρο του δίσκου:
- Αυτόματη δημιουργία προσωρινών αρχείων δεδομένων: Πρώτα δημιουργούμε προσωρινά αρχεία με μοναδικά ονόματα και με ορισμένα δεδομένα σε αυτά μέχρι να γεμίσει ο όγκος του δίσκου με αυτά τα προσωρινά αρχεία δεδομένων. Με αυτόν τον τρόπο, όλη η περιοχή μη εκχωρημένων δεδομένων της λογικής μονάδας δίσκου καταλαμβάνεται από τα δεδομένα των προσωρινών αρχείων και όλα τα μη εκχωρημένα δεδομένα αντικαθίστανται.
Για να το κάνω αυτό, επέλεξα τα ονόματα των προσωρινών αρχείων σε μορφή TTPTxxxx.PTT, που σημαίνει ότι οι τέσσερις πρώτοι χαρακτήρες των προσωρινών αρχείων είναι TTPT και η επέκταση των αρχείων είναι .PTT. Αυτό γίνεται για να παρέχει στα προσωρινά αρχεία τα μοναδικά ονόματα αρχείων.
Έχω ορίσει το μέγιστο μέγεθος του μεμονωμένου προσωρινού αρχείου, που ισοδυναμεί με περίπου 11.718 δεδομένα τομέων, ωστόσο μπορείτε να το ορίσετε σύμφωνα με εσάς. Επέλεξα τον χαρακτήρα διαστήματος " " (χαρακτήρας 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. */
γεωμετρία κατασκευής
{
ανυπόγραφο μέγεθος int ; /* (κλήση) μέγεθος buffer */
ανυπόγραφες σημαίες int ; /* Σημαίες πληροφοριών */
ανυπόγραφο μακρύ κύλινδρο ; /* Αριθμός φυσικών κυλίνδρων ενεργοποιημένος
Οδηγήστε */
ανυπόγραφες μακριές κεφαλές ;/* Αριθμός φυσικών κεφαλών
Οδηγήστε */
ανυπόγραφο long spt ; /* Αριθμός Φυσικών Τομέων Ανά
Κομμάτι */
ανυπόγραφοι μακροί τομείς[2] ; /* Συνολικός αριθμός των
Τομείς στο Drive */
ανυπόγραφο int bps ; /* Bytes ανά τομέα */
} ;
/* Δομή της μορφής πακέτου διεύθυνσης δίσκου, για χρήση από τη συνάρτηση writeabsolutesectors */
struct diskaddrpacket
{
char packetsize ; /* Μέγεθος πακέτου,
γενικά 10 ώρες */
char κρατημένο ; /* Κράτηση (0) */
int blockcount ; /* Αριθμός μπλοκ προς
Μεταφορά */
char far *bufferaddress ; /* διεύθυνση στο Transfer
Buffer */
ανυπόγραφος μακρύς αριθμός μπλοκ[2] ; /* Απόλυτο εκκίνησης
Αριθμός μπλοκ */
} ;
///// Λειτουργία για λήψη παραμέτρων μονάδας δίσκου \\\\\
ανυπόγραφο long getdrivegeometry (int drive)
{
ένωση REGS i, o ;
struct SREGS s ;
γεωμετρία δομής g = { 26, 0, 0, 0, 0, 0, 0, 0 } ;
ihah = 0x48 ; /* Αριθμός συνάρτησης 0x48 του INT 13H
Επεκτάσεις */
ihdl = οδηγώ; /* Αριθμός μονάδας */
ixsi = FP_OFF ( (κενό μακριά*)&g ) ;
s.ds = FP_SEG ( (κενό μακριά*)&g ) ;
/* Κλήση του καθορισμένου αριθμού συνάρτησης της επέκτασης INT 13H με τιμές καταχώρησης τμήματος */
int86x ( 0x13, &i, &o, &s );
printf("\n Κεφαλή = %lu, Τομείς ανά ίχνος = %lu, κύλινδρος =
%lu\n",
g.heads,g.spt,g.cyl);
/* Εάν αποτύχει η συνάρτηση γεωμετρίας λήψης μονάδας δίσκου, Εμφάνιση μηνύματος σφάλματος και έξοδος */
if(g.spt==0)
{
printf("\n Λήψη της συνάρτησης γεωμετρίας μονάδας δίσκου αποτυγχάνει...");
printf("\n Οι επεκτάσεις δεν υποστηρίζονται, πατήστε οποιοδήποτε πλήκτρο για
Εξοδος...");
getch();
exit(1);
}
επιστροφή *g.sectors; /* Επιστροφή Ο αριθμός των
Τομείς στο Drive */
}
void main()
{
unsigned long loop=0, Sectors_in_ HDD2=0;
ανυπόγραφο buffer χαρακτήρων[61440]; /* Προσωρινή μνήμη δεδομένων 61440
bytes Ισοδυναμεί με
120 Τομείς */
ανυπόγραφο μακρύ i=0;
char επιλογή?
clrscr();
/* Εάν ο συνολικός αριθ. των συνδεδεμένων σκληρών δίσκων είναι λιγότερο από δύο Εμφάνιση Μήνυμα Σφάλματος και Έξοδος. */
if(((char)peekb(0x0040, 0x0075))<2)
{
printf("\n\n Πρέπει να έχετε τουλάχιστον δύο σκληρούς δίσκους
Συνημμένο στον υπολογιστή σας για να το εκτελέσετε");
printf("\n Πρόγραμμα. Αυτό το Πρόγραμμα έχει αναπτυχθεί
για να σκουπίσετε τα δεδομένα του δεύτερου σκληρού δίσκου.");
printf("\n Πατήστε οποιοδήποτε πλήκτρο για έξοδο...");
getch();
exit(1);
}
Sectors_in_HDD2 = getdrivegeometry (0x81);
printf(" Σύνολο τομείς σε δεύτερο σκληρό δίσκο =
%lu\n\n",
Sectors_in_HDD2);
///// Πρώτα Επιβεβαίωση και μετά Συνέχεια \\\\\
printf("\n Είναι ένα πρόγραμμα σκουπίσματος δεδομένων και εγγράφει
την επιφάνεια του δίσκου");
printf("\n Μετά την εκτέλεση αυτού του προγράμματος, τα δεδομένα δεν μπορούν
να ανακτηθεί από οποιοδήποτε Λογισμικό");
printf("\n Όλα τα δεδομένα στον δεύτερο σκληρό δίσκο θα είναι
χαμένος!!!");
printf("\n Πατήστε \'Y\' για Συνέχεια, αλλιώς οποιοδήποτε πλήκτρο για
Έξοδος...");
επιλογή = getche();
διακόπτης (επιλογή)
{
περίπτωση 'y':
περίπτωση 'Y':
διακοπή;
αθέτηση:
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("Τώρα Σκουπίζω τον απόλυτο τομέα: ");
for(loop=0;loop<= Sectors_in_HDD2;loop=loop+120)
{
writeabsolutesectors (0x81, βρόχος, 120, buffer);
gotoxy(44,15); printf("%ld",loop);
if(kbhit())
{
exit(0);
}
///// Εμφάνιση μηνύματος όταν ολοκληρωθεί \\\\\
printf("\n\n Η διαγραφή δεδομένων έχει πλέον ολοκληρωθεί, όλα τα δεδομένα εισέρχονται
Ο δεύτερος σκληρός δίσκος είναι τώρα");
printf("\n Διαγράφηκε πλήρως, πατήστε οποιοδήποτε πλήκτρο για έξοδο...");
getch();
}
//// Συνάρτηση για τη γραφή απόλυτων τομέων \\\\
int writeabsolutesectors (int drive, unsigned long sectionnumber, int numofsectors, void *buffer )
{
ένωση REGS i, o ;
struct SREGS s ;
struct diskaddrpacket pp ;
pp.packetsize = 16 ; /* Μέγεθος πακέτου = 10 H */
pp.reserved = 0 ; /* Κράτηση = 0 */
pp.blockcount = numofsectors ;/* Αριθμός τομέων προς
να γραφτεί */
/* για προσωρινή μνήμη δεδομένων */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = αριθμός τομέα ; /* Αριθμός τομέα
να γραφτεί*/
pp.blocknumber[1] = 0 ; /* Αριθμός μπλοκ = 0 */
ihah = 0x43 ; /* Αριθμός συνάρτησης */
ihal = 0x00 ; /* Γράψτε σημαίες */
ihdl = drive ; /* Φυσική κίνηση
αριθμός */
ixsi = FP_OFF ( (κενό μακριά*)&pp ) ; /* ds:si for
buffer παράμετροι */
s.ds = FP_SEG ( (κενό μακριά*)&pp ) ; /* ds:say for
buffer παράμετροι */
/* Κλήση της καθορισμένης συνάρτησης του INT 13H με τιμές καταχωρητή τμημάτων */
int86x ( 0x13, &i, &o, &s );
αν ( oxcflag==1)
επιστροφή 0 ; //αποτυχία
αλλού
επιστροφή 1 ; // επιτυχία
}
Σχόλια σχετικά με την κωδικοποίηση:
Η γεωμετρία της δομής χρησιμοποιείται από τη συνάρτηση 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, βρόχος, 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 καταχώρισης αρχείου στον κατάλογο ρίζας \\\\\
ρίζα δομής
{
ανυπόγραφο όνομα αρχείου char[8]; /* Όνομα αρχείου Καταχώρηση του
8 byte */
ανυπόγραφη επέκταση χαρακτήρων[3]. /* Επέκταση αρχείου του
3 byte */
ανυπόγραφο χαρακτηριστικό char. /* Byte χαρακτηριστικού αρχείου */
δεσμευμένος ανυπόγραφος χαρακτήρας[10]; /* Δεσμευμένα byte 10 */
ανυπόγραφο int time? /* Χρόνος, 2 Byte */
ανυπόγραφη ημερομηνία /* Ημερομηνία, 2 Byte */
ανυπόγραφο int starting_cluster;/* Εκκίνηση συμπλέγματος αρχείων,
2 byte */
ανυπόγραφο μεγάλο_μέγεθος αρχείου. /* Μέγεθος αρχείου σε Byte,
4 Byte */
};
/* Θα πρέπει να ληφθεί αυτό για να διαβάσετε όλες τις καταχωρήσεις καταλόγου ρίζας */
//καταχώριση ρίζας δομής[224];
/* Δομή για ανάγνωση και των 16 εγγραφών αρχείων σε έναν τομέα του καταλόγου ρίζας */
struct one_root_sector
{
Καταχώρηση ρίζας δομής[16];
};
struct one_root_sector one;
void main()
{
int αποτέλεσμα, i, num_sectors,j;
char wipe_buf[512]; /* Η προσωρινή μνήμη δεδομένων θα χρησιμοποιηθεί για σκούπισμα
έξω την περιοχή δεδομένων του αρχείου */
clrscr();
result= absread(0x00, 1, 19, &one); /* Διαβάστε τον Απόλυτο Τομέα
19 (First Sector of Root Directory) */
αν (αποτέλεσμα != 0)
{
error("Σφάλμα στον τομέα ανάγνωσης, πατήστε οποιοδήποτε πλήκτρο για
Εξοδος...");
getch();
exit(1);
}
/* Εμφάνιση πληροφοριών αρχείων μετά την ανάγνωση από τον ριζικό κατάλογο */
printf(" ΑΡΙΘΜΟΣ ΑΡΧΕΙΟΥ. ΕΠΕΚΤΑΣΗ ΟΝΟΜΑ ΑΡΧΕΙΟΥ ΕΝΑΡΞΗ ΣΥΜΠΟΥΛΟΣ
FILESIZE \n\n");
for(i=1;i<16;i++)
{
printf("\n %5d %8.8s %3.3s %5u %10lu ",
i, one.entry[i].όνομα αρχείου, one.entry[i].επέκταση,
one.entry[i].starting_cluster, one.entry[i].file_size);
}
//// Λήψη εισόδου χρήστη για διαγραφή του αρχείου \\\\
printf("\n\n Εισαγάγετε τον αριθμό αρχείου, που θέλετε να διαγράψετε και
Σκουπίστε εντελώς ");
scanf("%d", &i);
if(i<1 || i>15)
{
printf(" \"%d\" είναι μια μη έγκυρη επιλογή..., Πατήστε οποιοδήποτε
Κλειδί για την έξοδο...", i);
getch();
exit(1);
}
///// Πρώτα Επιβεβαίωση, Μετά Συνέχεια \\\\\\
printf("\n Πρόκειται να σβήσετε,
Το αρχείο \"%.8s.%s\"",
one.entry[i].όνομα αρχείου,
one.entry[i].επέκταση);
printf("\n Θέλετε να συνεχίσετε...(ΝΑΙ)");
διακόπτης(getche())
{
περίπτωση 'y':
περίπτωση 'Y':
διακοπή;
αθέτηση:
exit(0);
}
///// Υπολογισμός του μεγέθους του αρχείου σε τομείς \\\\\
num_sectors = one.entry[i].file_size/512;
if((one.entry[i].file_size%512)>0)
{
num_sectors = num_sectors+1;
}
/* Buffer δεδομένων 512 byte με 512 NULL χαρακτήρες */
for(j=0;j<512;j++)
{
wipe_buf[j] = '\0';
}
///// Τομέας έναρξης του αρχείου \\\\\
j= one.entry[i].starting_cluster+31;
/* Διαγράψτε την περιοχή δεδομένων μέχρι να τελειώσουν οι τομείς του αρχείου */
пока(j!=(one.entry[i].starting_cluster +
αριθμός_τομέων+31) )
{
if((abswrite(0x00, 1, j, &wipe_buf))!=0)
{
printf("\n Σφάλμα εγγραφής σε τομείς δίσκου");
παίρνω();
έξοδος (0);
}
j++;
}
printf("\n\n Αρχείο \"%.8s.%.3s\" Διαγράφηκε !!!" ,
one.entry[i].όνομα_αρχείου,
one.entry[i].extension);
one.entry[i].attribute = 0; /* Ορισμός χαρακτηριστικού αρχείου
έως 0 */
one.entry[i].time = 0; /* Εκκαθάριση πληροφοριών ώρας
αρχείο */
one.entry[i].date = 0; /* Εκκαθάριση πληροφοριών ημερομηνίας
αρχείο */
one.entry[i].starting_cluster = 0; /* Ορίστε το αρχικό σύμπλεγμα σε 0
*/
one.entry[i].file_size = 0; /* Ορίστε το μέγεθος αρχείου σε 0 */
one.entry[i].όνομα αρχείου[0]=0xE5; /* Δώστε τηλεχειριστήριο
Κατάσταση αρχείου στο αρχείο */
///// Γράψτε τις παραπάνω πληροφορίες στον ριζικό κατάλογο \\\\\\
αποτέλεσμα = abswrite(0x00, 1, 19, &one);
αν (αποτέλεσμα != 0)
{
perror("Σφάλμα κατά την ανάγνωση τομέα, πατήστε οποιοδήποτε πλήκτρο για
Εξοδος...");
παίρνω();
έξοδος(1);
}
}
Σχόλια σχετικά με τη λογική και την κωδικοποίηση του προγράμματος:
Η δομή ρίζας χρησιμοποιείται για την ανάγνωση 32 byte μιας καταχώρισης αρχείου στον ριζικό κατάλογο και η δομή one_root_sector διαβάζει και τις 16 εγγραφές αρχείων σε έναν τομέα του ριζικού καταλόγου.
Εάν θέλετε να διαβάσετε όλους τους τομείς των πληροφοριών του ριζικού καταλόγου, θα πρέπει να τις λάβετε ως καταχώρηση ρίζας[224] δομής. Ωστόσο, έγραψα ένα πρόγραμμα για την ανάλυση 16 εγγραφών ενός μόνο τομέα του ριζικού καταλόγου.
Ο αρχικός τομέας του αρχείου υπολογίζεται ως εξής:
j= one.record[i].initial_cluster+31;
Αυτό γίνεται επειδή η περιοχή δεδομένων μιας δισκέτας 1,44 MB, 3 ½ ιντσών ξεκινά μετά τους πρώτους 32 τομείς του δίσκου. Και σε μια δισκέτα της καθορισμένης χωρητικότητας, ένα σύμπλεγμα αντιστοιχεί σε έναν τομέα.
Ο παρακάτω πίνακας δείχνει τον λογικό χάρτη μιας δισκέτας 1,44 MB, 3½ ιντσών:

Το αποτέλεσμα του προγράμματος εμφανίζεται ως εξής:

Εδώ έχουμε διαγράψει και διαγράψει τα δεδομένα του αρχείου PARTBOOT.C. Όταν βλέπουμε τα περιεχόμενα της δισκέτας χρησιμοποιώντας την εντολή DIR, το αρχείο PARTBOOT.C δεν εμφανίζεται εκεί. Όταν το πρόγραμμα εκτελείται περαιτέρω, η καταχώρηση για το διαγραμμένο αρχείο εμφανίζεται ως εξής:

Εδώ το σύμβολο "" (0xE5) σημαίνει ότι το αρχείο έχει διαγραφεί. (δείτε τον πίνακα για τον πρώτο χαρακτήρα του ονόματος αρχείου).
Εάν θέλετε να γράψετε το ίδιο πρόγραμμα για σκληρό δίσκο, πρέπει επίσης να χρησιμοποιήσετε το FAT με τον ριζικό κατάλογο για να λάβετε τις πληροφορίες σχετικά με την περιοχή δεδομένων οποιουδήποτε αρχείου.
Αυτό συμβαίνει επειδή ο ρυθμός κατακερματισμού δεδομένων στους σκληρούς δίσκους αυξάνεται με την πάροδο του χρόνου καθώς διαγράφονται παλιά αρχεία και δημιουργούνται νέα. Τότε δεν χρειάζεται όλα τα συμπλέγματα δεδομένων οποιουδήποτε αρχείου στο δίσκο να παραμένουν το ένα μετά το άλλο συνεχόμενα στην περιοχή δεδομένων. Με την πρόσβαση στο FAT, μπορείτε να αποκτήσετε πρόσβαση σε όλα αυτά τα συμπλέγματα.