• Récupération de partitions V - Récupération d'une partition NTFS sur un disque MBR basique

    Pour faire reparaitre une partition disparue, nous avons besoin de peu de chose pour faire cette recuperation:

    • Le NTFS Boot Sector de backup
    • Savoir retrouver la MFT pour être certain de récupérer la bonne partition

    Nous allons voir comment récupérer une partition qui a disparu suite à une opération manuelle malencontreuse.

    clip_image002

    Windows étant un petit paresseux, nous savons que quand on supprime une partition, seule l’entrée dans la table de partition est supprimée.

    Vérification: 

    clip_image003

    Dans les architectures récentes, les partitions NTFS commencent le plus souvent au secteur 2048 (les anciennes démarraient au secteur 63).

    Si ce n’est pas le cas, il faut chercher sur le disque. Certains éditeurs hexa permettent de le faire, dskprobe le permet.

    Dans notre cas, le secteur 2048 est bien un secteur d’amorçage NTFS :

    clip_image004

    Nous pouvons identifier facilement :

    • Le OEM ID String "NTFS"
    • Bytes par secteurs : 512
    • Secteurs par cluster : 8
    • Partition Size en secteurs : FF E7 DF 0F 00 00 00 00 --> FDFE7FF = 266332159 secteurs (à peu près 127 GB : 266332159*512/1024/1024/1024)

    Donc le NTFS Boot Sector de backup devrait se trouver au secteur 266334207 ( = 2048 + 266332159 )

    Allons voir :

    clip_image005

    Vérifions que nous retrouvons bien la MFT

    • Clusters to MFT : 00 00 0C 00 00 00 00 00 = 0xC0000 = 786432 clusters = 6291456 secteurs. En ajoutant 2048 ça fait:  6293504
    • Clusters to MFTMirr : 02 00 00 00 00 00 00 00 = 0x2 = 2 clusters = 16 secteurs. En ajoutant 2048 ça fait:  2064

    Le secteur 6293504 ressemble bien au premier metafichier de la MFT

    clip_image006

    Le metafichier $Volume nous fournit bien le bon nom de volume (à vérifier avec l’administrateur)

    clip_image007

    Donc en résumer, même si la partition a été supprimée, les données sont toujours présentes :

    • La partition est encadrée par les NTFS Boot Sector de début et de fin
    • Le NTFS Boot Sector pointe vers une MFT qui semble valide

    Ce qui reste à faire est donc la chose suivante :

    1. Enregistrer le contenu du secteur 2048 avec l’outil de votre choix (dskprobe permet de le faire)
    2. Recréer une nouvelle partition dans le gestionnaire de disque ou diskpart : Ne pas la formater.
    1. Si on formate la partition, on réécrit la MFT et toute les références au contenu de la partition. Gardons en tête que Windows est un petit paresseux : La MFT sera refaite, mais les données sur le disque seront toujours présentes jusqu’à ce qu’elles soient écrasées. Certains outils pourront encore vous aider mais il faudra y mettre le prix.
    2. En créant cette nouvelle partition
      1. Une nouvelle entrée est créée dans la table de partition
      2. Le secteur 2048 a été vidé

    • La dernière opération consiste en réécrire le secteur sauvegardé sur le 2048 et replacer le FileSystem à l’offset 01C2 : écrire 07

    Un rescan devrait faire reparaitre le disque.

    Ces étapes en image :

    1. Sauvegarde du contenu du secteur 2048 avec dskprobe2.exe

    clip_image009

    clip_image011

    2. Création de la partition sans la formater

    clip_image013

    Suivant … Suivant … Jusqu’à l’option de formatage : Choisir l’option "Do not format this volume"

    clip_image015

    Nous obtenons une partition RAW :

    clip_image017

    3. Ecraser le NTFS Boot sector par celui sauvegarder

    Dans DskProbe se placer sur le secteur 2048 du disque, et ouvrir le fichier que nous venons de sauvegarder

    clip_image019

    clip_image021

    Ecrire le fichier sur le secteur 2048

    clip_image023

    Vérifier qu’on écrit bien 1 secteur sur le secteur 2048 et cliquer sur "Write"

    clip_image025

    Retourner au secteur 0 et remplacer le "06" à l’offset 1C2 par "07" : bien presser la touche 0 et la touche 7.

    clip_image027

    Puis faire un Write

    clip_image029

    Un Rescan Disk dans le Disk Manager fait reparaitre le disque

    Serge Gourraud
    55 AA

  • Recupération de partitions IV : Identification d’une partition NTFS

    Pour pouvoir récupérer une partition NTFS, il faut savoir l'identifier. Une partition NTFS contient essentiellement:

    • Un secteur d'amorçage NTFS (NTFS BootSector) en début de partition
    • Une MFT (la database de NTFS)
    • Une copie alternative des 3 premiers enregistrements de cette MFT
    • Un secteur de backup du NTFS Boot Sector en fin de partition

    clip_image001

    Pour une description complète de chacun des champs : http://technet.microsoft.com/fr-fr/library/cc781134(WS.10).aspx

    Pour rappel, la table de partition 0 nous montrait une partition démarrant au secteur 2048 et occupant 122972160 :

    clip_image002

    Examinons en détails le NTFS Boot Sector

    clip_image003

    Si on dresse un tableau de ces données on obtient ça:

     

    Byte Offset

    Field Length

    Sample Value

    Field Name

    0x00

    3 bytes

    EB 52 90

    Jump Instruction

    0x03

    8 bytes

    NTFS

    OEM ID

    0x0B

    2 bytes

    00 02 (512)

    Bytes per sector

    0x0D

    1 byte

    08

    Sectors per Cluster

    0x0E

    2 bytes

    00 00

    Reserved Sectors

    0x10

    3 bytes

    00 00 00

    Must be 0

    0x13

    2 bytes

    00 00

    Must be 0

    0x15

    1 byte

    F8

    Media Descriptor

    0x16

    2 bytes

    00 00

    Must be 0

    0x18

    2 bytes

    3F 00

    Not used

    0x1A

    2 bytes

    FF 00

    Not used

    0x1C

    4 bytes

    00 08 00 00 (0x800 = 2048)

    Not used

    0x20

    4 bytes

    00 00 00 00

    Must be 0

    0x24

    4 bytes

    80 00 80 00

    Not used

    0x28

    8 bytes

    FF 67 54 07 00 00 00 00 (122972159)*

    Total Sectors

    0x30

    8 bytes

    00 00 0C 00 00 00 00 00 (786432)

    Clusters to $MFT

    0x38

    8 bytes

    02 00 00 00 00 00 00 00 (2)

    Clusters to $MFTMirr

    0x40

    1 byte

    F6 (246) **

    Clusters Per MFT Record

    0x41

    3 bytes

    00 00 00

    Not used

    0x44

    1 byte

    01

    Clusters Per Index Buffer

    0x45

    3 bytes

    00 00 00

    Not used

    0x48

    8 bytes

    31 DD 45 AE 2B 46 AE FE

    Volume Serial Number

    0x50

    4 bytes

    00 00 00 00

    Not used

    *La table de partition présente au secteur 0 nous avait indiqué une partition occupant 122972160 secteurs. Ca fait un secteur de plus, car dans cette table, on compte le 1er secteur de la partition ainsi que le dernier. Dans le secteur d’amorçage NTFS on compte un secteur de moins. Il faudra s’en rappeler quand nous ferons des réparations.

    **La taille de chaque enregistrement. NTFS fera un enregistrement pour chaque fichier et répertoire de son volume. Ceux dont la taille est inférieur à la taille d’un enregistrement sont résident dans la MFT. Si ce nombre est positif (entre 00 et 7F) alors il represente le nombre de cluster par enregistrement. Si le nombre est négatif (de 80 à FF), alors la taille d’un enregistrement est 2 à la puissance la valeur absolue de la valeur de ce champ.

    • Dans notre exemple, nous pouvons lire la valeur 0xF6. C’est une valeur négative, et sa valeur absolue est 0x0A (10 en décimal). Donc la taille d’un enregistrement sera de 2^10 = 1024 Bytes (1K)
    • Si nous avions formaté la partition avec le paramètre /L, nous aurions lu la valeur 0x01 dans le champ clusters per MFT Record. Dans ces condition, la taille d’un record aurait été 1 cluster. Comme 1 cluster occupe 8 secteurs, ça nous aurait donné 4K par enregistrement (ce qui est bien le but du paramètre /L)

    Clusters to MFT est de 786432, et nous avons 8 secteurs par cluster. Donc, la MFT est localisée au secteur 6293504 ( = 2048 + 786432 * 8 )

    Nous pouvons voir à cet emplacement, le premier fichier de la MFT : $MFT

    clip_image004

    Sachant que chaque enregistrement occupe 1K, il est possible de parcourir tous les enregistrements de la MFT jusqu’à, par exemple, l’enregistrement $Volume qui fournit le nom du volume. Puisqu’il s’agit du 4ième, nous le trouverons au secteur 6293510.

    clip_image005

    Si nous ne trouvons rien de ce genre à cet emplacement, c’est que soit la donnée a été écrasée, soit qu’on n’est pas au bon endroit : Le secteur d’amorçage n’est peut-être pas le bon, ou contient de mauvaises informations

    Dans l’article suivant nous récupérons une partition.

    Serge Gourraud

    55 AA

  • Recupération de partitions III : Structures des disques basiques MBR - Les partitions étendues

    Recupération de partitions III : Structures des disques basiques MBR - Les partitions étendues

    Dans l’article précédent, nous avons vu un exemple de partitionnement contenant une et plusieurs partitions primaires. Afin de pouvoir mettre plus de quatre partitions sur un disque, il existe un système de partition étendue. En quelques mots :

    -        Si vous souhaitez 1 à 4 partitions : Vous aurez 4 partitions primaires

    -        Si vous souhaitez 5 partitions ou plus : Vous aurez 3 partitions primaires et 1 partition étendue contenant autant de volumes que souhaité.

    Si on observe la table de partition à l’éditeur hexa, on sait qu’il n’y a la place que pour 4 entrées et on voit bien que les 4 entrées sont occupées.

    La dernière entrée a ceci de particulier qu’elle est de type 0x0F (partition étendue), et qu’elle occupe 30722048 secteurs (ce qui nous donnerait à peu près 14 GB pour des secteurs de 512 Bytes)

    Donc, si nous refaisons notre petit tableau récapitulatif:

    Partition

    Partition 1

    Partition 2

    Partition 3

    Partition 4

    Boot indicator

    0

    0

    0

    0

    Starting Head

    20 = 32

    254

    254

    254

    Starting Sector

    21 = 33

    63

    63

    63

    Starting Cylinder

    0

    1023

    1023

    1023

    System ID

    07 (NTFS)

    07 (NTFS)

    07 (NTFS)

    0F (Extended)

    Ending Head

    FE = 254

    254

    254

    254

    Ending Sector

    63

    63

    63

    63

    Ending Cylinder

    1023

    1023

    1023

    1023

    Relative Sector

    00000800 = 2048

    07547000 = 122974208

    0A61B000 = 174174208

    0E0B3000 = 235614208

    Total Sectors

    07546800 = 122972160

    030D4000 = 51200000

    03A98000 = 61440000

    01D4C800 = 30722048

    Avant d’aller plus loin regardons à quoi ressemble le premier secteur d’une partition NTFS. La première partition (PPart01) est sensé démarrer au secteur 2048, et voici le secteur 2048 :

    Nous détaillerons le contenu de ce secteur dans la partie 4, mais pour l’instant nous avons juste besoin de savoir que ce secteur est signé "55 AA" et qu’il contient bien le OEM ID "NTFS".

    Regardons maintenant ce qui se trouve au secteur 235614208 (entrée de la 4ième partition). Il est quasiment vide, mais nous pouvons y reconnaitre une nouvelle table de partition dans la partie inférieure.

    Cette table de partition contient deux entrées:

    En passant tout ça à la moulinette, on peut construire ce petit tableau:

    Partition

    Entry 1

    Entry 2

    Entry 3

    Entry 4

    Boot indicator

    0

    0

    0

    0

    Starting Head

    254

    254

    0

    0

    Starting Sector

    63

    63

    0

    0

    Starting Cylinder

    1023

    1023

    0

    0

    System ID

    07 (NTFS)

    05 (Extended)

    0

    0

    Ending Head

    254

    254

    0

    0

    Ending Sector

    63

    63

    0

    0

    Ending Cylinder

    1023

    1023

    0

    0

    Relative Sector

    00000800 = 2048

    00FA0800 = 16386048

    0

    0

    Total Sectors

    005DB800 = 6141952

    003E8000 = 4096000

    0

    0

    Quand on parcours une partition étendue, le Relative Sector ne fait pas référence au début du disque, mais au début de la partition étendue.

    Comme notre partition étendue démarre au secteur 235614208, le premier volume NTFS devrait se trouver au secteur 235616256 ( = 235614208 + 2048 )

    Cela reseemble bien à un secteur NTFS:

    Maintenant, regardons ce qui se trouve à la seconde entrée de la table de partition. Son Relative Sector est 10242048 et la partition étendue démarrait au secteur 235614208. Donc l’entrée doit nous faire pointer vers le secteur 245856256 ( = 235614208 + 10242048 ). Allons voir :

    C'est une nouvelle table de partition contenant ces informations:

    Partition

    Entry 1

    Entry 2

    Entry 3

    Entry 4

    Boot indicator

    0

    0

    0

    0

    Starting Head

    254

    254

    0

    0

    Starting Sector

    63

    63

    0

    0

    Starting Cylinder

    1023

    1023

    0

    0

    System ID

    07 (NTFS)

    05 (Extended)

    0

    0

    Ending Head

    254

    254

    0

    0

    Ending Sector

    63

    63

    0

    0

    Ending Cylinder

    1023

    1023

    0

    0

    Relative Sector

    00000800 = 2048

    00FA0800 = 16386048

    0

    0

    Total Sectors

    005DB800 = 6141952

    003E8000 = 4096000

    0

    0

    La partition NTFS suivante démarre au secteur 245858304 ( = 245856256 + 2048 ) et la prochaine table de partition au secteur 252000256 ( = 235614208 + 16386048 )

    Comme nous n’avons que 3 volumes dans la partition étendue, ce table de partition devrait être la dernière qui pointe vers une partition NTFS et nous n’avons qu’une seule entrée puisque nous n’avons pas d’autres volumes à déclarer.

    Voilà comment Windows s’y prend pour faire entrer plusieurs partitions dans des tables qui ne peuvent en contenir que 4.

    Dans l’article suivant, nous allons détailler le contenu d’un secteur d’amorçage NTFS afin de pouvoir commencer les réparations.

    Serge Gourraud

    55 AA

  • Recupération de partitions II : Structures des disques basiques MBR - Configurations simples et courantes

    Dans l'article précédent, nous avons vu comment sont structurés les partitions et volumes sur les disques. Nous allons voir cela da façon concrète sur un disque MBR Basique.

    Pour cela, j'utilise un éditeur hexadécimal et ouvre le disque aux secteurs qui m'interressent. L'éditeur que j'utilise s'apelle dskprobe.exe (un outil Microsoft assez basique qui affiche les secteurs par pages de 512 Bytes) mais vous pouvez utiliser celui qui vous convient le mieux. Une liste est disponible sur http://fr.wikipedia.org/wiki/%C3%89diteur_hexad%C3%A9cimal

    Ouvrons le secteur 0 d'un disque MBR Basique.

    image

    En rouge:

    • La signature du disque de l'offset 0x01B8 à l'offset 0x01BB : 26 A8 75 C2.
      • Il faut lire cette information en little endian : C275A826
    • Une sorte de signature du secteur : 55 AA
      • Vous la trouverez sur pas mal de secteurs importants du disque. Elle est indispensable.

    En surligné : La table de partition, contenant 4 entrée.

    • La 1ère entrée commence à l'offset 0x1BE et termine à l'offset 0x1CD : Elle contient les coordonnées d'une partition
    • La 2ième entrée commence à l'offset 0x1CE et termine à l'offset 0x1DD : Celle-ci est vide
    • La 3ème entrée commence à l'offset 0x1DE et termine à l'offset 0x1ED : Celle-ci est vide
    • La 4ème entrée commence à l'offset 0x1EE et termine à l'offset 0x1FD : Celle-ci est vide

    La partie au dessus est du code.

    Focalisons-nous sur la première entrée de la table de partition, et essayons de lui faire correspondre la description disponible sur http://technet.microsoft.com/en-us/library/cc739412(v=ws.10).aspx

    clip_image001

     

    Offset

    Taille du champ

    Valeur

    Nom du champ

    01BE

    1 byte

    00

    Indicateur de boot:

    • 00 indique que la partition n'est pas bootable
    • 80 indique que la partition est pas bootable

    01BF

    1 byte

    20

    Starting Head : 0x20 = 32 en décimal

    01C0

    6 bits

    21

    Starting Sector : 0x21 = 00100001 -> 00 100001 = 33

    01C1

    10 bits

    00

    Starting Cylinder : 0x00 = 00000000 -> 00 00000000 = 0

    01C2

    1 byte

    07

    Type de partition. 07 signifie NTFS

    http://technet.microsoft.com/en-us/library/cc739412(v=ws.10).aspx

    01C3

    1 byte

    FE

    Ending Head : 0xFE = 254

    01C4

    6 bits

    FF

    Ending Sector : 0xFF = 11111111 -> 11111111

    = 111111 = 63

    01C5

    10 bits

    FF

    Ending Cylinder : 0xFF = 11111111 -> 11 11111111 = 1111111111 = 1023

    01C6

    4 bytes

    00 08 00 00

    Relative Sector : 1er secteur de la partition (en GPT on appelera ça Starting LBA)

    En little endian, lire : 00 00 08 00 = 0x800 = 2048

    01CA

    4 bytes

    00 E8 DF 0F

    Total Sectors : Le nombre de secteurs de la partition

    0x0FDFE800 = 266332160

     

    Ca veut dire que ce disque contient une partition NTFS qui démarre au secteur 2048 et occupe 266332160 secteurs.

    Nous ne savons pas encore exactement quelle taille cela fait en Bytes, mais la plupart du temps, 1 secteur occupe 512 bytes. Ce qui nous fait (si on a des secteurs de 512 bytes)

    • 266332160 * 512 = 136362065920 bytes
    • 136362065920 / 1024 / 1024 / 1024 = 126.9971 GBytes

    Considérons maintenant quelque chose d'un peu plus fréquent: Un disque contenant plusieurs partitions.

    Notre table de partition au secteur 0 pourrait bien ressembler à cela:

    clip_image002

    Ce qui nous donne ce petit tableau récapitulatif:

    Partition

    Partition 1

    Partition 2

    Partition 3

    Partition 4

    Indicateur de boot

    0

    0

    0

    0

    Starting Head

    20 = 32

    254

    254

    0

    Starting Sector

    21 * = 33

    63

    63

    0

    Starting Cylinder

    0 *

    1023

    1023

    0

    System ID

    07 (NTFS)

    07 (NTFS)

    07 (NTFS)

    0

    Ending Head

    FE = 254

    254

    254

    0

    Ending Sector

    63 *

    63

    63

    0

    Ending Cylinder

    1023 *

    1023

    1023

    0

    Relative Sector

    00000800 * = 2048

    07547000 = 122974208

    0A61B000 = 174174208

    0

    Total Sectors

    07546800 * = 122972160

    030D4000 = 51200000

    03A98000 = 61440000

    0

    * *Toujours en suivant la petite moulinette de ne garder que 6 bits sur le 1er champ, et d'ajouter les 2 restants aux 8 d champs suivant

    *A lire en little endian

    Dans l’article suivant, nous détaillerons un disque contenant des partitions étendues.

    Serge Gourraud

    55 AA

  • Recupération de partitions I : Quelques définitions et structures

    Dans les articles qui suivent, nous évoquerons ces termes à maintes reprises. Autant se familiariser tout de suite avec ces termes :

    • LBA = Logical Block Address : Le numéro du secteur. En général, un secteur fait 512 bytes ou 4 KBytes
    • LDM = Logical Disk Manager
    • MFT = Master File Table. La database du système de fichiers NTFS.
      • http://msdn.microsoft.com/en-us/library/windows/desktop/aa365230(v=vs.85).aspx
    • MBR = Master Boot Recor
    • PBS = Partition Boot Sector : Le premier secteur d'une partition.
    • BPB : BIOS Parameter Block : Une partie du PBS
    • GPT = GUID Partition Table.

    L'objectif de ces articles est de parcourir les secteurs importants des disques pour comprendre où pourrait se placer une corruption et de la réparer (quand c'est possible) juste en écrivant la bonne information au bon endroit. Toutes les structures que nous allons parcourir sont déjà décrites dans MSDN.

    Aussi, si vous souhaitez avoir plutôt une approche développeur, un bon point de départ serait d'invoquer un DeviceIoControl en utilisant le control code IOCTL_DISK_GET_DRIVE_LAYOUT_EX (cf. http://msdn.microsoft.com/fr-fr/library/windows/desktop/aa365174(v=vs.85).aspxpour plus de détails)

    Ce contrôle vous fournira une structure de type DRIVE_LAYOUT_INFORMATION_EX

    typedef struct _DRIVE_LAYOUT_INFORMATION_EX {

    DWORD PartitionStyle;

    DWORD PartitionCount;

    union {

    DRIVE_LAYOUT_INFORMATION_MBR Mbr;

    DRIVE_LAYOUT_INFORMATION_GPT Gpt;

    };

    PARTITION_INFORMATION_EX PartitionEntry[1];

    } DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;

    Nous n'évoquerons pas d'avantage cette approche dans cette série, mais cela pourrait faire le sujet d'une autre série si la demande est forte.

    Comme expliqué, la MSDn regorge de schémas explicatifs mais essayons de les présenter différemment afin d'afficher plutôt une comparaison de ces structures, si cela peut aider.

    Comparaison MBR et GPT

    Différences principales (liste non exhaustive) dans les fonctionnalités:

     

    MBR

    GPT

    Nombre de partitions primaires

    4

    128

    Taille de disque maximale

    2 TB

    2^64 LBA = 8*2^30 TB

    Protection de la table de partition

    NON

    OUI

    Quelques références:

    Comparaisons des structures identifiables, écrites à plat sur les disques basiques

    Pour avoir une vision complète des disques basiques, aller sur http://technet.microsoft.com/en-us/library/cc739412(v=ws.10).aspx

    clip_image002

    Comparaisons des structures identifiables, écrites à plat sur les disques dynamiques

    Pour avoir une vision complète des disques dynamiques, aller sur http://technet.microsoft.com/fr-fr/library/cc758035(v=WS.10).aspx

    clip_image004

    Comparaisons des disques basique et dynamiques

    Différences principales (liste non exhaustive) en terme de fonctionnalités

     

    Basiques

    Dynamiques

    Nombre maximal de volumes

    4

    > 4*

    RAID Logiciel

    NON

    OUI

    Protection des volumes

    NON

    OUI

    Extension de volumes

    OUI **

    OUI

    * Le nombre de volumes que peut supporter un disque dynamique n'est pas illimité car la database est limitée à 1 MB. Sachant que chaque disque dynamique attaché à un système contient la descroption de tous les volumes de ce système, rajouter des disques n'augmentera pas cette limite. Au contraire, il faudra rajouter des enregistrement pour en plus pour décrire le nouveau disque.

    **Il est possible d'étendre un volume sur plusieurs disques dynamique, mais sur des disques basiques, on ne peut rester que sur le même disque.

    Les différents types de volumes sont décrit sur : http://technet.microsoft.com/fr-fr/library/cc737048(v=WS.10).aspx

    clip_image006

    Dans le post suivant, nous allons tenter de voir concrètement comment cela se traduit en donnée brute écrite sur les disques.

    Serge Gourraud

    55 AA