Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/04/2010, à 10:36

Nasman

MBR cet inconnu

De nombreuses questions ont pour sujet le mbr du disque et des partitions. Je me propose de faire un petit topic à ce sujet et qui, je l'espère amènera à un wiki. Je ne sais pas si ce sujet est dans la bonne rubrique et si ce n'est pas le cas, merci à un modérateur de le déplacer où il faut.

Pour commencer je vais prendre mon disque à titre d'exemple.

Le partitionnement est le suivant:


$ sudo fdisk -l


Disque /dev/sda: 160.0 Go, 160041885696 octets
255 têtes, 63 secteurs/piste, 19457 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x525d525d

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sda1   *           1        3925    31527531    7  HPFS/NTFS
/dev/sda2            3926        9051    41174595    7  HPFS/NTFS
/dev/sda3            9052       10963    15358140   83  Linux
/dev/sda4           10964       19457    68228024+   5  Etendue
/dev/sda5           10964       11231     2152678+  82  Linux swap / Solaris
/dev/sda6           11232       19457    66075313+  83  Linux

Quel est le mbr correspondant (qui ne donne des informations que sur les partitions principales - voire étendues).
Pour cela on va afficher les 512 premiers octets du disque sda - valeurs hexa et transcription en ascii. Pour les caractères ascii, seules les chaines de caractères des messages d'erreur sont compréhensibles.

La commande est

sudo dd if=/dev/sda bs=512 count=1 | hexdump -C

Ce qui signifie de faire une copie (en mode root) en prenant pour source (if) le "device" (dev) sda
bs=512 signifie que la taille du bloc copié fait 512 octets (soit un secteur)
count=1 : un seul bloc (un seul secteur)
| pipe, transfert la sortie vers un autre traitement
hexdump -C : sortie sous forme de caractères ascii

Le résultat est le suivant:

