Kapitel – 14
Programmierung für die „Raw File“-Wiederherstellung
Wiederherstellung von Raw-Dateien
Es gibt viele spezifische Dateitypen, die eine bestimmte Sequenz oder Kombination von Zeichen am Anfang und am Ende der Datei haben. Wir können diese Kombinationen einfach mit Hilfe eines beliebigen Disk-Editing-Programms analysieren. Wir können auch den EDIT-Befehl von DOS verwenden, um die Struktur der Datei im ASCII-Format zu untersuchen.
Die spezifische Zeichenfolge oder Kombination von Zeichen, die am Anfang der Datei vorhanden ist, wird üblicherweise als Kopfzeile bezeichnet, und die Zeichenfolge oder Kombination von Zeichen, die am Ende der Datei gespeichert ist, wird als Fußzeile der Datei bezeichnet.
Wenn wir unsere Daten bei einem solchen Festplattencrash verloren haben, dass keine FAT- oder Stammverzeichnisinformationen zur Wiederherstellung der Daten verfügbar sind, können wir Kopf- und Fußzeilen verwenden, um diese spezifischen Dateitypen zu durchsuchen. Die Kopfzeile gibt den Beginn der Datei dieses bestimmten Dateityps an, und die Fußzeile zeigt das Ende der Datei dieses bestimmten Dateityps an.
Hier verwenden wir die Rohstruktur eines bestimmten Dateityps, um die Daten wiederherzustellen, daher wird die Wiederherstellungstechnik Raw File Recovery genannt. Die Oberfläche der Platte wird Sektor für Sektor durchsucht, um die Kopf- und Fußzeileninformationen zu finden.
Obwohl die Wiederherstellung von Rohdateien ein breites Anwendungsgebiet haben kann, gibt es einige spezielle Wiederherstellungsfälle, in denen sie sehr hilfreich sein kann. Wenn Sie beispielsweise versehentlich ein Datenlöschprogramm auf der Festplatte ausgeführt haben, auf der sich einige wichtige Dateien befanden, aber bis Sie das Programm stoppen, werden alle Informationen von MBR, DBR, FAT und dem Stammverzeichnis einschließlich der Betriebssystemdateien gelöscht.
In einem solchen Fall können Ihnen sogar Formatwiederherstellungsprogramme nicht helfen, die Daten wiederherzustellen. Hier können Sie die Wiederherstellung von Rohdateien verwenden, um die Dateien dieser bestimmten Dateitypen wiederherzustellen, indem Sie die Kopf- und Fußzeilen durchsuchen.
Nicht nur das, auch Sie können Daten in solchen Fällen wiederherstellen, in denen Sie eine solche Festplatte haben, auf der Sie alle logischen Partitionen der Festplatte gelöscht, die Partitionen mit anderer Größe als zuvor neu erstellt und sogar das Betriebssystem installiert haben .
Jetzt werden Sie daran erinnert, dass Sie einige wichtige Daten auf der Festplatte hatten, bevor Sie sie partitioniert und formatiert haben. Wenn Sie das Betriebssystem gerade erst installiert haben, gibt es viele Chancen, dass die Datei wiederhergestellt wird.
Die Faktoren, die die Leistung der Wiederherstellung von Rohdateien beeinflussen, sind fragmentierte Daten und die Datenmenge, die von anderen Daten überschrieben wird. Sie können jedoch selbst immer mehr Anwendungsbereiche für die Wiederherstellung von Rohdateien finden.
Das Verfahren oder fast die Regeln zum Durchsuchen der Dateien mit dem Wiederherstellungsprogramm für Rohdateien berücksichtigen die folgenden Bedingungen:
- Durchsuchen Sie den Header der Datei oder mehrere Dateitypen gleichzeitig in den Sektoren der Festplatte.
- Wenn Header eines beliebigen Dateityps gefunden werden, speichern Sie die Daten in einer Datei und überprüfen Sie die folgenden vier Bedingungen, um die Datei zu schließen und zu speichern.
- Die Fußzeile dieses Dateityps wird gefunden.
- Der andere Header desselben Dateityps wird gefunden.
- Der Header eines anderen Dateityps wurde gefunden.
- Es wird keine andere Kopf- oder Fußzeile für die im Programm definierten Dateitypen gefunden und die Größe der Datei, in der Sie die Daten speichern, erreicht die maximale Größenbeschränkung, die Sie für die Dateigröße in Ihrem Programm definiert haben.
Die Informationen sollten in der Datei gespeichert werden, einschließlich der Daten der Sektoren, in denen Sie die Kopf- und Fußzeilen des Dateityps gefunden haben.
Kopf- und Fußzeilen einiger wichtiger Dateitypen
Die Kopf- und Fußzeilen einiger wichtiger Dateitypen sind in der folgenden Tabelle aufgeführt. Die in der Tabelle angegebenen Fußzeilen befinden sich entweder am Ende der Datei des angegebenen Dateityps oder in den End-Offsets der Datei, sodass Sie sie als Fußzeilen zum Wiederherstellen der Daten verwenden können.
Sie können auch selbst nach Kopf- und Fußzeilen suchen, die sich von diesen Dateitypen unterscheiden, indem Sie den EDIT-Befehl von DOS oder ein beliebiges Disk-Editing-Tool verwenden. Ich habe das Hexadezimalsystem verwendet, um die Informationen darzustellen, damit sie leicht verständlich sind.
Extension |
Header (Hex) |
Footer (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 |
Schreiben eines Programms zur Wiederherstellung von Rohdateien
Als nächstes wurde die Codierung des Programms zur Wiederherstellung von Rohdateien von Microsoft Word-Dateien (.DOC-Erweiterung) angegeben. Das Programm sucht nach den Dateien in den Sektoren der Festplatte und speichert die wiederhergestellte Datei automatisch, indem es den Dateinamen automatisch erstellt.
Der vom Benutzer angegebene Pfad zum Speichern der Dateien wird als Zielpfad zum Speichern der wiederhergestellten Daten verwendet. Wenn das Zielverzeichnis nicht existiert, kann das Programm das Ziel bis zu einer Verzeichnisebene erstellen.
Das hier angegebene Wiederherstellungsprogramm unterstützt sogar die großen Festplatten, um die Daten zu suchen und wiederherzustellen. Das Programm wurde geschrieben, um die Daten auf der zweiten physischen Festplatte zu durchsuchen.
/* Raw-Datei-Wiederherstellungsprogramm zum Wiederherstellen der Microsoft Word-Dateien */
#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 */
} ;
///// Funktion zum Abrufen von Antriebsparametern \\\\\
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;
/* Kopfzeile von Microsoft Word-Dateien */
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");
/* Funktion zum Ausblenden (und Anzeigen) des Cursors auf dem Bildschirm */
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++;
////////////// Bedingungen zum Schließen von Dateien \\\\\\\\\\\\\\\\
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++;
}
//////// While-Schleife endet hier ////////
/* 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();
}
}
Die Strukturgeometrie wird von der getdrivegeometry-Funktion unter Verwendung der INT 13H-Erweiterung, Funktionsnummer 0x48 verwendet, um die verschiedenen Parameter der Platte zu erhalten.
Die Struktur diskaddrpacket ist für das Plattenadresspaketformat, das von der readabsolutesectors-Funktion verwendet werden soll.
Die Funktion getdrivegeometry (int drive) dient zum Abrufen von Laufwerksparametern des Laufwerks mit der angegebenen physischen Laufwerksnummer.
(char) peekb(0x0040, 0x0075) wird verwendet, um die Anzahl der an den Computer angeschlossenen Festplatten zu finden, die am Speicherort gespeichert sind, der durch Segment 0040H:Offset 0075H dargestellt wird. Wenn die Gesamtzahl der angeschlossenen Festplatten kleiner als zwei ist, Fehlermeldung anzeigen und beenden.
Sectors_in_HDD2=getdrivegeometry (0x81); findet die verschiedenen Parameter der zweiten physischen Festplatte (0x81) und gibt die Gesamtzahl der Sektoren der Festplatte zurück.
Die Anweisung if(access(path, 0) != 0) prüft die Erreichbarkeit des vom Benutzer angegebenen Pfads. Wenn das Zielverzeichnis nicht existiert, wird das Ziel bis zu einer Ebene erstellt und wenn der angegebene Pfad, der durch die Bedingung if(mkdir(path)!=0) geprüft wird, illegal ist, wird eine Fehlermeldung angezeigt.
Die Dateinamen von automatisch erstellten Dateien zum Speichern der wiederhergestellten Daten werden so erstellt, dass die ersten drei Zeichen der Dateien PTT von strcat(path,"\\Ptt"); Funktion. Dies geschieht, um doppelte Dateinamen im Zielverzeichnis zu vermeiden. Daher werden die Dateinamen der wiederhergestellten Dateien im Format „PTTxxxxx.DOC“ angegeben.
Die Funktion show_hide_cursor ( 32, 0 ); wird verwendet, um den Cursor vom Bildschirm auszublenden, wobei show_hide_cursor (6, 7); bringt den Cursor zurück auf den Bildschirm.
Die Funktion readabsolutesectors (0x81, Schleife, 1, Puffer); Liest einen Sektor der zweiten physischen Festplatte, die durch die Sektornummernschleife angegeben ist.
Wenn der Header der Datei gefunden wird, start_file = loop; setzt start_file auf die Startsektornummer der wiederherzustellenden Datei. Das Programm folgt den drei folgenden Bedingungen, um den Endsektor der Datei zu finden:
- Wenn die Dateigröße eine maximale Größe von 5 MB erreicht.
- Wenn Fußzeile der DOC-Datei gefunden wird.
- Wenn ein anderer Header gefunden wird.
Die lange Ganzzahl end_file wird durch end_file=loop auf die Endsektornummer der Datei gesetzt; wenn eine von drei Bedingungen erfüllt ist. Nun werden die Daten der Sektoren beginnend mit Sektornummer start_file bis Sektornummer end_file mit der Funktion Recover_the_file( ) in die Datei gespeichert.
Als nächstes wurde die Codierung der Funktion Recover_the_file( ) angegeben:
/* Funktion zum Speichern der Daten der Sektoren beginnend mit Sektornummer start_file bis Sektornummer 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;
}
Als nächstes wurde die Kodierung der Funktion readabsolutesectors angegeben. Die Funktion verwendet die INT 13H-Erweiterung und die Funktionsnummer 42H, um die Sektoren zu lesen.
Eine detaillierte Beschreibung der Funktion finden Sie im Kapitel „Erstellen von Backups“ weiter vorne in diesem Buch. Die Codierung der Funktion ist wie folgt:
//// Funktion zum Lesen absoluter Sektoren \\\\
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
}
Die folgende Funktion wird verwendet, um den Cursor auf dem Bildschirm auszublenden oder anzuzeigen. Die Funktion verwendet Interrupt 10H, Funktion 01H, um den Cursortyp festzulegen. Die Codierung ist wie folgt:
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 ) verbirgt den Cursor und show_hide_cursor( 6, 7 ) holt den Cursor zurück. ssl ist die Startzeile für den Cursor und esl ist die Endzeile für den Cursor.
Die kleine Beschreibung der Funktion 01H von INT 10H lautet wie folgt:
INT 10H (16 oder 0x10)
Funktion 01H (oder 0x01) --> Cursortyp festlegen
Call with: AH = 01H
CH bits 0-4 = starting line for cursor
CL bits 0-4 = ending line for cursor
Returns: Nothing.
Comments:
Die Funktion dient zum Einstellen des Cursortyps durch Auswahl der Anfangs- und Endzeilen für den blinkenden Hardware-Cursor im Textanzeigemodus. In den Grafikmodi ist der Hardware-Cursor nicht verfügbar.
Seite Geändert am: 08/03/2022