Aller au contenu

Coder la restauration d'un fichier (Minix)


Xaelias

Messages recommandés

Bonjour les amis!

Pour un de mes cours sur Minix, notre dernier projet consiste à endommager un inode, et tenter de le restaurer par la suite.

Pour l'instant je me concentre sur les fichiers (pour les dossiers on verra plus tard si on a le temps).

Pour endommager un inode, on se contente de supprimer de l'inode en question la liste des blocks contenant les données (pour ceux qui se jettent dans la doc, on met tous les champs de i_zone[] à 0)

Une fois ceci fait, on parcourt la table des inodes (pour lister les blocs occupés), la zonemap (liste des blocs enregistrés comme occupés sur le disque), et à partir de ça on est censé restaurer le fichier.

La première idée qui nous est venue, est donc de récupérer tous les blocks présents dans la zonemap, et non présents dans la liste obtenue après la lecture des inodes, et de les remettre dans l'inode que l'on veut restaurer.

Ça fonctionne, si on suppose une condition: les blocks ont été attribués par ordre croissant.

Seulement, il est évident que ça n'est pas toujours le cas.

Ma question est donc la suivante, comment peut-on faire, pour retrouver l'ordre correct de ces blocs? Est-ce qu'il y a, quelque part (en général, plus que sur Minix car je me doute que pas grand monde ne connait cet OS), un endroit qui nous dit dans quel ordre ont été alloué les blocs par exemple? Ou une quelconque autre manière de retrouver le vrai ordre de ces blocs ?

Merci par avance.

Xaelias

Lien vers le commentaire
Partager sur d’autres sites

Je ne pense pas qu'il y ait de logique certaine dans l'attribution des blocs. En revanche, il parait logique que l'OS va essayer d'attribuer des blocs contigus (pour minimiser la fragmentation), donc l'hypothèse qui vous faites sera probablement valable dans un paquet de cas (au moins les fichiers de taille raisonnable et si le FS n'est pas trop fragmenté).

Ensuite, quelques pistes pour ordonner des blocs d'un fichier : utiliser la structure du fichier. Tous les formats binaires ont des headers. C'est facile à identifier car il y a presque toujours une magic string et elle est souvent en début de block. Ensuite, si tu connais le format, tu peux généralement déduire des infos dessus, et donc permuter les blocs jusqu'à avoir quelque chose de valide.

Il y a aussi le fait que si un bloc est un bloc d'indirection, alors il contiendra une liste de pointeurs. Ces pointeurs menant aux blocs. Ça donne déjà un ordre partiel, car tu sais que ces blocs sont après ceux pointés sans indirection. De même avec double, voir triple indirection.

Ça n'a rien de trivial, ça restera toujours expérimental.

Lien vers le commentaire
Partager sur d’autres sites

On laisse de côté la triple indirection de toute façon ^^

Pour la simple et double en effet on peut les retrouver. Et pour ceux là, l'ordre est facile.

En vrai seuls les blocs directs (7 dans mon cas) posent potentiellement problème. Le délire c'est qu'on a clairement pas le temps de chercher à étudier différents types de fichiers pour savoir si les bloc ont une information quelconque qui pourrait permettre de les retrouver, et on nos tests tournent généralement sur des fichiers textes basiques, qui, sauf si je dis des bêtises, n'ont rien de particulier à ce niveau.

Je vais regarder cette histoire de magic string, ça a l'air marrant ^^

Merci :-)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...