Chapitre – 14
Programmation pour la récupération de "fichier brut"
Récupération de fichiers bruts
Il existe de nombreux types de fichiers spécifiques qui ont une séquence ou une combinaison spécifique de caractères écrits au début et à la fin du fichier. Nous pouvons facilement analyser ces combinaisons à l'aide de n'importe quel programme d'édition de disque. Nous pouvons également utiliser la commande EDIT du DOS pour étudier la structure du fichier au format ASCII.
La séquence ou la combinaison spécifique de caractères qui est présente au début du fichier est généralement appelée l'en-tête et la séquence ou la combinaison de caractères qui est stockée à la fin du fichier est appelée le pied de page du fichier.
Si nous avons perdu nos données dans un tel type de panne de disque qu'aucune information FAT ou répertoire racine n'est disponible pour récupérer les données, nous pouvons utiliser des en-têtes et des pieds de page pour rechercher ces types de fichiers spécifiques. L'en-tête indique le début du fichier de ce type particulier et le pied de page indique la fin du fichier de ce type de fichier particulier.
Ici, nous utilisons la structure brute d'un type de fichier particulier pour récupérer les données. La technique de récupération est donc appelée Raw File Recovery. La surface du disque est parcourue secteur par secteur pour trouver les informations d'en-tête et de pied de page.
Bien que la récupération de fichiers bruts puisse avoir un large domaine d'application, il existe des cas spécifiques de récupération où cela peut être très utile. Par exemple, par erreur, si vous avez exécuté un programme d'effacement de données sur le disque contenant des fichiers importants, mais jusqu'à ce que vous arrêtiez le programme, toutes les informations du répertoire MBR, DBR, FAT et racine, y compris les fichiers du système d'exploitation, sont effacées.
Dans ce cas, même les programmes de récupération de format peuvent ne pas vous aider à récupérer les données. Ici, vous pouvez utiliser Raw file Recovery pour récupérer les fichiers de ces types de fichiers spécifiques en recherchant les en-têtes et les pieds de page.
Non seulement cela, même vous pouvez récupérer des données dans de tels cas, où vous avez un tel disque dur dans lequel vous avez supprimé toutes les partitions logiques du disque, recréé les partitions de taille différente puis avant et même vous avez installé le système d'exploitation.
Vous vous rappelez maintenant que vous aviez des données importantes sur le disque avant de le partitionner et de le formater. Si vous venez d'installer le système d'exploitation, il y a de nombreuses chances que le fichier soit récupéré.
Les facteurs qui affectent les performances de Raw File Recovery sont les données fragmentées et la quantité de données écrasées par d'autres données. Cependant, vous pouvez vous-même trouver de plus en plus de domaines d'application pour la récupération de fichiers bruts.
La procédure ou presque les règles pour rechercher les fichiers avec le programme de récupération de fichiers bruts tiennent compte des conditions suivantes :
- Recherchez l'en-tête du fichier ou plusieurs types de fichiers simultanément dans les secteurs du disque.
- Si un en-tête de n'importe quel type de fichier est trouvé, enregistrez les données dans un fichier et vérifiez les quatre conditions suivantes pour fermer et enregistrer le fichier
- Le pied de page de ce type de fichier est trouvé
- L'autre en-tête du même type de fichier est trouvé
- L'en-tête d'un autre type de fichier est trouvé
- Aucun autre en-tête ou pied de page pour les types de fichiers définis dans le programme n'est trouvé et la taille du fichier dans lequel vous stockez les données atteint la limite de taille maximale, que vous avez définie pour la taille du fichier, dans votre programme.
Les informations doivent être stockées dans le fichier, y compris les données des secteurs dans lesquels vous avez trouvé l'en-tête et les pieds de page du type de fichier.
En-têtes et pieds de page de certains types de fichiers importants
Les en-têtes et pieds de page de certains types de fichiers importants ont été donnés dans le tableau ci-dessous. Les pieds de page indiqués dans le tableau se trouvent soit à la fin du fichier du type de fichier spécifié, soit dans les décalages de fin du fichier, de sorte que vous pouvez les utiliser comme pieds de page pour récupérer les données.
Vous pouvez également rechercher vous-même des en-têtes et des pieds de page, différents de ces types de fichiers, en utilisant la commande EDIT de DOS ou en utilisant n'importe quel outil d'édition de disque. J'ai utilisé le système hexadécimal pour représenter les informations afin de les rendre faciles à comprendre.
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 |
Écrire un programme pour la récupération de fichiers bruts
Le codage du programme de récupération de fichiers bruts de fichiers Microsoft Word (extension .DOC) a été donné ensuite. Le programme recherche les fichiers dans les secteurs du disque et enregistre automatiquement le fichier récupéré en créant automatiquement le nom du fichier.
Le chemin spécifié par l'utilisateur pour enregistrer les fichiers est utilisé comme chemin de destination pour enregistrer les données récupérées. Si le répertoire de destination n'existe pas, le programme peut créer la destination jusqu'à un niveau de répertoire.
Le programme de récupération donné ici prend en charge même les disques de grande taille pour rechercher et récupérer les données. Le programme a été écrit pour rechercher les données dans le deuxième disque dur physique.
/* Programme de récupération de fichiers bruts pour récupérer les fichiers 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 */
} ;
///// Fonction pour obtenir les paramètres du lecteur \\\\\
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;
/* En-tête des fichiers 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");
/* Fonction pour masquer (et afficher) le curseur à l'écran */
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++;
////////////// Conditions de fermeture de fichier \\\\\\\\\\\\\\\\
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++;
}
////////Tant que la boucle se termine ici
/* 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();
}
}
La géométrie de la structure est utilisée par la fonction getdrivegeometry à l'aide de l'extension INT 13H, numéro de fonction 0x48 pour obtenir les différents paramètres du disque.
La structure diskaddrpacket est pour le format de paquet d'adresse de disque, à utiliser par la fonction readabsolutesectors.
La fonction getdrivegeometry (int drive) consiste à obtenir les paramètres de lecteur du disque physique spécifié numéro de lecteur.
(char) peekb(0x0040, 0x0075) est utilisé pour trouver le nombre de disques durs connectés à l'ordinateur, stocké à l'emplacement mémoire représenté par le segment 0040H:offset 0075H. Si le nombre total de disques durs connectés est inférieur à deux, affichez un message d'erreur et quittez.
Sectors_in_HDD2=getdrivegeometry (0x81); trouve les différents paramètres du deuxième disque dur physique (0x81) et renvoie le nombre total de secteurs du disque.
L'instruction if(access(path, 0) != 0) vérifie l'accessibilité du chemin donné par l'utilisateur. Si le répertoire de destination n'existe pas, la destination est créée jusqu'à un niveau et si le chemin donné vérifié par la condition if(mkdir(path)!=0) est illégal, un message d'erreur est affiché.
Les noms de fichiers des fichiers créés automatiquement pour enregistrer les données récupérées sont créés de telle sorte que les trois premiers caractères des fichiers reçoivent un PTT par strcat(path,"\\Ptt"); une fonction. Ceci est fait pour éviter les noms de fichiers en double dans le répertoire de destination. Par conséquent, les noms de fichiers des fichiers récupérés sont donnés au format "PTTxxxxx.DOC"
La fonction show_hide_cursor ( 32, 0 ); est utilisé pour masquer le curseur de l'écran où show_hide_cursor ( 6, 7 ); ramène le curseur à l'écran.
La fonction readabsolutesectors (0x81, loop, 1, buffer); Lit un secteur du deuxième disque dur physique spécifié par la boucle de numéro de secteur.
Si l'en-tête du fichier est trouvé, start_file = loop ; définit start_file sur le numéro de secteur de départ du fichier à récupérer. Le programme suit les trois conditions données ci-dessous, pour trouver le secteur de fin du fichier :
- Si la taille du fichier atteint la taille maximale de 5 Mo
- Si le pied de page du fichier DOC est trouvé
- Si un autre en-tête est trouvé
L'entier long end_file est défini sur le numéro de secteur de fin du fichier par end_file=loop ; si une condition sur trois est satisfaite. Maintenant, les données des secteurs, du numéro de secteur start_file au numéro de secteur end_file sont enregistrées dans le fichier avec la fonction Recover_the_file().
Le codage de la fonction Recover_the_file( ) a été donné ensuite :
/* Fonction pour enregistrer les données des secteurs à partir du numéro de secteur start_file jusqu'au numéro de secteur 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;
}
Le codage de la fonction readabsolutesectors a été donné ensuite. La fonction utilise l'extension INT 13H et le numéro de fonction 42H pour lire les secteurs.
Pour la description détaillée de la fonction, reportez-vous au chapitre « Réalisation de sauvegardes » abordé précédemment dans ce livre. Le codage de la fonction est le suivant :
//// Fonction de lecture de secteur(s) absolu(s) \\\\
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
}
La fonction suivante est utilisée pour masquer ou afficher le curseur à l'écran. La fonction utilise l'interruption 10H, la fonction 01H pour définir le type de curseur. Le codage est le suivant :
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 ) masque le curseur et show_hide_cursor( 6, 7 ) récupère le curseur. ssl est la ligne de départ du curseur et esl est la ligne de fin du curseur.
La petite description de la fonction 01H de INT 10H est la suivante :
INT 10H (16 ou 0x10)
Fonction 01H (ou 0x01) --> Définir le type de curseur
Call with: AH = 01H
CH bits 0-4 = starting line for cursor
CL bits 0-4 = ending line for cursor
Returns: Nothing.
Comments:
La fonction est utilisée pour définir le type de curseur en sélectionnant les lignes de début et de fin pour le curseur matériel clignotant en mode d'affichage de texte. Dans les modes graphiques, le curseur matériel n'est pas disponible.
Page modifiée le: 09/03/2022