Κεφάλαιο – 14
Προγραμματισμός για την ανάκτηση "Raw File"
Ανάκτηση ακατέργαστου αρχείου
Υπάρχουν πολλοί συγκεκριμένοι τύποι αρχείων που έχουν κάποια συγκεκριμένη ακολουθία ή συνδυασμό χαρακτήρων γραμμένη στην αρχή και στο τέλος του αρχείου. Μπορούμε να αναλύσουμε αυτούς τους συνδυασμούς εύκολα με τη βοήθεια οποιουδήποτε προγράμματος επεξεργασίας δίσκου. Μπορούμε επίσης να χρησιμοποιήσουμε την εντολή EDIT του DOS για να μελετήσουμε τη δομή του αρχείου σε μορφή ASCII.
Η συγκεκριμένη ακολουθία ή συνδυασμός χαρακτήρων που υπάρχει στην αρχή του αρχείου ονομάζεται συνήθως κεφαλίδα και η ακολουθία ή συνδυασμός χαρακτήρων που αποθηκεύεται στο τέλος του αρχείου ονομάζεται υποσέλιδο του αρχείου.
Εάν έχουμε χάσει τα δεδομένα μας σε τέτοιου είδους σφάλμα δίσκου που δεν είναι διαθέσιμες πληροφορίες FAT ή Root Directory για την ανάκτηση των δεδομένων, μπορούμε να χρησιμοποιήσουμε κεφαλίδες και υποσέλιδα για να αναζητήσουμε αυτούς τους συγκεκριμένους τύπους αρχείων. Η κεφαλίδα υποδεικνύει την έναρξη του αρχείου αυτού του συγκεκριμένου τύπου και το υποσέλιδο υποδεικνύει το τέλος του αρχείου του συγκεκριμένου τύπου αρχείου.
Εδώ χρησιμοποιούμε την ακατέργαστη δομή συγκεκριμένου τύπου αρχείου για την ανάκτηση των δεδομένων, επομένως η τεχνική ανάκτησης ονομάζεται Ανάκτηση ακατέργαστου αρχείου. Η επιφάνεια του δίσκου αναζητείται ως τομέας σε τομέα για να βρείτε τις πληροφορίες κεφαλίδας και υποσέλιδου.
Παρόλο που το Raw File Recovery μπορεί να έχει ευρύ πεδίο εφαρμογής, υπάρχουν όμως ορισμένες συγκεκριμένες περιπτώσεις ανάκτησης όπου μπορεί να βοηθήσει πολύ. Για παράδειγμα, κατά λάθος, εάν έχετε εκτελέσει οποιοδήποτε πρόγραμμα σκουπίσματος δεδομένων στο δίσκο που είχε μερικά σημαντικά αρχεία αλλά μέχρι να σταματήσετε το πρόγραμμα, όλες οι πληροφορίες του καταλόγου MBR, DBR, FAT και Root, συμπεριλαμβανομένων των αρχείων του λειτουργικού συστήματος, διαγράφονται.
Σε αυτήν την περίπτωση, ακόμη και τα προγράμματα ανάκτησης μορφοποίησης ενδέχεται να μην σας βοηθήσουν να ανακτήσετε τα δεδομένα. Εδώ μπορείτε να χρησιμοποιήσετε το Raw file Recovery για να ανακτήσετε τα αρχεία αυτών των συγκεκριμένων τύπων αρχείων αναζητώντας τις κεφαλίδες και τα υποσέλιδα.
Όχι μόνο αυτό, ακόμη και εσείς μπορείτε να ανακτήσετε δεδομένα σε τέτοιες περιπτώσεις, όπου έχετε έναν τέτοιο σκληρό δίσκο στον οποίο έχετε διαγράψει όλα τα λογικά διαμερίσματα του δίσκου, έχετε δημιουργήσει εκ νέου τα διαμερίσματα διαφορετικού μεγέθους από πριν και ακόμη και έχετε εγκαταστήσει το λειτουργικό σύστημα.
Τώρα σας θυμάται ότι είχατε κάποια σημαντικά δεδομένα στο δίσκο πριν τον χωρίσετε και μορφοποιήσετε. Εάν μόλις εγκαταστήσατε το λειτουργικό σύστημα, υπάρχουν πολλές πιθανότητες να ανακτηθεί το αρχείο.
Οι παράγοντες που επηρεάζουν την απόδοση της Ανάκτησης Ακατέργαστων Αρχείων είναι τα Κατακερματισμένα δεδομένα και ο όγκος των δεδομένων που αντικαθίστανται από κάποια άλλα δεδομένα. Ωστόσο, μπορείτε μόνοι σας να βρίσκετε όλο και περισσότερους τομείς εφαρμογής για ανάκτηση πρωτογενών αρχείων.
Η διαδικασία ή σχεδόν οι κανόνες αναζήτησης των αρχείων με πρόγραμμα ανάκτησης ακατέργαστων αρχείων λαμβάνουν υπόψη τις ακόλουθες προϋποθέσεις:
- Αναζητήστε την κεφαλίδα του αρχείου ή πολλούς τύπους αρχείων ταυτόχρονα στους τομείς του δίσκου.
- Εάν βρεθεί κεφαλίδα οποιουδήποτε τύπου αρχείου, αποθηκεύστε τα δεδομένα σε ένα αρχείο και ελέγξτε τις ακόλουθες τέσσερις συνθήκες για να κλείσετε και να αποθηκεύσετε το αρχείο
- Βρέθηκε το υποσέλιδο αυτού του τύπου αρχείου
- Βρέθηκε η άλλη κεφαλίδα του ίδιου τύπου αρχείου
- Βρέθηκε η κεφαλίδα άλλου τύπου αρχείου
- Δεν βρέθηκε άλλη κεφαλίδα ή υποσέλιδο για τους καθορισμένους τύπους αρχείων στο πρόγραμμα και το μέγεθος του αρχείου στο οποίο αποθηκεύετε τα δεδομένα φτάνει στο μέγιστο όριο μεγέθους, που καθορίσατε για το μέγεθος αρχείου, στο πρόγραμμά σας.
Οι πληροφορίες θα πρέπει να αποθηκευτούν στο αρχείο, συμπεριλαμβανομένων των δεδομένων των τομέων στους οποίους βρήκατε την κεφαλίδα και τα υποσέλιδα του τύπου αρχείου.
Κεφαλίδες και υποσέλιδα ορισμένων σημαντικών τύπων αρχείων
Οι κεφαλίδες και τα υποσέλιδα ορισμένων σημαντικών τύπων αρχείων έχουν δοθεί στον παρακάτω πίνακα. Τα υποσέλιδα που δίνονται στον πίνακα βρίσκονται είτε στο τέλος του αρχείου του συγκεκριμένου τύπου αρχείου είτε βρίσκονται στις τελικές Μετατοπίσεις του αρχείου έτσι ώστε να μπορείτε να τα χρησιμοποιήσετε ως υποσέλιδα για να ανακτήσετε τα δεδομένα.
Μπορείτε επίσης να αναζητήσετε μόνοι σας κεφαλίδες και υποσέλιδα, διαφορετικά από αυτούς τους τύπους αρχείων, χρησιμοποιώντας την εντολή EDIT του DOS ή χρησιμοποιώντας οποιοδήποτε εργαλείο επεξεργασίας δίσκου. Χρησιμοποίησα το δεκαεξαδικό σύστημα για να αναπαραστήσω τις πληροφορίες για να τις καταλάβω εύκολα.
Επέκταση |
Κεφαλίδα (Hex) |
Υποσέλιδο (Hex) |
DOC |
D0 CF 11 E0 A1 B1 1A E1 |
57 6F 72 64 2E 44 6F 63 75 6D 65 6E 74 2E |
XLS |
D0 CF 11 E0 A1 B1 1A E1 |
FE FF FF FF 00 00 00 00 00 00 00 00 57 00 6F 00 72 00 6B 00 62 00 6F 00 6F 00 6B 00 |
PPT |
D0 CF 11 E0 A1 B1 1A E1 |
50 00 6F 00 77 00 65 00 72 00 50 00 6F 00 69 00 6E 00 74 00 20 00 44 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 |
ZIP |
50 4B 03 04 14 |
50 4B 05 06 00 |
JPG |
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 |
D9 (“Better To Use File size Check”) |
GIF |
47 49 46 38 39 61 4E 01 53 00 C4 |
21 00 00 3B 00 |
PDF |
25 50 44 46 2D 31 2E |
25 25 45 4F 46 |
Σύνταξη προγράμματος για την ανάκτηση ακατέργαστων αρχείων
Η κωδικοποίηση του προγράμματος για την ανάκτηση ακατέργαστων αρχείων των αρχείων Microsoft Word (.DOC Extension) έχει δοθεί στη συνέχεια. Το πρόγραμμα αναζητά τα αρχεία στους τομείς του δίσκου και αποθηκεύει αυτόματα το ανακτηθέν αρχείο δημιουργώντας αυτόματα το όνομα του αρχείου.
Η διαδρομή που καθορίζεται από τον χρήστη για την αποθήκευση των αρχείων χρησιμοποιείται ως διαδρομή προορισμού για την αποθήκευση των ανακτημένων δεδομένων. Εάν ο κατάλογος προορισμού δεν υπάρχει, το πρόγραμμα μπορεί να δημιουργήσει τον προορισμό μέχρι ένα επίπεδο καταλόγου.
Το πρόγραμμα ανάκτησης που δίνεται εδώ υποστηρίζει ακόμη και μεγάλους δίσκους για αναζήτηση και ανάκτηση δεδομένων. Το πρόγραμμα έχει γραφτεί για αναζήτηση των δεδομένων στον δεύτερο φυσικό σκληρό δίσκο.
/* Πρόγραμμα ανάκτησης ακατέργαστων αρχείων για την ανάκτηση των αρχείων Microsoft Word */
#include<stdio.h>
#include<dos.h>
/* Structure to be used by getdrivegeometry function using INT 13H Extension, Function Number 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 */
} ;
/* Structure of Disk Address packet format, to be used by the readabsolutesectors Function */
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 */
i.h.dl = drive; /* Drive Number */
i.x.si = FP_OFF ( (void far*)&g ) ;
s.ds = FP_SEG ( (void far*)&g ) ;
/* Invoke the specified function number of INT 13H extension with Segment Register Values */
int86x ( 0x13, &i, &o, &s ) ;
printf("\n Head = %lu, Sectors Per Track = %lu, Cylinder = %lu\n",
g.heads,g.spt,g.cyl);
/* If get drive Geometry function Fails, Display Error Message and Exit */
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 */
}
unsigned long file_size=0, i=0;
unsigned long start_file=0, end_file=0;
unsigned long Sectors_in_HDD2=0, loop=0;
char buffer[512], filename[80], temp[8];
char path[80];
unsigned int result,num=0;
/* Επικεφαλίδα αρχείων Microsoft Word */
char header[10] = {0xD0,0xCF,0x11,0xE0, 0xA1,0xB1,0x1A,0xE1};
/* Footer of Microsoft Word Files */
char DOC_footer[14] =
{0x57,0x6F,0x72,0x64, 0x2E,0x44,0x6F,0x63,
0x75,0x6D,0x65,0x6E,0x74};
/// Start Of main \\\
void main()
{
clrscr();
/* If total no. of hard disks attached is less
then two, Display Error Message and Exit. */
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 recover the Data of Second Hard Disk.");
printf("\n Press any Key to Exit... ");
getch();
exit(1);
}
Sectors_in_HDD2=getdrivegeometry (0x81);
printf("\n Total Sectors in second Hard Disk = %lu",
Sectors_in_HDD2);
printf("\n\n \"You must save the recovered files in
another Hard Disk, Not in the Same Disk,");
printf("\n in which you are searching the lost
data.\"");
printf("\n\n Enter The Destination Path to save the
Recovered Files...\n ");
gets(path);
/* check if destination directory exists or Not */
if(access(path, 0) != 0)
{
/* if Destination directory does not exist, create
the Directory up to one level */
if(mkdir(path)!=0)
{
printf("\n Could Not Create Directory \"%s\"",
path);
printf("\n Check Path..., Press any key to
exit...");
getch();
exit(1);
}
}
strcat(path,"\\Ptt");
/* Λειτουργία απόκρυψης (και εμφάνισης) δρομέα στην οθόνη */
show_hide_cursor ( 32,
gotoxy(15,18);cprintf("[ %d ] Files Recovered...",
num);
/* search for the data until the ending sector of the disk */
while(loop<Sectors_in_HDD2)
{
/* Read one Sector (Sector No. = loop) */
readabsolutesectors ( 0x81, loop, 1, buffer );
gotoxy(19,16);cprintf("Scanning Sector Number = % ld",
loop);
if(kbhit())
{
show_hide_cursor ( 6, 7 ); /* Retrieve the
cursor before
Exit the program
*/
exit(0);
}
/* if specified header is found */
if((memcmp ( buffer, header,7))==0)
{
/* logic to provide the file name to automatically
create the files to save the recovered data */
strcpy(filename, path);
itoa(num,temp,10);
strcat(filename, temp);
strcat(filename,".DOC");
start_file=loop; /* starting sector of file */
gotoxy(5,19);cprintf("File Found..., Saving As %s",
filename);
num++;
////////////// Συνθήκες κλεισίματος αρχείου \\\\\\\\\\\\\\\\
file_size=0;
while( file_size<5000000)
{
loop++;
file_size+=512;
readabsolutesectors ( 0x81, loop, 1, buffer );
gotoxy(19,16);cprintf("Scanning Sector Number = % ld" ,
loop);
/* if file size reaches up to maximum size of 5MB */
if(file_size>=5000000)
{
end_file=loop; /* Ending Sector of File */
Recover_the_file();/* write the data to file */
break;
}
/* if footer of DOC file is found */
for(i=0;i<512;i++)
{
if( memcmp(buffer+i,DOC_footer,12)==0 )
{
end_file=loop; /* Ending Sector of File */
Recover_the_file();/* write the data to file */
break;
}
}
/* if another header is found */
if( memcmp(buffer,header,7)==0 )
{
loop=loop-1;
end_file=loop; /* Ending Sector of File */
Recover_the_file();/* write the data to file */
break;
}
if(kbhit())
{
show_hide_cursor ( 6, 7 );
exit(0);
}
}
}
loop++;
}
////////Ενώ ο βρόχος τελειώνει εδώ
/* display message for completion of search and recovery */ if(loop>=Sectors_in_HDD2 )
{
gotoxy(17,23);cprintf("The Saving of files in the Disk is
Completed !!");
gotoxy(17,24);cprintf("Press Any Key to Exit...");
show_hide_cursor ( 6, 7 );
getch();
}
}
Η γεωμετρία της δομής χρησιμοποιείται από τη συνάρτηση getdrivegeometry χρησιμοποιώντας την επέκταση INT 13H, Function Number 0x48 για να ληφθούν οι διάφορες παραμέτρους του δίσκου.
Η δομή diskaddrpacket είναι για μορφή πακέτου Διεύθυνσης δίσκου, που θα χρησιμοποιηθεί από τη συνάρτηση readabsolutesectors.
Η συνάρτηση getdrivegeometry (int drive) είναι να λαμβάνει τις παραμέτρους της μονάδας δίσκου της καθορισμένης μονάδας φυσικού αριθμού μονάδας δίσκου.
Το
(char) peekb(0x0040, 0x0075) χρησιμοποιείται για την εύρεση του αριθμού των σκληρών δίσκων που είναι συνδεδεμένοι στον υπολογιστή, που είναι αποθηκευμένοι στη θέση μνήμης που αντιπροσωπεύεται από το τμήμα 0040H:offset 0075H. Εάν ο συνολικός αριθμός των συνδεδεμένων σκληρών δίσκων είναι μικρότερος από δύο Εμφάνιση Μήνυμα Σφάλματος και Έξοδος.
Sectors_in_HDD2=getdrivegeometry (0x81); βρίσκει τις διάφορες παραμέτρους του δεύτερου φυσικού σκληρού δίσκου (0x81) και επιστρέφει τον συνολικό αριθμό τομέων του δίσκου.
Η δήλωση if(access(path, 0) != 0) ελέγχει την προσβασιμότητα της διαδρομής που δίνεται από τον χρήστη. Εάν ο κατάλογος προορισμού δεν υπάρχει, ο προορισμός δημιουργείται μέχρι ένα επίπεδο και εάν η δεδομένη διαδρομή ελέγχεται από τη συνθήκη if(mkdir(path)!=0) είναι παράνομη, εμφανίζεται μήνυμα σφάλματος.
Τα ονόματα αρχείων των αρχείων που δημιουργούνται αυτόματα για την αποθήκευση των ανακτημένων δεδομένων δημιουργούνται έτσι ώστε στους τρεις πρώτους χαρακτήρες των αρχείων να δίνονται PTT από το strcat(path,"\\Ptt"); λειτουργία. Αυτό γίνεται για να αποφευχθούν τα διπλά ονόματα αρχείων στον κατάλογο προορισμού. Επομένως, τα ονόματα αρχείων των ανακτημένων αρχείων δίνονται σε μορφή "PTTxxxxx.DOC"
Η συνάρτηση show_hide_cursor ( 32, 0 ); χρησιμοποιείται για την Απόκρυψη του δρομέα από την οθόνη όπου show_hide_cursor ( 6, 7 ); ανακτά τον κέρσορα πίσω στην οθόνη.
Η συνάρτηση readabsolutesectors (0x81, βρόχος, 1, buffer). Διαβάζει έναν τομέα του δεύτερου φυσικού σκληρού δίσκου που καθορίζεται από τον βρόχο αριθμού τομέα.
Εάν βρεθεί η κεφαλίδα του αρχείου, start_file = βρόχος; ορίζει το αρχείο start_file στον αρχικό αριθμό τομέα του αρχείου που πρόκειται να ανακτηθεί. Το πρόγραμμα ακολουθεί τις τρεις συνθήκες που δίνονται στη συνέχεια, για να βρει τον τελικό τομέα του αρχείου:
- Εάν το μέγεθος του αρχείου φτάσει το μέγιστο μέγεθος των 5 MB
- Εάν βρεθεί υποσέλιδο αρχείου DOC
- Εάν βρεθεί άλλη κεφαλίδα
Ο μεγάλος ακέραιος end_file ορίζεται στον τελικό τομέα του αρχείου από το end_file=loop. εάν ικανοποιείται μία από τις τρεις προϋποθέσεις. Τώρα τα δεδομένα των τομέων, ξεκινώντας από τον αριθμό τομέα start_file έως τον αριθμό τομέα end_file αποθηκεύονται στο αρχείο με τη συνάρτηση Recover_the_file( ).
Η κωδικοποίηση της συνάρτησης Recover_the_file( ) έχει δοθεί στη συνέχεια:
/* Λειτουργία αποθήκευσης των δεδομένων των τομέων ξεκινώντας από τον αριθμό τομέα start_file έως τον αριθμό τομέα end_file */
Recover_the_file()
{
FILE *fp;
if((fp=fopen(filename, "wb"))==NULL)
{
gotoxy(10,23);printf("Error Opening File %s",
filename);
getch();
exit(1);
}
for(i=start_file;i<=end_file;i++)
{
gotoxy(19,16);cprintf("Scanning Sector Number =
%ld", i);
readabsolutesectors ( 0x81, i, 1, buffer );
fwrite(buffer,512,1, fp);
}
fclose(fp);
gotoxy(15,18);cprintf("[ %d ] Files Recovered...",num);
gotoxy(5,19);cprintf(" ");
return;
}
Η κωδικοποίηση της συνάρτησης readabsolutesectors έχει δοθεί στη συνέχεια. Η συνάρτηση χρησιμοποιεί την επέκταση INT 13H και τον αριθμό συνάρτησης 42H για την ανάγνωση των τομέων.
Για τη λεπτομερή περιγραφή της λειτουργίας, ανατρέξτε στο κεφάλαιο «Δημιουργία αντιγράφων ασφαλείας» που συζητήθηκε νωρίτερα σε αυτό το βιβλίο. Η κωδικοποίηση της συνάρτησης είναι η εξής:
//// Λειτουργία ανάγνωσης απόλυτων τομέων \\\\
int readabsolutesectors ( 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 read */
/* for Data buffer */
pp.bufferaddress = (char far*) MK_FP ( FP_SEG((void far*)buffer), FP_OFF((void far*)buffer));
pp.blocknumber[0] = sectornumber ; /* Sector number
to read */
pp.blocknumber[1] = 0 ; /* Block number */
i.h.ah = 0x42 ; /* Function Number*/
i.h.dl = drive ; /* Physical Drive Number */
/* ds:si for buffer Parameters */
i.x.si = FP_OFF ( (void far*)&pp ) ;
/* ds:si for buffer Parameters */
s.ds = FP_SEG ( (void far*)&pp ) ;
/* Invoke the specified Function of INT 13H with
segment register values */
int86x ( 0x13, &i, &o, &s ) ;
if ( o.x.cflag==1)
return 0 ; //failure
else
return 1 ; // success
}
Η παρακάτω λειτουργία χρησιμοποιείται για την απόκρυψη ή την εμφάνιση του δρομέα στην οθόνη. Η συνάρτηση χρησιμοποιεί το Interrupt 10H, Function 01H για να ορίσει τον τύπο του δρομέα. Η κωδικοποίηση έχει ως εξής:
show_hide_cursor( ssl, esl )
int ssl, esl ;
{
union REGS i, o ;
i.h.ah = 1 ;
i.h.ch = ssl ;
i.h.cl = esl ;
i.h.bh = 0 ;
int86 ( 16, &i, &o ) ;
return;
}
Το show_hide_cursor( 32, 0 ) αποκρύπτει τον κέρσορα και το show_hide_cursor ( 6, 7 ) ανακτά τον δρομέα. Το ssl είναι η γραμμή έναρξης για τον δρομέα και η esl είναι η γραμμή λήξης για τον δρομέα.
Η μικρή περιγραφή της συνάρτησης 01H του INT 10H είναι η εξής:
INT 10H (16 or 0x10)
Function 01H (or 0x01) --> Set Cursor Type
Call with: AH = 01H
CH bits 0-4 = starting line for cursor
CL bits 0-4 = ending line for cursor
Returns: Nothing.
Comments:
Η λειτουργία χρησιμοποιείται για να ορίσετε τον τύπο του δρομέα επιλέγοντας τις γραμμές έναρξης και λήξης για τον δρομέα υλικού που αναβοσβήνει στη λειτουργία εμφάνισης κειμένου. Στις λειτουργίες γραφικών, ο δρομέας υλικού δεν είναι διαθέσιμος.
Σελίδα Τροποποιήθηκε στις: 17/01/2022