Structure du MBR et des tables des partitions sur le disque dur
Nous allons voir dans cet article comment sont organisés le MBR et les tables des partitions sur le disque dur, comment y accéder directement, et comment les sauvegarder et les restaurer à volonté. Nous verrons ensuite comment camoufler des données sur votre disque dur en lieu sûr, à des endroits innaccessibles par les systèmes d’exploitations et les virus.
Sommaire de cette page :
|
Le MBR est le premier secteur physique d’un disque dur. Comme tous les secteurs, le MBR a une taille de 512 octets. La position absolue du MBR dépend de la méthode d’accès que l’on utilise :
Dans tout ce qui suit, je n’utiliserai que le mode LBA pour accéder et pour désigner les secteurs du disque dur : je ne parlerai pas de cylindres ni de têtes (ou de pistes). En LBA, chaque secteur possède un numéro absolu, le premier secteur du disque (le MBR) étant le secteur numéro zéro. Par exemple, mon disque dur MAXTOR de 80 Go possède 160 071 660 secteurs : en mode LBA ces secteurs sont numérotés de 0 à 160 071 659.
Le MBR contient principalement 2 éléments, vitaux pour le démarrage du PC :
Cette table des partitions principales contient 4 descripteurs, décrivant chacun la position physique d’une partition principale sur le disque dur. La position physique d’une partition est indiquée (entre autre) dans la table des partitions principales par :
Comme la table des partitions principales (dans le MBR) ne contient que 4 descripteurs, cela explique pourquoi un disque dur ne peut contenir que 4 partitions principales. Si on a besoin de plus de 4 partitions, il faudra alors créer une partition étendue parmi les 4 partitions principales, en sachant que :
Les deux configurations possibles d’un disque dur utilisant les 4 descripteurs de la table des partitions principales sont donc :
Structure du MBR :
Taille | Contenu |
---|---|
446 octets |
Programme de BOOT |
16 octets |
Descripteur de la première partition principale |
16 octets |
Descripteur de la seconde partition principale |
16 octets |
Descripteur de la troisième partition principale |
16 octets |
Descripteur de la quatrième partition principale |
2 octets |
Signature indiquant qu’il s’agit d’un secteur BOOT : 0x55 0xAA |
Comme le MBR contient la table des partitions principales du disque, il est forcément différent d’un disque à l’autre (car les partitions n’ont jamais la même dimention au secteur près). Pour dupliquer le programme de boot (Grub, par exemple) d’un disque 1 vers un disque 2, on ne peut donc pas recopier directement le MBR du disque 1 vers le MBR du disque 2 : on écraserait et on perdrait la table des partitions du disque 2 !
A retenir :
Pour conclure ce paragraphe :
Il existe 2 tables de partitions sur votre disque dur :
Cela signifie qu’il suffit de sauvegarder 2 secteurs (soit 1ko seulement) pour sauvegarder toute le structure de vos partitions, mais cela signifie surtout qu’il suffit d’écraser seulement 2 secteurs pour détruire l’intégralité de vos partitions !
Donc à partir de maintenant, si on parle de "table de partition" (c’est quoi ça ??? ... ) il faudra préciser si on parle de la table des partitions principales ou de la table des partitions logiques (là je comprends mieux ! :-)
La structure des partitions ne repose donc que sur 2 petits malheureux secteurs. Vue la fragilité de la structure des partitions (fragilité bien comprise par les programmeurs de virus), il est donc important de sauvegarder ses tables de partitions, dans le but de pouvoir les restaurer en cas de problème.
Je ne parlerai ici que de la table des partitions PRINCIPALES, en considérant que le disque dur contient 4 partitions principales et aucune partition étendue.
Généralement, la perte ou la dertruction de la table des partitions principales se produit dans un des deux cas suivants :
Pour sauvegarder votre table des partitions principales, vous avez deux solutions :
La sauvegarde du MBR dans un fichier pourra se faire en utilisant l’utilitaire dd sous Linux, de la manière suivante :
dd if=/dev/hda of=secteur_mbr_disque_hda bs=512 count=1
Le fichier secteur_mbr_disque_hda contient alors les 512 octets de votre MBR. Pour le visionner en hexadécimal, vous pouvez utiliser mc sous Linux :
mc -v secteur_mbr_disque_hda
Puis appuyez sur F4 pour voir le fichier en hexadécimal.
Appuyez sur F10 pour sortir de mc.
Mais le jour où votre MBR est réellement endomagé, êtes-vous sûr de retrouver ce fichier de sauvegarde secteur_mbr_disque_hda ?
Retrouverez-vous la disquette sur laquelle vous avez enregistré votre MBR ? Cette disquette sera-t-elle elle même lisible ou endomagée ? (Erreur de CRC, Erreur d’ I/O, etc ...). La loi de l’emmerdement maximum donne la réponse : comme votre MBR est détruit, vous n’avez vraiment pas de chance ce jour là, donc attendez-vous à avoir également des problèmes pour retrouver ou pour lire la disquette sur laquelle vous aviez enregistré votre MBR. Pour toutes ces raisons, et pour éviter d’avoir des problèmes supplémentaires de lecture de la sauvegarde, je préfère sauvegarder ma table des partitions principales sur papier, au marqueur indélébile, et le collé sur le côté droit de mon unité centrale : je suis déjà quasiment sûr (sauf en cas d’inondation ... :-) de supprimer tout problème de lecture lors de la réutilisation de cette table.
Voyons maintenant concrètement comment enregistrer sur papier la table des partitions principales.
Comme nous l’avons déjà dit, parmi toutes les informations contenues dans les descripteurs de partitions principales (sur 16 octets chacun dans le MBR), seules les 3 informations suivantes nous intéressent et nous permettrons de sauvegarder ou de restaurer les partitions principales :
Pour obtenir très clairement ces informations, on pourra utiliser le programme fdisk sous Linux :
Par exemple, pour analyser le disque /dev/hdb, lancez :
fdisk /dev/hdb
Entrez dans le menu Expert : commande x
Affichez la table de partitions : commande p
Fdisk affiche alors le contenu des 4 descripteurs de la table des partitions principales du MBR, en affichant le début et la fin de la partition en mode CHS, et en affichant aussi le début et la taille en secteurs absolus (mode LBA). La dernière colonne (ID) est le type de partition.
Pour sauvegarder sur papier la table des partitions principales, il faut relever dans un tableau le type, le début, et la taille de chacune des 4 partitions. Par exemple, pour mon disque dur MAXTOR de 80 Go, j’ai relevé sur papier le tableau suivant :
partition |
type de partition |
numéro absolu LBA du premier secteur |
taille de la partition en secteurs |
hdb1 |
0x83 |
63 |
7 180 992 |
hdb2 |
0x82 |
7 181 055 |
1 076 355 |
hdb3 |
0xc |
8 257 473 |
73 674 027 |
hdb4 |
0x83 |
81 931 563 |
78 140 097 |
Remarque : on remarque que la partition hdb1 commence au secteur n°63 (et non au secteur n°1 qui suit le MBR) : cela signifie que les secteurs n° 1 à n° 62 ne sont, apparemment, pas utilisés sur le disque dur. En effet, la commande v de fdisk nous confirme que 62 secteurs ne sont pas utilisés, vu l’emplacement des partitions principales. En réalité, certains lanceurs de démarrage et certains OS utilisent quelques un de ces secteurs. Ce qui est sûr c’est qu’aucune norme n’impose l’utilisation de ces 62 secteurs, c’est donc l’anarchie totale, chacun peut en faire ce qu’il veut. Parmi les utilisations les plus fréquentes de ces 62 premiers secteurs du disque (après le MBR), on peut citer l’enregistrement d’un lanceur de démarrage ne tenant pas dans les 446 octets disponible dans le MBR, le stockage de virus (non détruit en cas de formatage des partitions), l’écriture d’un octets permettant de limiter le fonctionnement de certains logiciels de démonstration limités à 30 jours (là encore, si vous formatez vos partitions principales, vous ne mettrez pas à zéro le compteur d’utilisation du logiciel enregistré EN DEHORS des partitions : le logiciel refusera de se lancer à nouveau (après réinstallation de Windows et du logiciel lui-même), en vous indiquant que vous avez dépassé la période de test), et enfin, vous pouvez utiliser ces 62 secteurs pour faire des copies de sauvegarde de vos tables des partitions (MBR, secteur boot de la partition étendue, et même sauvegarder tous les secteurs de partition).
La table des partitions principales donnée sous Linux par fdisk dans le mode expert, et relevée dans le tableau ci-dessus a pour unité le secteur absolu (en accès LBA). Mais certains programmes (comme la table des partitions donnée par fdisk en mode normal, c’est-à-dire non expert) proposent comme unité le cylindre (1 cylindre = 16 065 secteurs = 8 Mo environ). Il faut donc faire un choix : soit relever la table des partitions en secteurs, et utiliser le secteur comme unité, soit relever la table des partitions en cylindres et utiliser le cylindre comme unité (le but étant biensûr d’éviter à avoir à faire des conversions soit-même, par exemple pour passer du mode CHS au mode LBA, qui pourraient se révéler catastrophiques en cas d’erreur de calcul).
Bien que le cylindre paraisse être plus adapté pour décrire les partitions des grands disques durs, j’ai personnellement choisi de tout relever en secteurs, et de n’utiliser que le secteur pour sauvegarder et restaurer mes partitions, et ce pour 2 raisons :
Enfin, maîtriser le contenu de son disque dur, sans se laisser influencer par les choix de son système d’exploitation, consiste à définir et à connaître la cartographie complète de son disque au secteur près, pour pouvoir par exemple y camoufler des fichiers inaccessibles par le système d’exploitation comme nous le verrons plus bas.
Revenons à la table des partitions principales : nous l’avons sauvegardée sur le papier, voyons à présent comment la restaurer, en écrivant manuellement les informations sauvés (type, début, et taille des partitions) dans les 4 descripteurs de partitions principales situés dans le MBR.
ATTENTION : cette opération est évidemment délicate puisqu’elle va écraser le contenu de la table actuelle des partitions principales, sans vous demander aucune confirmation. Agissez donc en connaissance de cause.
Pour restaurer la table des partitions principales, on peut utiliser GRUB, soit en ligne de commande au démarrage du PC, soit en bootant sur une disquette contenant Grub, soit encore en lançant Grub dans un shell Linux. Utilisons la ligne de commande au démarrage du PC : lorsque Grub présente le menu des systèmes bootables (Linux, Windows, etc.), appuyez sur la touche c pour atteindre la ligne de commande. La touche TAB vous affiche à l’écran toutes les commandes utilisables dans Grub. Parmi les commandes de Grub, il y a la commande partnew qui permet de créer une nouvelle partition principale. En réalité, cette commande ne fait rien d’autre que d’écrire (en l’écrasant) sur un des 4 descripteurs de partition principale dans le MBR. La syntaxe de partnew est :
partnew partition type début taille
où :
Par exemple, pour restaurer mes 4 partitions principales sur mon disque MAXTOR de 80 Go (dont la table des partitions principales a été donnée dans un tableau plus haut), j’ai tapé les 4 commandes suivantes dans Grub :
grub> partnew (hd1,0) 0x83 63 7180992
grub> partnew (hd1,1) 0x82 7181055 1076355
grub> partnew (hd1,2) 0xc 8257473 73674027
grub> partnew (hd1,3) 0x83 81931563 78140097
Pour relire la table des partitions principales enregistrée dans le MBR, on pourra utiliser la commande geometry de Grub :
grub> geometry (hd1)
Grub renvoie alors le type de chaque partition principale, ainsi que le nombre total de secteurs sur le disque (en LBA), mais ne donne pas les caractéristiques (début et taille) de chaque partition. Grub permet donc de saisir la table des partitions principales, mais ne permet pas de la relever.
Grub permet de saisir à volonté les informations des partitions principales dans les descripteurs. Il permet donc aussi de "vider" un ou plusieurs des 4 descripteurs, ce qui fera croire aux systèmes d’exploitation (Linux, DOS, Windows, etc.) que l’espace occupé par la partition principale est de l’espace vide. Pour vider un descripteur, il suffit de saisir 0 aussi bien pour le type, pour le début, et pour la taille de la partition. Par exemple, pour rendre la partition /dev/hdb3 innaccessible depuis les systèmes d’exploitation, on pourra taper la commande suivante dans grub :
grub> partnew (hd1,2) 0 0 0
ATTENTION : cette commande écrasera le descripteur de la partition hdb1 dans la tables des partitions principales, et il vous sera alors très délicat (voire impossible) de retrouver les caractéristiques de cette partition si vous ne les avez pas notées sur un papier et rangées en lieu sûr.
Mise en garde pour les administrateurs de parc informatique :
Comme nous venons de le voir, la ligne de commande de Grub donne la possibilité de modifier directement la table des partitions principales, et de faire disparaitre les partitions. Si vous installez Grub sur des postes informatiques multi-utilisateurs et non surveillés (en lycée par exemple) il est vivement conseillé de mettre un mot de passe dans Grub pour interdire l’accès à la ligne de commande, sans quoi les utilisateurs aurait le pouvoir de détruire facilement et définitivement la table des partitions principales !
A retenir :
Le lanceur de démarrage Grub permet de saisir manuellement les caractéristiques des 4 partitions principales, en écrivant directement dans les 4 descripteurs du MBR. Lors de cette saisie, la commande partnew de Grub utilise le secteur absolu (LBA) et non le cylindre comme unité. En saisissant zéro comme type, début, et taille d’une partition dans la commande partnew, la ligne de commande de Grub permet de faire disparaitre une partition en vidant son descripteur ! Il est alors suicidaire de laisser Grub sans mot de passe sur des postes informatiques en lycée (bien qu’en cas de destruction d’une partition, on accuserait naturellement le dernier virus, et non les élèves biensûr, puisque l’administrateur qui a laissé Grub sans mot de passe sur les postes élèves ne doit pas être au courant de la bombe à retardement que cela représente ;-)
Enfin, si vous avez l’intention de sauvegarder et de restaurer manuellement vos tables de partitions, il est conseillé de ne créer que des partitions principales (faciles à reconstituer dans le MBR grâce à la commande partnew de Grub) et de ne pas créer de partition étendue (donc pas de partitions logiques, dont la table de partition ressemble à une liste chaînée bien plus complexe que la table des 4 partitions principales). Vous n’avez alors qu’une seule table de partition à sauvegarder : la table des partitions principales.
Signalons aussi l'excellent logiciel TestDisk qui permet de reconstituer la table des partions d'un disque dur afin de récupérer les données : http://www.cgsecurity.org/wiki/TestDisk_FR
Entendons-nous bien sur le terme "camoufler" : j’entends par camoufler rendre les données innaccessibles au système d’exploitation. Donc même l’administrateur du système (le root sous Linux) ne pourra pas plus accéder à ces données camouflées qu’un utilisateur quelconque. Le camouflage ne consiste donc pas à cacher simplement un fichier en activant son attribu "Caché", ni à limiter les droits d’accès au fichier en utilisant les restrictions du système de fichiers (comme cela existe pour Ext2 sous Linux ou pour NTFS sous Windows). Non non non, camoufler ne consiste pas à utiliser des fonctions légales que tout le monde connaît, mais va consister à utiliser les possibilités de votre système (le BIOS, le MBR, et la structure des partitions), pour vous réserver manuellement un espace sur le disque où seul vous serez aller, alors que cet espace sera totalement ignoré par votre système d’exploitation. Vous l’aurez compris, dans ce paragraphe on inverse les rôles : c’est vous le maître du système, ce n’est plus le système d’exploitation. Mais comment finter, ou arnaquer, ou mentir au système d’exploitation afin qu’il ne se doute de rien ? Là est la question, et il y a plusieurs solutions comme nous allons le voir tout de suite :
Solution 1 : la partition cachée
La première solution, qui est la moins originale de toutes, consiste à cacher une partition complète, comme permet de la faire Partition Magic. Il faut savoir que cela n’a rien de magique, puisque cacher une partition à la manière de Partition Magic consiste simplement à modifier le type de la partition dans le descripteur de partition, en utilisant un type particulier. De cette manière, il n’est possible de ne cacher que des partitions formatées avec les systèmes de fichier FAT (FAT16 ou FAT32) ou NTFS. Voici les types à utiliser pour ces partitions :
système de fichiers |
Type si NON cachée |
Type si CACHEE |
FAT12 |
0x1 |
0x11 |
FAT16 < 32 Mo |
0x4 |
0x14 |
FAT16 > 32 Mo |
0x6 |
0x16 |
FAT16 Win95 (LBA) |
0xe |
0x1e |
FAT32 |
0xb |
0x1b |
FAT32 (LBA) |
0xc |
0x1c |
NTFS |
0x7 |
0x17 |
Pour modifier le type d’une partition dans un des descripteurs du MBR, sans modifier les autres caractéristiques de la partition (début et taille de la partition), on pourra utiliser la commande parttype de Grub. Par exemple, pour cacher la partition hdb3 de type 0xc (partition en FAT32), on tapera la ligne suivante dans la ligne de commande de Grub (rappel : il faut appuyer sur la touche c pour accéder à la ligne de commande, lorsque Grub affiche le menu au démarrage) :
grub> parttype (hd1,2) 0x1c
Ainsi, la place occupé par la partition sera toujours allouée à cette partition (ce ne sera pas de l’espace vide), mais cette partition ne sera plus visible à partir des systèmes d’exploitation de Microsoft (MS-DOS, Win 9x, et Windows XP). En effet, l’attribu "cachée" dans le code des partitions ne concernant que les partitions de type "Microsoft", seuls les systèmes Microsoft jouent le jeu de faire croire qu’ils ne voient pas ces partitions. Pour Linux, qu’une partition soit de type 0xc ou de type 0x1c, le mountage (ou plutot le greffage en français) en tant que FAT32 ne posera aucun problème dans les deux cas.
Biensûr, pour faire ré-apparaître la partition hdb3, aux yeux de Windows, il faudra lui redonner le type 0xc à la place de 0x1c :
grub> parttype (hd1,2) 0xc
Conclusion : cette première solution ne fait qu’utiliser un type de partition conventionnel, et ne permet de cacher des donnés qu’aux yeux des systèmes DOS et Windows (Linux est totalement incensible à ce genre de partition cachée). Bien connue des utilisateurs de Partition Magic, on voit ici que la technique permettant de cacher ou faire apparaître des partitions peut être activée simplement avec Grub, au démarrage du PC.
Solution 2 : la partition non-déclarée
Une seconde solution consisterait à créer une partition principale (d’un format quelconque : FAT32, NTFS, Ext3, ou autre), d’y stocker les fichiers à camoufler, de relever sur papier les caractéristiques de la partition (type, début, et taille en secteurs), puis de "vider" le descripteur dans la table des partitions principales, en utilisant la commande partnew de Grub. Par exemple, pour vider le descripteur de hdb3 on tapera la commande :
grub> partnew (hd1,2) 0 0 0
Comme nous l’avons vu au paragraphe précédent, cette commande écrase les caractéristiques actuelle dans le descripteur, déclarant ainsi l’espace occupé par la partition comme étant de l’espace libre. Biensûr les fichiers enregistrés sur cette partition ne sont pas touchés. La partition est alors un peu comme gelée, c’est à dire morte et inexistante pour les systèmes d’exploitation, et rien ne pourra alors modifier les fichiers qu’elle contient. Pour ré-activer cette partition, il suffit de saisir ses caractéristiques avec la commande partnew de Grub, afin de re-déclarer la partition dans la table des partitions principales du MBR :
grub> partnew (hd1,2) 0xc 8257473 73674027
Conclusion : contrairement à la solution 1, cette solution 2 inhibe l’accès aux données pour tous les systèmes, y compris pour Linux qui croira (comme Windows) que l’espace occupé par la partition est de l’espace vide dépourvu de système de fichiers. Biensûr, si on crée une nouvelle partition sur cette espace vide (avec fdisk ou Partition Magic), puis qu’on la formate, ou perdrait les données qui y étaient camoublées.
Solution 3 : écriture brute en dehors des partitions principales
Cette troisième solution consiste à ne pas déclarer en partitions principales la totalité du disque dur, et à se garder un peu d’espace disque. Par exemple, vous avez un disque de 90 Go, et vous créez 4 partitions principales de 20 Go chacune : la totalité des partitions principales (c’est-à-dire l’espace disque accessible conventionnellement par vos OS) est de 80 Go. Vous avez donc 10 Go d’espace libre non déclaré dans votre table des partitions principales. Comme cet espace disque n’est pas déclaré, il est inaccessible directement par les systèmes d’exploitation. De plus, comme vous avez déjà 4 partitions principales, il est impossible d’écraser l’espace libre en créant une 5 ème partition (à moins d’agrandir une partition existante). Enfin, votre espace disque "caché" ne possédant aucun système de fichiers (contrairement à une partition officielle), on ne pourra y accéder qu’en lisant ou en écrivant directement sur les secteurs qu’il contient. Comment faire ? En utilisant l’utilitaire dd de Linux (toujours le même ! :-). Mais il faut avant tout connaître le premier secteur de cet espace libre.
Prenons un exemple concret :
Imaginons que le premier secteur de l’espace libre soit le secteur n°1000000 (en LBA), et que vous vouliez y copier un fichier toto d’une taille de 651642 octets. Il vous faut alors taper la commande suivante sous Linux :
dd if=toto of=/dev/hdb bs=512 seek=1000000
Description des 4 paramètres passés à la commande dd :
Remarque : comme nous avons réglé la taille d’un bloc à 512 octets, et que le périphérique de sortie (/dev/hdb) est directement le disque dur, les blocs manipulés par dd corresponde ici aux secteurs physique du disque dur.
A la fin de la copie, dd nous indique qu’il a lu et écrit 1272+1 secteurs : cela signifie que notre fichier camouflé toto occupe 1273 secteurs sur le disque, à partir du secteur numéro 1000000 (en LBA). Le dernier secteur occupé n’est pas complet (le fichier y occupe moins de 512 octets).
Une fois copié dans l’espace disque extérieur aux partitions principales, rien ne pourra effacer ce fichier toto : aucun formatage des partitions existantes, aucune destruction de table des partitions, aucune destruction de FAT, ni aucun virus n’ira écrire directement sur les secteurs contenant le fichier toto. Seul un formatage bas niveau total du disque dur ou un redimentionnement des partitions principales écraseraient tous les secteurs du disque, et effacerait alors notre fichier camouflé. En revanche, il faut bien noté le numéro absolu (LBA) du premier secteur occupé par le fichier, et le nombre de secteurs utilisés, afin de pouvoir aller rechercher un jour le fichier camouflé.
Comment aller récupérer notre fichier toto, qui est enregistré de manière "brute" sur le disque dur à l’extérieur des partitions principales ? Pour cela, nous allons procéder en 2 temps :
Récupérons les 1273 secteurs du disque, à partir du secteur n°1000000, et enregistrons le tout dans un fichier titi :
dd if=/dev/hdb of=titi bs=512 count=1273 skip=1000000
dd nous indique alors qu’il a lus 1273 blocs, soit 1273 secteurs sur le disque dur.
Mais le fichier titi que nous obtenons est légèrement plus grand que le fichier toto original. En effet, le dernier secteur (le 1273 ème secteur copié) n’est pas totalement utilisé par le fichier toto. Pour reconstituer le fichier toto, nous allons récupérer 651642 octets à partir du fichier titi. Cette fois, la taille d’un bloc est de 1 octet, et nous allons copier 651642 blocs :
dd if=titi of=toto bs=1 count=651642
Après l’écriture des 651642 octets, nous retrouvons bien notre fichier toto d’origine, alors qu’il était enregistré de manière brute à l’extérieur de toute partition principale, sans l’aide d’un système de fichiers conventionnel.
CQFD !
Remarque : avec dd, copier 651642 blocs de 1 octet chacun ou copier 1 seul bloc d’une taille de 651642 octets donnera la même chose. La commande suivante donnera donc exactement le même résultat que la commande ci-dessus, tout en étant beaucoup plus rapide :
dd if=titi of=toto bs=651642 count=1
Comme dd utilise l’entrée et la sortie standard pour lire et écrire le flux de donnée qu’il traite, il est possible de récupérer notre fichier cammouflé toto en une seule commande, sans passer par un fichier intermédiaire titi. Pour cela, nous allons utiliser un tube sur la ligne de commande, qui consiste à rediriger la sortie standard du premier dd vers l’entrée standard du second. La ligne de commande unique permettant de récupérer directement le fichier camouflé toto est alors la suivante :
dd if=/dev/hdb bs=512 count=1273 skip=1000000 | dd of=toto bs=651642 count=1
Dans la ligne ci-dessus, le premier dd va lire 1273 secteurs sur le disque /dev/hdb à partir du secteur n°1000000 (en LBA) et envoit ce flux de donnée au second dd qui ne va garder que les 651642 premiers octets reçus, et les enregistre dans le fichier toto. Grâce à ces deux commande dd, enchaînées par un tube (le tube est symbolisé par la barre verticale | sur la ligne de commande), on a pu récupérer en une seule fois l’intégralité du fichier toto, enregistré directement sur les secteurs du disque dur (à l’extérieur des partitions principales et sans l’aide d’un système de fichiers), et sans utiliser de fichier intermédiaire. Il est ainsi possible de camoufler et d’aller chercher plusieurs fichiers dans l’espace libre du disque dur, à condition de bien retenir la position (en secteurs absolus LBA) et la taille (en secteurs et en octets) de chaque fichier.
A retenir :
La commande dd de Linux permet de lire ou d’écrire sur n’importe quel secteur du disque dur, y compris les secteurs situés à l’extérieurs des partitions principales (comme le MBR ou l’espace vide du disque), ou encore sur les secteurs de boot de chacune des partitions. La commande dd de Linux permet donc de camoufler des fichiers à des endroits du disque dur non déclarés en partitions, et totalement inexistant pour les systèmes d’exploitation (car dépourvu d’un système de fichiers).
Solution 4 : camouflage d’un fichier dans les secteurs défectueux
Comment camoufler un fichier en déclarant défectueux tous les blocs sur lequel il repose, dans un système de fichiers EXT2 ? C’est ce que nous allons voir dans cette solution n°4 à travers un exemple concret que vous pouvez reproduire étape par étape sans crainte, car nous allons travailler sur une partition virtuelle qui sera créée dans un fichier.
Créons un petit périphérique blocs de type "loop" ("boucle" en français : il s’agit d’un périphérique blocs renfermé dans un fichier), constitué de 60 blocs de 1ko chaun (60 blocs de 1ko représente la taille minimale pour un périphérique blocs) :
On crée un fichier fs.img de 60ko, qui sera l’image du système de fichiers :
dd if=/dev/zero of=fs.img bs=1k count=60
Déclarons un nouveau périphérique bloc /dev/loop0, rattaché au fichier fs.img :
losetup /dev/loop0 fs.img
Formatons le phériphérique blocs /dev/loop0 avec le système de fichiers EXT2. Rappel : ce formatage n’a aucune conséquence sur vos données enregistrées sur votre disque dur puisque nous travaillons à l’intérieur du fichier fs.img que nous venons de créer :
mke2fs /dev/loop0
Vérifions les informations présentes dans le superbloc du système de fichiers EXT2 :
dumpe2fs /dev/loop0
Affichons la liste des blocs classés défectueux (en principe il n’y en a aucun pour l’instant) :
dumpe2fs -b /dev/loop0
Greffons (ou "mountons" si vous préférez ...) le système de fichiers :
mount /dev/loop0 /mnt/test
Créons un fichier toto, d’une taille de 5000 octets, dans le système de fichiers :
dd if=/dev/zero of=/mnt/test/toto bs=5000 count=1
Ce fichier toto occupe donc 5 blocs dans le système de fichiers (le 5 ème bloc n’étant pas entièrement occupé puisque 5000 octets < 5 ko).
Dégreffons (ou démountons si vous voulez ... ) le système de fichiers :
umount /dev/loop0
Nous allons maintenant aller voir sur quels blocs est enregistré le fichier toto. Pour cela on va éditer le système de fichiers avec debugfs :
debugfs /dev/loop0
La commande stat de debugfs nous donne l’ensemble des blocs sur lesquel repose le fichier toto :
debugfs: stat toto
Inode: 12 Type: regular Mode: 0644 Flags: 0x0 Generation: 1427946249
User: 0 Group: 0 Size: 5000
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 10
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x41274e05 -- Sat Aug 21 15:28:37 2004
atime: 0x41274e05 -- Sat Aug 21 15:28:37 2004
mtime: 0x41274e05 -- Sat Aug 21 15:28:37 2004
BLOCKS:
(0-4):20-24
TOTAL: 5
Le fichier toto occupe 5 blocs : les blocs n°20 à n°24 L’inode relative au fichier toto (et contenant les numéros de l’ensemble des blocs du fichier toto) est le bloc n°12
Pour "geler" le fichier toto au niveau du système (c’est-à-dire pour faire en sorte que le système ignore les blocs du fichier toto, et ne les touche plus) il faut donc déclarer comme défectueux les blocs 12, 20, 21, 22, 23, et 24.
On va pour cela utiliser le paramètre -L de e2fsck :
e2fsck -L secteurs.txt /dev/loop0
où secteurs.txt est un fichier texte contenant la liste des blocs à déclarer comme défectueux.
Dans notre cas, ce fichier secteurs.txt doit ressembler à ceci :
12
20
21
22
23
24
Les numéros de blocs sont écrit en colonne, avec un seul numéro par ligne, sans séparateur particulier, et sans possibilité de regrouper un ensemble de blocs contigus sur la même ligne (une symtaxe du style 20..24 ou encore [20-24] n’existe pas ...) : il faut inscrire un par un tous les blocs à déclarer défectueux.
Dans le cas de 5 blocs, on peut créer le fichier secteurs.txt manuellement. Mais dans le cas de 1000 ou 2000 blocs, il vaut mieux le créer automatiquement. La ligne de commande suivante (que je viens d’improviser mais qui n’est pas la seule solution) crée un tel fichier, en y inscrivant tous les numéros compris entre 20 et 24 (20 et 24 compris). En remplaçant 20 par 1000 et 24 par 6000, par exemple, on obtient instantanément un fichier avec une liste de 5000 blocs :
a=20; while (test $a -le 24); do echo $a >> secteurs.txt; a=$((a+1)); done
Une autre solution, bien plus simple qu’une boucle while consiste à utiliser la commande seq de Linux :
seq 20 1 24 > secteur.txt
Une fois que le fichier secteurs.txt est créé, on lance la commande suivante pour déclarer la liste de blocs comme étant défectueux, et pour tester le système de fichiers :
e2fsck -L secteurs.txt /dev/loop0
On répond Yes (touche y) à toutes les questions sauf à la question
File /toto (inode #12, mod time Sat Aug 21 16:46:01 2004)
has 5 duplicate block(s), shared with 1 file(s):
<The bad blocks inode> (inode #1, mod time Sat Aug 21 16:47:02 2004)
Clone duplicate/bad blocks<y>?
où on répondra Non (touche n) afin de ne pas modifier l’inode 12 et de ne pas faire de copie du fichier toto.
Affichons la liste des blocs classés défectueux :
dumpe2fs -b /dev/loop0
Cette fois on obtient bien la liste des blocs que nous avons artificiellement déclarés comme défectueux :
12
20
21
22
23
24
Et si on teste intégralement l’intégrité, c’est-à-dire l’intégralité :-( du système de fichiers, il n’y a plus de problème :
e2fsck -f /dev/loop0
Si on greffe (comprenez si on "mounte", mais je parle 100% français, désolé ;-) le système de fichiers avec la commande mount, notre fichier toto n’est alors plus accessible.
Notre fichier toto est maintenant camouflé dans les blocs défectueux, son contenu sera donc totalement ignoré par le système d’exploitation et par les virus (quel virus penserait que les blocs défectueux contiennent une information importantes ? Mais au fait, depuis quand des virus s’attaquent aux systèmes de fichiers EXT2 sous Linux ?? :-)))
Comment aller repêcher notre fichier toto, camouflé dans les blocs défectueux ? Cette opération, qui commence à ressembler à de la chirurgie délicate, se déroule en 3 étapes :
Etape 1 : On supprime les blocs défectueux en déclarant tous les blocs comme non-défectueux. Pour cela on va passer en paramètre à la commande e2fsck -L un fichier secteurs.txt totalement vide (pour vider le fichiers secteurs.txt on pourra par exemple lancer la ligne de commande cat /dev/null > secteurs.txt) :
e2fsck -L secteurs.txt /dev/loop0
Affichons la liste des blocs classés défectueux :
dumpe2fs -b /dev/loop0
Cette fois il n’y a à nouveau plus aucun bloc défectueux.
ATTENTION : les 6 blocs que nous venons de remettre en service, et contenant notre fichier toto, sont déclarés comme libres. Cela signifie que si on crée un fichier maintenant, il serait enregistré sur ces blocs, et écraserait le fichier toto. Mais cela n’est pas possible pour l’instant puisque notre système de fichiers est démounté (zup, j’aurais du dire dégreffé ... :-)).
Etape 2 : Pour faire ressortir le fichier toto des blocs 20 à 24, il faut déclarer comme non-effacé(e) l’inode 12. Pour cela on utilise la commande mi (Modifier Inode) de debugfs, après avoir ouvert le système de fichiers en écriture (paramètre -w) :
debugfs -w /dev/loop0
debugfs : mi <12>
Mode [0100644]
User ID [0]
Group ID [0]
Size [5000]
Creation time [1093096697]
Modification time [1093096389]
Access time [1093096389]
Deletion time [1093096697] 0
Link count [0] 1
Block count [10]
File flags [0x0]
Generation [0xcd05c101]
File acl [0]
High 32bits of size [0]
Fragment address [0]
Fragment number [0]
Fragment size [0]
Direct Block #0 [20]
Direct Block #1 [21]
Direct Block #2 [22]
Direct Block #3 [23]
Direct Block #4 [24]
Direct Block #5 [0]
Direct Block #6 [0]
Direct Block #7 [0]
Direct Block #8 [0]
Direct Block #9 [0]
Direct Block #10 [0]
Direct Block #11 [0]
Indirect Block [0]
Double Indirect Block [0]
Triple Indirect Block [0]
Pour déclarer non-effacé(e) un(e) inode (ce qui revient à faire un undelete du fichier), il faut appuyer sur entrée pour tous les paramètres, sauf pour Deletion time qu’il faut mettre à 0, et Link count qu’il faut mettre à 1. Les autres paramètres restent inchangés.
On quitte ensuite debugfs :
debugfs : quit
Etape 3 : Et on répare une dernière fois le système de fichiers en répondant automatiquement yes à toutes les questions :
e2fsck -f -y /dev/loop0
Si on greffe (mounte en non-français) le système de fichiers, on retrouve alors dans le répertoire lost+found un fichier nomé #12 d’une taille de 5000 octets, et qui repose sur les blocs 20 à 24 : il s’agit de notre fichier toto qui était camouflé dans les blocs défectueux !
CQFD !
Remarque : le nom du fichier ("toto") a été perdu, il est remplacé par #12 (car toto était géré par l’inode 12) : il faut donc renomer #12 en toto. Mais le contenu du fichier (les 5000 octets) n’a biensûr pas été modifié.
Enfin, refermons le périphérique /dev/loop0, en le détachant du fichier fs.img :
losetup -d /dev/loop0
Avec toutes ces techniques de camouflage originales de fichiers, vous n’avez plus d’escuses pour ne pas avoir sauvegardés efficacement vos fichiers les plus précieux, et ainsi pouvoir vivre sans crainte la prochaine perte de votre table des partitions. Je ne l’ai pas dit mais c’est élémentaire, si vous avez plusieurs fichiers à camoufler vous les compactez dans un fichier ZIP et vous camouflez le ZIP (ne vous amusez pas à camouflez 100 fichiers un après l’autre ...) et en plus vous y gagnerez en place. Un dernier point, toutes ces techniques avancées de camouflage ne sont pas garanties dans le cas où votre disque dur passerait dans un champ magnétique de plusieurs Teslas ! :-)))) Bon vent à tous, et à bientôt pour d’autres aventures sur Gecif.net ;-)