00000000  eb 63 90 d0 bc 00 7c 8e  c0 8e d8 be 00 7c bf 00  |.c....|......|..|
00000010  06 b9 00 02 fc f3 a4 50  68 1c 06 cb fb b9 04 00  |.......Ph.......|
00000020  bd be 07 80 7e 00 00 7c  0b 0f 85 10 01 83 c5 10  |....~..|........|
00000030  e2 f1 cd 18 88 56 00 55  c6 46 11 05 c6 46 10 00  |.....V.U.F...F..|
00000040  b4 41 bb aa 55 cd 13 5d  72 0f 81 fb 55 aa 75 09  |.A..U..]r...U.u.|
00000050  f7 c1 01 00 74 03 fe 46  10 66 00 80 01 00 00 00  |....t..F.f......|
00000060  00 00 00 00 ff fa 90 90  f6 c2 80 75 02 b2 80 ea  |...........u....|
00000070  74 7c 00 00 31 c0 8e d8  8e d0 bc 00 20 fb a0 64  |t|..1....... ..d|
00000080  7c 3c ff 74 02 88 c2 52  bb 17 04 80 27 03 74 06  ||<.t...R....'.t.|
00000090  be 88 7d e8 1c 01 be 05  7c f6 c2 80 74 48 b4 41  |..}.....|...tH.A|
000000a0  bb aa 55 cd 13 5a 52 72  3d 81 fb 55 aa 75 37 83  |..U..ZRr=..U.u7.|
000000b0  e1 01 74 32 31 c0 89 44  04 40 88 44 ff 89 44 02  |..t21..D.@.D..D.|
000000c0  c7 04 10 00 66 8b 1e 5c  7c 66 89 5c 08 66 8b 1e  |....f..\|f.\.f..|
000000d0  60 7c 66 89 5c 0c c7 44  06 00 70 b4 42 cd 13 72  |`|f.\..D..p.B..r|
000000e0  05 bb 00 70 eb 76 b4 08  cd 13 73 0d f6 c2 80 0f  |...p.v....s.....|
000000f0  84 d0 00 be 93 7d e9 82  00 66 0f b6 c6 88 64 ff  |.....}...f....d.|
00000100  40 66 89 44 04 0f b6 d1  c1 e2 02 88 e8 88 f4 40  |@f.D...........@|
00000110  89 44 08 0f b6 c2 c0 e8  02 66 89 04 66 a1 60 7c  |.D.......f..f.`||
00000120  66 09 c0 75 4e 66 a1 5c  7c 66 31 d2 66 f7 34 88  |f..uNf.\|f1.f.4.|
00000130  d1 31 d2 66 f7 74 04 3b  44 08 7d 37 fe c1 88 c5  |.1.f.t.;D.}7....|
00000140  30 c0 c1 e8 02 08 c1 88  d0 5a 88 c6 bb 00 70 8e  |0........Z....p.|
00000150  c3 31 db b8 01 02 cd 13  72 1e 8c c3 60 1e b9 00  |.1......r...`...|
00000160  01 8e db 31 f6 bf 00 80  8e c6 fc f3 a5 1f 61 ff  |...1..........a.|
00000170  26 5a 7c be 8e 7d eb 03  be 9d 7d e8 34 00 be a2  |&Z|..}....}.4...|
00000180  7d e8 2e 00 cd 18 eb fe  47 52 55 42 20 00 47 65  |}.......GRUB .Ge|
00000190  6f 6d 00 48 61 72 64 20  44 69 73 6b 00 52 65 61  |om.Hard Disk.Rea|
000001a0  64 00 20 45 72 72 6f 72  0d 0a 00 bb 01 00 b4 0e  |d. Error........|
000001b0  cd 10 ac 3c 00 75 f4 c3  5d 52 5d 52 00 00 80 01  |...<.u..]R]R....|
000001c0  01 00 07 fe ff ff 3f 00  00 00 d6 24 c2 03 00 00  |......?....$....|
000001d0  c1 ff 07 fe ff ff 15 25  c2 03 86 8c e8 04 00 fe  |.......%........|
000001e0  ff ff 83 fe ff ff 9b b1  aa 08 78 b1 d4 01 00 fe  |..........x.....|
000001f0  ff ff 05 fe ff ff 50 63  7f 0a 71 27 22 08 55 aa  |......Pc..q'".U.|
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 0,00120127 s, 426 kB/s
00000200

A part quelques chaines reconnaissables, cela ressemble à du charabia. On voit seulement que GRUB est dans le mbr.

Le mbr se compose d'une partie exécutable - de l'adresse 0 à 1b7 (adresses en hexa, soit de 0 à 439), d'identifiant disque de 1b8 à 1bb (440-443), soit les octets 5d 52 5d 52 pour Identifiant de disque : 0x525d525d (transcription en mode little endian - les octets de poids faible d'abord).
Viennent deux octets nuls en 1bc et 1bd (444 et 445) puis la fameuse table des partitions à partir de l'adresse 1be (446).
Cette table contient 4 entrées de 16 octets, soit 4 partitions primaires (voire étendue) possibles. Si la partition est inexistante il y aura 16 zéros.
Cette table de 64 octets (16x4) s'étend de 1be à 1fd (446 à 509).(edit : correction adresse)

Enfin le mbr se termine par les octets 55 aa signifiant un média (disque) bootable - nous amenant à l'adresse 1ff (511).


La suite pour plus tard portera sur la signification des 16 octets d'une partition primaire.

Dernière modification par Nasman (Le 25/09/2013, à 08:53)


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#2 Le 17/04/2010, à 14:10

Nasman

Re : MBR cet inconnu

Suite du topic - La table des partitions.
Cette dernière commençant à l'adresse 1be (446), nous nous contenterons d'afficher que les 64 octets à partir de cette adresse (pour que chaque partition représente une ligne de code.

$ sudo dd if=/dev/sda bs=1 count=64 skip=446 | hexdump -C
[sudo] password for xxxxxx 
00000000  80 01 01 00 07 fe ff ff  3f 00 00 00 d6 24 c2 03  |........?....$..|
00000010  00 00 c1 ff 07 fe ff ff  15 25 c2 03 86 8c e8 04  |.........%......|
00000020  00 fe ff ff 83 fe ff ff  9b b1 aa 08 78 b1 d4 01  |............x...|
00000030  00 fe ff ff 05 fe ff ff  50 63 7f 0a 71 27 22 08  |........Pc..q'".|
00000040
64+0 enregistrements lus
64+0 enregistrements écrits
64 octets (64 B) copiés, 0,000360212 s, 178 kB/s

La première partition est décrite par

80 01 01 00 07 fe ff ff  3f 00 00 00 d6 24 c2 03

En groupant les différents octets selon leur rôle nous avons
80    01 01 00    07    fe ff ff     3f 00 00 00    d6 24 c2 03

80 (128 en décimal) signifie que c'est la partition de boot (étoile) - un OS doit s'y trouver (ou du moins un truc permettant de lancer l'OS)
/dev/sda1   *           1        3925    31527531    7  HPFS/NTFS

Pour le 01 01 00 il faut connaitre un minimum la géométrie d'un disque dur. Ce dernier est constitué de plateaux magnétiques possédant 2 faces. L'ensemble des plateaux est lu par des têtes de lectures (1 tête par face). Ceci introduit la notion de tête.

Les plateaux étant en rotation, une zone circulaire est donc lue, c'est la piste. Il y a une piste de lue par tête. Enfin la piste (zone annulaire) est découpée en secteurs, en principe de 512 octets.

Le début du disque correspond à la piste la plus externe. L'ensemble des pistes situées à même distance de l'axe de rotation est appelé cylindre.
La taille d'un cylindre est donc égal au nombre de secteurs par piste multipliée par le nombre de têtes.

La géométrie d'un disque réel peut différer de ce qui est énoncé mais les systèmes considèrent la découpe du disque comme indiquée.

En général il y a 63 secteurs par piste et 255 têtes, la capacité du disque variant avec le nombre de cylindres. Ceci nous amène donc à une taille de cylindre de:
63x255=16065 secteurs de 512 octets, soit 8225280 octets.

Le disque est lu en commençant par la piste la plus externe, la première tête et le premier secteur (A cet endroit se trouve le mbr), on passe ensuite au secteur suivant sur la première piste et première tête - jusqu'au secteur 63. La lecture se poursuit alors sur le premier secteur de la deuxième tête, puis sur le deuxième secteur de cette même tête.
Ceci se poursuit jusqu'au 63ème secteur de la 255ème tête.
L'ensembles des têtes se déplacent alors vers le centre du disque pour lire les pistes plus internes - il y a changement de cylindre. On attaque alors le premier secteur de la première tête du deuxième cylindre.

Dans le type de notation, tête secteur et cylindre, les numéros de secteurs vont de 1 à 63 (1 à 3f en hexa), les têtes de 0 à 254 (0 à fe en hexa) et les cylindres vont de (0 à 1023).
8 bits sont utilisés pour coder la tête, 6 bits sont utilisés pour coder le secteur et 10 bits sont utilisés pour coder le cylindre.

Revenons maintenant à nous moutons (pardon, octets) 01 01 00, soit en binaire:
00000001 00000001 00000000

Ces valeurs indiquent le début de la partition dans ce système de tête, secteurs et cylindre mais si le premier octet correspond à la tête, le deuxième code à la fois le secteur et le cylindre (bits de poids fort) et le dernier code partiellement le cylindre.
Il faudrait découper ces 3 octets ainsi:
00000001      00 000001     00000000
Les bits en gras codent le cylindre ainsi 00 00000000

La partition commence alors à la tête 00000001 (1), au secteur 000001 (1) et au cylindre 0000000000 (0)

Voyons maintenant l'octet suivant, soit 07
Le 07 correspond au système de fichiers ntfs

Le groupe suivant fe ff ff renseigne sur la fin de la partition (selon le principe énoncé précédemment). Elle se situe sur la tête 254 (dernière tête), le secteur 63 (111111 en binaire) et le cylindre 1023 (1111111111). En fait cette information n'est pas utilisable si la partition est plus grande que ce qu'autorise ce système. En effet le système de tête, secteur et cylindre (codé sur 3 octets) est limité à 255x63x1024 secteurs, soit 16450560 secteurs, soit 8422686720 octets soit 7,844238281 Gio - c'est la limite des 8 Go des bios anciens.

Groupe suivant 3f 00 00 00. Il représente l'emplacement du début de la partition dans le système d'adresse linéaire qui commence au secteur "zéro" et va jusqu'à la fin du disque (on ne se préoccupe plus des têtes, cylindres...). Cette adresse est une adresse hexa en mode little endian, soit en définitive l'adresse 0000003f, soit 63 en décimal.
Cette partition commence donc au 64ème secteur du disque, soit au premier secteur de la deuxième tête du premier cylindre.

Dernier groupe d6 24 c2 03, il indique la taille de la partition en secteurs (hexa little endian), soit 0x03c224d6 soit 63055062 secteurs de 512 octets, soit 31527531 kio. C'est la taille indiquée dans le fdisk -l à la rubrique nombre de blocs
/dev/sda1   *           1        3925    31527531    7  HPFS/NTFS

L'espace qui suit cette partition commence donc à l'adresse 0000003f+03c224d6=3c22515, soit au secteur 63055125.
Remarque: le secteur 63055125 est au début du cylindre 6305512/16065 = 3925 si on compte zéro pour le premier cylindre du disque et 3926 si on commence à 1. C'est le début de la partition sda2
/dev/sda2            3926        9051    41174595    7  HPFS/NTFS

Le partitionnement a été fait en utilisant l'option arrondir au cylindre pour la taille de la partition.

Connaissant le début de la partition sda2, on peut l'explorer des deux façons suivantes.

1) En affichant la zone amorce de la partition

sudo dd if=/dev/sda2 bs=512 count=1 | hexdump -C
00000000  eb 52 90 4e 54 46 53 20  20 20 20 00 02 08 00 00  |.R.NTFS    .....|
00000010  00 00 00 00 00 f8 00 00  3f 00 ff 00 15 25 c2 03  |........?....%..|
00000020  00 00 00 00 80 00 80 00  78 8c e8 04 00 00 00 00  |........x.......|
00000030  00 00 0c 00 00 00 00 00  24 d7 13 00 00 00 00 00  |........$.......|
00000040  f6 00 00 00 01 00 00 00  e1 e5 9a 9c 2c 9b 9c b6  |............,...|
00000050  00 00 00 00 fa 33 c0 8e  d0 bc 00 7c fb b8 c0 07  |.....3.....|....|
00000060  8e d8 e8 16 00 b8 00 0d  8e c0 33 db c6 06 0e 00  |..........3.....|
00000070  10 e8 53 00 68 00 0d 68  6a 02 cb 8a 16 24 00 b4  |..S.h..hj....$..|
00000080  08 cd 13 73 05 b9 ff ff  8a f1 66 0f b6 c6 40 66  |...s......f...@f|
00000090  0f b6 d1 80 e2 3f f7 e2  86 cd c0 ed 06 41 66 0f  |.....?.......Af.|
000000a0  b7 c9 66 f7 e1 66 a3 20  00 c3 b4 41 bb aa 55 8a  |..f..f. ...A..U.|
000000b0  16 24 00 cd 13 72 0f 81  fb 55 aa 75 09 f6 c1 01  |.$...r...U.u....|
000000c0  74 04 fe 06 14 00 c3 66  60 1e 06 66 a1 10 00 66  |t......f`..f...f|
000000d0  03 06 1c 00 66 3b 06 20  00 0f 82 3a 00 1e 66 6a  |....f;. ...:..fj|
000000e0  00 66 50 06 53 66 68 10  00 01 00 80 3e 14 00 00  |.fP.Sfh.....>...|
000000f0  0f 85 0c 00 e8 b3 ff 80  3e 14 00 00 0f 84 61 00  |........>.....a.|
00000100  b4 42 8a 16 24 00 16 1f  8b f4 cd 13 66 58 5b 07  |.B..$.......fX[.|
00000110  66 58 66 58 1f eb 2d 66  33 d2 66 0f b7 0e 18 00  |fXfX..-f3.f.....|
00000120  66 f7 f1 fe c2 8a ca 66  8b d0 66 c1 ea 10 f7 36  |f......f..f....6|
00000130  1a 00 86 d6 8a 16 24 00  8a e8 c0 e4 06 0a cc b8  |......$.........|
00000140  01 02 cd 13 0f 82 19 00  8c c0 05 20 00 8e c0 66  |........... ...f|
00000150  ff 06 10 00 ff 0e 0e 00  0f 85 6f ff 07 1f 66 61  |..........o...fa|
00000160  c3 a0 f8 01 e8 09 00 a0  fb 01 e8 03 00 fb eb fe  |................|
00000170  b4 01 8b f0 ac 3c 00 74  09 b4 0e bb 07 00 cd 10  |.....<.t........|
00000180  eb f2 c3 0d 0a 45 72 72  2e 20 6c 65 63 74 75 72  |.....Err. lectur|
00000190  65 20 64 69 73 71 75 65  00 0d 0a 4e 54 4c 44 52  |e disque...NTLDR|
000001a0  20 6d 61 6e 71 75 65 00  0d 0a 4e 54 4c 44 52 20  | manque...NTLDR |
000001b0  65 73 74 20 63 6f 6d 70  72 65 73 73 82 00 0d 0a  |est compress....|
000001c0  45 6e 74 72 65 7a 20 43  74 72 6c 2b 41 6c 74 2b  |Entrez Ctrl+Alt+|
000001d0  53 75 70 70 72 20 70 6f  75 72 20 72 65 64 82 6d  |Suppr pour red.m|
000001e0  61 72 72 65 72 0d 0a 00  0d 0a 00 00 00 00 00 00  |arrer...........|
000001f0  00 00 00 00 00 00 00 00  83 99 a8 be 00 00 55 aa  |..............U.|
00000200
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 0,0156639 s, 32,7 kB/s

On voit la marque NTFS au début

2) En affichant le secteur 63055125 du disque

