Pages : 1
#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 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 .
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
Merci pour ce topic. J'ai pas encore eu le temps de tout lire, mais ça va sûrement m'aider ultérieurement .
+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
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 .
+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
Pages : 1