$ sudo dd if=/dev/sda bs=512 count=1 skip=63055125 | hexdump -C
00000000  eb 52 90 4e 54 46 53 20  20 20 20 00 02 08 00 00  |.R.NTFS    .....|
00000010  00 00 00 00 00 f8 00 00  3f 00 ff 00 15 25 c2 03  |........?....%..|
00000020  00 00 00 00 80 00 80 00  78 8c e8 04 00 00 00 00  |........x.......|
00000030  00 00 0c 00 00 00 00 00  24 d7 13 00 00 00 00 00  |........$.......|
00000040  f6 00 00 00 01 00 00 00  e1 e5 9a 9c 2c 9b 9c b6  |............,...|
00000050  00 00 00 00 fa 33 c0 8e  d0 bc 00 7c fb b8 c0 07  |.....3.....|....|
00000060  8e d8 e8 16 00 b8 00 0d  8e c0 33 db c6 06 0e 00  |..........3.....|
00000070  10 e8 53 00 68 00 0d 68  6a 02 cb 8a 16 24 00 b4  |..S.h..hj....$..|
00000080  08 cd 13 73 05 b9 ff ff  8a f1 66 0f b6 c6 40 66  |...s......f...@f|
00000090  0f b6 d1 80 e2 3f f7 e2  86 cd c0 ed 06 41 66 0f  |.....?.......Af.|
000000a0  b7 c9 66 f7 e1 66 a3 20  00 c3 b4 41 bb aa 55 8a  |..f..f. ...A..U.|
000000b0  16 24 00 cd 13 72 0f 81  fb 55 aa 75 09 f6 c1 01  |.$...r...U.u....|
000000c0  74 04 fe 06 14 00 c3 66  60 1e 06 66 a1 10 00 66  |t......f`..f...f|
000000d0  03 06 1c 00 66 3b 06 20  00 0f 82 3a 00 1e 66 6a  |....f;. ...:..fj|
000000e0  00 66 50 06 53 66 68 10  00 01 00 80 3e 14 00 00  |.fP.Sfh.....>...|
000000f0  0f 85 0c 00 e8 b3 ff 80  3e 14 00 00 0f 84 61 00  |........>.....a.|
00000100  b4 42 8a 16 24 00 16 1f  8b f4 cd 13 66 58 5b 07  |.B..$.......fX[.|
00000110  66 58 66 58 1f eb 2d 66  33 d2 66 0f b7 0e 18 00  |fXfX..-f3.f.....|
00000120  66 f7 f1 fe c2 8a ca 66  8b d0 66 c1 ea 10 f7 36  |f......f..f....6|
00000130  1a 00 86 d6 8a 16 24 00  8a e8 c0 e4 06 0a cc b8  |......$.........|
00000140  01 02 cd 13 0f 82 19 00  8c c0 05 20 00 8e c0 66  |........... ...f|
00000150  ff 06 10 00 ff 0e 0e 00  0f 85 6f ff 07 1f 66 61  |..........o...fa|
00000160  c3 a0 f8 01 e8 09 00 a0  fb 01 e8 03 00 fb eb fe  |................|
00000170  b4 01 8b f0 ac 3c 00 74  09 b4 0e bb 07 00 cd 10  |.....<.t........|
00000180  eb f2 c3 0d 0a 45 72 72  2e 20 6c 65 63 74 75 72  |.....Err. lectur|
00000190  65 20 64 69 73 71 75 65  00 0d 0a 4e 54 4c 44 52  |e disque...NTLDR|
000001a0  20 6d 61 6e 71 75 65 00  0d 0a 4e 54 4c 44 52 20  | manque...NTLDR |
000001b0  65 73 74 20 63 6f 6d 70  72 65 73 73 82 00 0d 0a  |est compress....|
000001c0  45 6e 74 72 65 7a 20 43  74 72 6c 2b 41 6c 74 2b  |Entrez Ctrl+Alt+|
000001d0  53 75 70 70 72 20 70 6f  75 72 20 72 65 64 82 6d  |Suppr pour red.m|
000001e0  61 72 72 65 72 0d 0a 00  0d 0a 00 00 00 00 00 00  |arrer...........|
000001f0  00 00 00 00 00 00 00 00  83 99 a8 be 00 00 55 aa  |..............U.|
00000200
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 0,0149817 s, 34,2 kB/s

On retrouve bien le même contenu - on a bien identifié le début de cette partition.
Son début est aussi donné par les octets 15 25 c2 03
En résumé sda2 commence au secteur 63055125, fait une taille de 82349190 secteurs, soit le début de l'espace suivant en 145404315

De la même manière on trouve que la partition sda3 commence au secteur 145404315 et fait une taille de 30716280 secteurs (15358140 kio) et que le système de fichiers est 83 (système Linux - ext2, ext3, ext4, ReiserFs)

Enfin la dernière partition sda4 commence au secteur 176120656 (50 63 7f 0a) et est de type étendu (05). Nous verrons plus en détail la structure d'une partition étendue.

Dernière modification par Nasman (Le 13/09/2012, à 15:12)


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#3 Le 17/04/2010, à 17:06

Nasman

Re : MBR cet inconnu

Pour voir ce que contient la partition étendue on fait (puisqu'elle commence en 176120656)

sudo dd if=/dev/sda bs=512 count=1 skip=176120656 | hexdump -C
[sudo] password for xxxxxx
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 fe  |................|
000001c0  ff ff 82 fe ff ff 02 00  00 00 cd b1 41 00 00 fe  |............A...|
000001d0  ff ff 05 fe ff ff cf b1  41 00 a2 75 e0 07 00 00  |........A..u....|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 0,000196254 s, 2,6 MB/s

on a la même chose avec

sudo dd if=/dev/sda4 bs=512 count=1 | hexdump -C

Cette zone amorce est vide exceptée l'espèce de table des partitions logique ou EBR qui commence aussi à l'adresse 1be (446) du secteur
Seules deux entrées sont contenues par l'EBR, la première entrée est:

00 fe  ff ff 82 fe ff ff 02 00 00 00 cd b1 41 00

la structure est la même que pour les partitions primaires, la première partition logique de type 82 (Linux-swap) commence à l'adresse 0x00000002 (02 00 00 00) comptée à partir du début de la partition étendue, soit en 0x0a7f6350+0x00000002=0x0a7f6352=176120658
Sa taille est de 0x0041b1cd = 4305357 secteurs, soit 2152678,5 kio

La deuxième entrée

00 fe ff ff 05 fe ff ff cf b1 41 00 a2 75 e0 07

est l'adresse d'un autre EBR (partition étendue - système de fichiers 05) qui lui aussi contiendra deux entrées.
Il débute donc en 0x0a7f6350+0x0041b1cf=0xac1151f=180426015

Que trouve-t-on à cette adresse, et bien la réponse est là

$ sudo dd if=/dev/sda bs=512 count=1 skip=180426015 | hexdump -C
1+0 enregistrements lus
1+0 enregistrements écrits
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
512 octets (512 B) copiés000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 fe  |................|
000001c0  ff ff 83 fe ff ff 3f 00  00 00 63 75 e0 07 00 00  |......?...cu....|
, 2,3466e-05 s, 21,8 MB/s
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200

On a toujours la structure habituelle dont la première entrée (en 1be)( - et la seule) est

00 fe ff ff 83 fe ff ff 3f 00  00 00 63 75 e0 07

C'est la deuxième partition logique de type 83 (ext4 ici) et commençant à l'adresse:
0xac1151f+0x0000003f=0xac1155e=180426078
Sa taille est de 0x07e07563=132150627 soit 66075313,5 kio

On a bien retrouvé toutes les partitions du disque

On ne peut avoir qu'une partition étendue (dans les partitions principales) mais cette partition étendue peut en contenir une autre étendue.

La structure de mon partitionnement est le suivant

sda1 primaire ntfs

sda2 primaire ntfs

sda3 primaire ext4

sda4 étendue
              sda5 logique Linux-swap

              étendue
                          sda6 logique ext4


La suite du topic concernera la partie exécutable du mbr.

Dernière modification par Nasman (Le 20/03/2019, à 08:55)


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#4 Le 17/04/2010, à 17:38

gilbert

Re : MBR cet inconnu

salut,

c'est pas mal bien foutu ce que tu fais wink Mais juste une suggestion. Tu pourrais faire quelque chose de plus synthétique : Un tableau qui contienne l'adresse (position), la taille (nombre d'octets) et le nom du champ de données. Sous ce tableau après tu peux commenter le rôle de chaque champ. Je pense que ça peut simplifier la lecture.

Courage et bonne continuation.


Simplement moi-même..

Hors ligne

#5 Le 17/04/2010, à 18:58

francoisp31

Re : MBR cet inconnu

très intéressant de se replonger dans les couches basses


Que les puces d'un millier de chiens galleux infeste le cul de celui qui osera vous gacher ne serai ce
qu'une seule journée de votre vie et que les bras lui soient trop court pour qu'il puisse se le gratter.

Hors ligne

#6 Le 19/04/2010, à 13:53

Nasman

Re : MBR cet inconnu

Là je suis en train de faire l'analyse du désassemblage de la partie exécutable du mbr. Lorsque j'aurais fini, je la posterai pour discussion (il y a des appels à des fonctions plus ou moins obscures du bios).
Pour les fonctions je vais voir ici
http://www.ctyme.com/intr/int.htm
mais si quelqu'un a du plus récent...

Je souhaiterais faire une page de doc dédiée mais il faudrait que je maitrise les outils qui vont bien.


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#7 Le 19/04/2010, à 13:57

yanightmare

Re : MBR cet inconnu

Merci pour ce topic. J'ai pas encore eu le temps de tout lire, mais ça va sûrement m'aider ultérieurement smile.

Dernière modification par yanightmare (Le 19/04/2010, à 13:57)

Hors ligne

#8 Le 20/04/2010, à 14:30

Nasman

Re : MBR cet inconnu

Comme promis, voici le désassemblage de la partie exécutable de mon mbr. Il reste encore quelques zones d'ombre mais je suis à l'écoute de vos suggestions et corrections.

J'ai procédé ainsi:
Récupération du mbr sous forme d'un fichier (sans identifiant disque ni table des partitions)

sudo dd if=/dev/sda of=~/Bureau/mbr.bs bs=1 count=440

Puis désassemblage avec ndisasm (paquet nasm)

ndisasm -b16 ~/Bureau/mbr.bs > ~/Bureau/mbr.asm

(l'option -b16 indique que le code est en 16 bits)

Les chaines de texte sont repérées et considérées comme telles (elles se terminent par un octet nul).
Les appels aux interruptions logicielles (int 13h par exemple) sont analysées en allant dans la doc mentionnée dans le post#6.

; Programme chargé en 0000:7C00
00000000  EB63              jmp short 0x65
00000002  90                nop
00000003  D0

; Buffer pour disque dur
00000004		resb 1	; 0x00
00000005		resd 1	; nombre de secteurs
00000009		resd 1	; nombre de têtes
0000000D		resd 1	; nombre de cylindres

; Buffer pour extension
(00000004		resb 1	; 0x01)
(00000005  		resw 1	; 0x0010 - taille paquet)
(00000007		resw 1	; 0x0001 - nb block à transférer)
(00000009		resw 1	; 0x0000)
(0000000B		resw 1	; 0x7000 - buffer en 0x70000000)
(0000000D		resd 1	; 0x00000001)
(00000011		resd 1	; 0x00000000 - démarrer au bloc 0x0000000000000001)

00000004  BC007C	    mov sp,0x7c00
00000007  8EC0              mov es,ax
00000009  8ED8              mov ds,ax
0000000B  BE007C            mov si,0x7c00
0000000E  BF0006            mov di,0x600
00000011  B90002            mov cx,0x200
00000014  FC                cld
00000015  F3A4              rep movsb		; copie le secteur de 7C00-7DFF en 600-7FF
00000017  50                push ax
00000018  681C06            push word 0x61c
0000001B  CB                retf		; saute en 61c (contenu ci dessous)

0000001C  FB                sti
0000001D  B90400            mov cx,0x4
00000020  BDBE07            mov bp,0x7be	; pointe sur le début de la table des partitions

00000023  807E0000          cmp byte [bp+0x0],0x0
00000027  7C0B              jl 0x34		; teste si marqueur "boot"
00000029  0F851001          jnz word 0x13d	; ni boot ni zéro
0000002D  83C510            add bp,byte +0x10	; pointe sur partition suivante
00000030  E2F1              loop 0x23		; 4 boucles pour 4 partitions
00000032  CD18              int 0x18		; appelé si pas de partition de boot
00000034  885600            mov [bp+0x0],dl
00000037  55                push bp		; sauvegarde adresse (partition de boot)
00000038  C6461105          mov byte [bp+0x11],0x5
0000003C  C6461000          mov byte [bp+0x10],0x0
00000040  B441              mov ah,0x41
00000042  BBAA55            mov bx,0x55aa
00000045  CD13              int 0x13		; installation check
00000047  5D                pop bp
00000048  720F              jc 0x59		; extension non supportée
0000004A  81FB55AA          cmp bx,0xaa55	; 
0000004E  7509              jnz 0x59		; extension non installée
00000050  F7C10100          test cx,0x1
00000054  7403              jz 0x59		; fonctions 42h-44h, 47h et 48h non supportées
00000056  FE4610            inc byte [bp+0x10]
00000059  66
0000005A  0080
0000005C  01000000          dd 0x00000001	; numéro secteur 
00000060  00000000          dd 0x00000000	;
00000064  FF                db 0xff

00000065  FA                cli
00000066  90                nop
00000067  90                nop
00000068  F6C280            test dl,0x80	; teste le bit 7 de dl (si activé=disque dur)
0000006B  7502              jnz 0x6f		; si disque dur
0000006D  B280              mov dl,0x80		; marque le périphérique comme disque dur
0000006F  EA747C0000        jmp word 0x0:0x7c74	; saute à la ligne suivante (car mbr chargé en 0000:7c00)
00000074  31C0              xor ax,ax
00000076  8ED8              mov ds,ax
00000078  8ED0              mov ss,ax
0000007A  BC0020            mov sp,0x2000	; la pile pointe sur 0000:2000
0000007D  FB                sti
0000007E  A0647C            mov al,[0x7c64]	; examine le contenu de l'adresse 7C64 (ici 0xff)
00000081  3CFF              cmp al,0xff
00000083  7402              jz 0x87
00000085  88C2              mov dl,al		; si non égal à 0xff, sauvegardé dans dl
00000087  52                push dx
00000088  BB1704            mov bx,0x417
0000008B  802703            and byte [bx],0x3
0000008E  7406              jz 0x96
00000090  BE887D            mov si,0x7d88	; pointe sur la chaine "GRUB"
00000093  E81C01            call word 0x1b2

00000096  BE057C            mov si,0x7c05	; définit une zone tampon
00000099  F6C280            test dl,0x80	; teste si disque dur
0000009C  7448              jz 0xe6		; pas disque dur
0000009E  B441              mov ah,0x41
000000A0  BBAA55            mov bx,0x55aa
000000A3  CD13              int 0x13		; installation check
000000A5  5A                pop dx
000000A6  52                push dx
000000A7  723D              jc 0xe6		; extensions non supportées
000000A9  81FB55AA          cmp bx,0xaa55
000000AD  7537              jnz 0xe6		; extension non installée

; traitement extension
000000AF  83E101            and cx,byte +0x1
000000B2  7432              jz 0xe6		; fonctions 42h-44h, 47h et 48h non supportées
000000B4  31C0              xor ax,ax		
000000B6  894404            mov [si+0x4],ax	; met zéro en 7c09 et 7c0a
000000B9  40                inc ax
000000BA  8844FF            mov [si-0x1],al	; met 1 en 7c04
000000BD  894402            mov [si+0x2],ax	; met 0001 en 7c07
000000C0  C7041000          mov word [si],0x10	; met 0x0010 en 7c05
000000C4  668B1E5C7C        mov ebx,[0x7c5c]
000000C9  66895C08          mov [si+0x8],ebx
000000CD  668B1E607C        mov ebx,[0x7c60]
000000D2  66895C0C          mov [si+0xc],ebx
000000D6  C744060070        mov word [si+0x6],0x7000
000000DB  B442              mov ah,0x42
000000DD  CD13              int 0x13		; fonction extended read
000000DF  7205              jc 0xe6		; si erreur
000000E1  BB0070            mov bx,0x7000
000000E4  EB76              jmp short 0x15c

; traitement sans extension
000000E6  B408              mov ah,0x8
000000E8  CD13              int 0x13		; récupère les paramètres du disque
000000EA  730D              jnc 0xf9		; si pas d'erreur
000000EC  F6C280            test dl,0x80
000000EF  0F84D000          jz word 0x1c3
000000F3  BE937D            mov si,0x7d93	; pointe sur la chaine "Hard Disk" 
000000F6  E98200            jmp word 0x17b

; Disque dur OK
000000F9  660FB6C6          movzx eax,dh	; numéro maxi de têtes
000000FD  8864FF            mov [si-0x1],ah	; met zéro en 7c04
00000100  40                inc ax		; nombre de têtes
00000101  66894404          mov [si+0x4],eax	; sauvegardé en 7c09
00000105  0FB6D1            movzx dx,cl		; 2bits pour cylindre+nombre max de secteurs
00000108  C1E202            shl dx,0x2		; décale de 2 bits vers la gauche
0000010B  88E8              mov al,ch		; 8 bits de poids faible n° maxi cylindre
0000010D  88F4              mov ah,dh		; 2 bits de poids fort cylindre
0000010F  40                inc ax		; nb de cylindres
00000110  894408            mov [si+0x8],ax	; sauvegardé en 7c0d
00000113  0FB6C2            movzx ax,dl		; copie le numéro maxi de secteurs (x4)
00000116  C0E802            shr al,0x2		; numéro maxi de secteurs=nb secteurs
00000119  668904            mov [si],eax	; sauvegardé
0000011C  66A1607C          mov eax,[0x7c60]
00000120  6609C0            or eax,eax		; teste si zéro
00000123  754E              jnz 0x173

; Convertit adresse linéaire en tête, secteur et cylindre
00000125  66A15C7C          mov eax,[0x7c5c]
00000129  6631D2            xor edx,edx		; met à zéro
0000012C  66F734            div dword [si]	; division numéro secteur/nb secteurs par piste
0000012F  88D1              mov cl,dl		; reste de la division=numéro secteur
00000131  31D2              xor dx,dx
00000133  66F77404          div dword [si+0x4]	; divise par le nombre de têtes - donne un nb de cylindres 
00000137  3B4408            cmp ax,[si+0x8]
0000013A  7D37              jnl 0x173		; supérieur au nombre de cylindres du disque - erreur
0000013C  FEC1              inc cl		; rajoute 1 car les n°secteurs commencent à 1
0000013E  88C5              mov ch,al		; 8 bits de poids faible n°cylindre
00000140  30C0              xor al,al
00000142  C1E802            shr ax,0x2		; décale de 2 bits à droite (les bits 6 et 7 pour poids fort cylindre)
00000145  08C1              or cl,al		; modifie les bits 7 et 6 de cl en conséquence (poids fort cylindre)
00000147  88D0              mov al,dl		; numéro de tête = reste division
00000149  5A                pop dx
0000014A  88C6              mov dh,al		; numéro de tête
0000014C  BB0070            mov bx,0x7000
0000014F  8EC3              mov es,bx
00000151  31DB              xor bx,bx		; tampon en 7000:0000
00000153  B80102            mov ax,0x201	; fonction ah=02h = lecture secteur, al=01 = 1 secteur
00000156  CD13              int 0x13		; lit un secteur
00000158  721E              jc 0x178		; erreur de lecture
0000015A  8CC3              mov bx,es

0000015C  60                pushaw
0000015D  1E                push ds
0000015E  B90001            mov cx,0x100
00000161  8EDB              mov ds,bx		; charge le segment du buffer
00000163  31F6              xor si,si		; ds:di pointe sur 7000:0000
00000165  BF0080            mov di,0x8000
00000168  8EC6              mov es,si		; es:di pointe sur 0000:8000
0000016A  FC                cld
0000016B  F3A5              rep movsw		; copie le contenu du buffer de 7000:0000-7000:01FF en 0000:8000-0000:81FF
0000016D  1F                pop ds
0000016E  61                popaw
0000016F  FF265A7C          jmp word near [0x7c5a]; saute en 0000:8000 (car 7c5a contient 8000)


00000173  BE8E7D            mov si,0x7d8e	; pointe sur la chaine "Geom"
00000176  EB03              jmp short 0x17b
00000178  BE9D7D            mov si,0x7d9d	; pointe sur la chaine "Read"
0000017B  E83400            call word 0x1b2
0000017E  BEA27D            mov si,0x7da2	; pointe sur la chaine "Error"
00000181  E82E00            call word 0x1b2
00000184  CD18              int 0x18
00000186  EBFE              jmp short 0x186	; boucle sans fin

; Chaines messages d'erreur
00000188                db "GRUB ",0
0000018E  		db "Geom",0
00000193  		db "Hard Disk",0
0000019D  		db "Read",0
000001A2		db " Error",13,10,0

; Affiche caractère
000001AB  BB0100            mov bx,0x1
000001AE  B40E              mov ah,0xe
000001B0  CD10              int 0x10		; affiche un caractère

; Affiche une chaine
000001B2  AC                lodsb
000001B3  3C00              cmp al,0x0
000001B5  75F4              jnz 0x1ab		; teste la fin de la chaine
000001B7  C3                ret

PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#9 Le 24/09/2013, à 21:27

avi3000

Re : MBR cet inconnu

Mise en pratique des conseils de Nasman.

Le code ci-dessous permet de consulter le contenu des partitions d'une image disque.
vous pouvez le tester sur une image android ou raspberry.

#!/bin/sh
#--------------------------------------------------------------#
#-   Monte les partitions d'un fichier img                    -#  
#-   $1 : fichier img à traiter                               -#  
#-   traite uniquement les mbr msdos                          -#  
#-   traitement récursif des partitions étendues              -#  
#--------------------------------------------------------------#

msg () {
     echo -e "\n$1"
     exit
}

trt_table_part () {
     my_buf="$BUFFER_DIR/trt_table_part_$EUID.$1"

     local numpart=0
     local sector=$1
     hexdump -vs $((($1*512)+446)) -n 64 -C $2 > $my_buf
     while read l;do
          ((numpart++))
          case ${l:22:2} in
          '0c') # Fat
                p="0x${l:44:2}${l:41:2}${l:38:2}${l:35:2}"  #octets 12,11,10,9
                s=$((p+sector))
                echo "($1,$numpart) Fat en $s"
                [ -d $BUFFER_DIR/$basename-$s ] || mkdir $BUFFER_DIR/$basename-$s
                mount -o loop,offset=$((s*512)) $2 $BUFFER_DIR/$basename-$s
                ;;  
          '83') # Linux ext.
                p="0x${l:44:2}${l:41:2}${l:38:2}${l:35:2}"  #octets 12,11,10,9
                s=$((p+sector))
                echo "($1,$numpart) Linux en $s"
                [ -d $BUFFER_DIR/$basename-$s ] || mkdir $BUFFER_DIR/$basename-$s
                mount -o loop,offset=$((s*512)) $2 $BUFFER_DIR/$basename-$s
                ;;  
          '05'|'0f') # Etendue
                p="0x${l:44:2}${l:41:2}${l:38:2}${l:35:2}"  #octets 12,11,10,9
                (( etendue > 0 )) && s=$((p+etendue))|| s=$((p+sector))
                (( etendue > 0 )) || etendue=$((p+sector))
                echo "($1,$numpart) Etendue en $s"
                trt_table_part $s $2  
                ;;  
          '00') # Vide
                ;;  
          '')   # FIN
                ;;  
          *)    # non traitée
                echo "($1,$numpart) non traitée ${l:22:2}"
                ;;  
          esac
     done < $my_buf
}

((EUID > 0 )) && msg 'à exécuter en root'
[ -f $1 ] || msg "fichier $1 inexistant"

BUFFER_DIR='/tmp'       # ou /dev/shm
basename=${1##*/}
etendue=0
trt_table_part 0 $1

Dernière modification par avi3000 (Le 24/09/2013, à 21:28)

Hors ligne

#10 Le 24/09/2013, à 21:55

moko138

Re : MBR cet inconnu

yanightmare a écrit :

Merci pour ce topic. J'ai pas encore eu le temps de tout lire, mais ça va sûrement m'aider ultérieurement smile.

  +1 !

Il me semble qu'il y aurait une faute de frappe à la fin du premier message.

Cette table de 64 octets (16x4) s'étend de 1be à 1ff (446 à 509).

Enfin le mbr se termine (...) à l'adresse 1ff (511).

  Donc 509 ne correspondrait-il pas plutôt à 1fd ?


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#11 Le 25/09/2013, à 08:52

Nasman

Re : MBR cet inconnu

moko138 a écrit :
yanightmare a écrit :

Merci pour ce topic. J'ai pas encore eu le temps de tout lire, mais ça va sûrement m'aider ultérieurement smile.

  +1 !

Il me semble qu'il y aurait une faute de frappe à la fin du premier message.

Cette table de 64 octets (16x4) s'étend de 1be à 1ff (446 à 509).

Enfin le mbr se termine (...) à l'adresse 1ff (511).

  Donc 509 ne correspondrait-il pas plutôt à 1fd ?

Effectivement, c'est de 1be à 1fd (de 446 à 509 en décimal)

[mode mauvaise foi]
C'est pour voir si vous suiviez
[/mode mauvaise foi]

Edit : je corrige le post#1

Pour info : j'ai fait un laïus sur le mbr dans la doc

Dernière modification par Nasman (Le 25/09/2013, à 12:44)


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#12 Le 25/09/2013, à 14:27

avi3000

Re : MBR cet inconnu

Nasman a écrit :

Pour info : j'ai fait un laïus sur le mbr dans la doc

au cours de mes recherches, je suis tombé sur ce post et pas sur ton laïus sur le mbr dans la doc

Ton laïus est évidemment plus clair et plus facile à lire que ce post.

Hors ligne