lalahop

Désamorcer une clé USB

Table des matières

Vous avez utilisé une clé USB pour installer une distribution GNU/Linux ou un Windows puis vous l'avez formaté pour la vider. Mais voila, au démarrage de l'ordinateur, celui-ci tente de démarrer à partir de la clé. Voici quelques méthodes pour empêcher cela. La liste n'est pas exhaustive 😉 .

Sous Windows

J'utilise TestDisk, un bon logiciel sous licence GPL. On le télécharge, on le lance, on refuse la création de journal, on sélectionne sa clé USB sans se gourer, on choisit le type de la table des partitions : Intel, on choisit l'option "Delete" et on valide deux fois avec "y". Ensuite, il faut recréer une nouvelle partition puisque l'ancienne partition n'est plus référencée dans la table des partitions suite à notre manip'. On peut aussi réécrire la table des partitions, justement avec TestDisk, et ainsi retrouver l'accès à l'ancienne partition et à ces données. Je vous laisse chercher ça 😉 .

À noter que l'option "MBR code" n'a aucun effet dans notre cas ce qui est normal car elle n'est pas prévue pour cela. D'autre part,

Sous GNU/Linux

ÉDIT du 11/08/2012 à 19h30 : J'ai modifié cette partie car elle contenait beaucoup d'âneries. Fin de l'édit

Nous allons utiliser la commande dd . Pour obtenir le même résultat qu'avec TestDisk, il faut, tout comme lui, effacer le MBR. Il s'agit du premier secteur du disque, soit les 512 premiers octets. Pour l'effacer :

sudo dd if=/dev/zero of=/dev/sdb bs=512 count=1

Explication rapide : on écrit sur un secteur (count), sachant qu'un secteur à une taille de 512 octets (bs) en prenant comme source le pseudo-périphérique /dev/zero qui renvoi toujours le caractère "NULL".

Attention : ce ne sera pas forcement sdb chez vous ! Vérifiez avec la commande mount, sans arguments.

Un peu de théorie : pour savoir si un médium (clé USB, disque dur interne/externe, CD, DVD, etc. ) est amorçable ou pas, le BIOS lit le premier secteur (= les 512 premiers octets) du médium, le MBR donc. Celui-ci contient, dans l'ordre, la routine d'amorçage, la table des partitions primaires et deux octets (Pour une meilleure présentation, voir : Master boot record sur Wikipédia en). Pour être sûr qu'il s'agit bien d'un MBR, le BIOS vérifie que les deux derniers octets (le numéro 510 et le numéro 511, soit le 511e et le 512e, n'oubliez pas que l'on compte à partir de 0 😛 ) contiennent bien le nombre "magique" 0xAA55. Si c'est le cas, il charge la routine d'amorçage présente dans les 446 premiers octets (au maximum) du MBR dans la mémoire (à l'adresse 0x7C00, soit segment 7C0 (1984 😉 ), offset 0) et lui donne la main. Donc, en théorie, si l'on écrase ce nombre magique, ce premier secteur du disque ne sera plus reconnu comme un MBR et le BIOS ne chargera pas la routine d'amorçage. Donc lancer la commande suivante revient au même que la commande précédente :

sudo dd if=/dev/zero of=/dev/sdb seek=510 bs=1 count=2

Explication rapide : on écrit sur deux secteurs (count), sachant qu'un secteur à une taille de 1 octet (bs) en partant directement du secteur numéro 510 et en prenant comme source le pseudo-périphérique /dev/zero qui renvoi toujours le caractère "NULL".

Cette méthode invalide la table des partitions. Votre système d'exploitation ne saura plus monter vos partitions.

Si l'on veut être plus précis et conserver la table des partitions et son fonctionnement, il existe au moins 2 méthodes. La première consiste à utiliser parted/gparted pour supprimer le flag "boot" de la partition sur lequel ce drapeau est activé. La deuxième méthode est d'imiter cette fonctionnalité de parted avec dd.

Nous avons vu que le MBR contient la table des partitions c'est-à-dire 64 octets qui décrivent 4 partitions qu'elles soient primaires ou étendues. Nous avons donc 16 octets par partition qui indiquent :

  • Un drapeau indiquant si la partition est bootable ou non (un octet).
  • L'adresse du premier secteur de la partition en utilisant l'adressage CHS (3 octets).
  • Le type de la partition. Voir la liste sur Wikipédia en.
  • L'adresse du dernier secteur de la partition en utilisant l'adressage CHS (3 octets).
  • L'adresse du premier secteur de la partition en utilisant l'adressage LBA (4 octets).
  • Le nombre de secteurs que comportent la partition (4 octets).

Le premier octet indique donc si la partition est bootable (0x80 : bootable, 0x00 : non bootable, autre nombre : non documenté mais souvent considéré comme non bootable). Ce drapeau indique que le File System Boot Sector, c'est-à-dire le premier secteur de la partition (primaire étendue, ...) contient du code ainsi que des informations sur le système de fichier utilisé. Il ne peut y avoir qu'une seule partition marquée comme active dans une table des partitions et donc sur un même médium.

S'il n'y a qu'une partition, le drapeau ne peut se trouver que sur le 447e octet, c'est-à dire, le secteur numéro 446. S'il y a deux partitions, la première ou la deuxième peut avoir ce drapeau. Il se trouve donc soit sur le 447e octet, soit sur le 463e octet (donc numéro 462). En suivant la même logique, on comprend qu'avec 4 partitions, le drapeau peut se trouver au 447e octet, au 463e, au 479e et au 495e.

Pour l'identifier, on utilisera hexdump :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$  sudo dd if=/dev/sdb bs=512 count=1 of=sortie
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 0,000203902 s, 2,5 MB/s
 
$ hexdump -vC sortie 
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 0e 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 74 05 f6 c2 70  |...........t...p|
00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|
00000080  00 20 fb a0 64 7c 3c ff  74 02 88 c2 52 be 80 7d  |. ..d|<.t...R..}|
00000090  e8 17 01 be 05 7c b4 41  bb aa 55 cd 13 5a 52 72  |.....|.A..U..ZRr|
000000a0  3d 81 fb 55 aa 75 37 83  e1 01 74 32 31 c0 89 44  |=..U.u7...t21..D|
000000b0  04 40 88 44 ff 89 44 02  c7 04 10 00 66 8b 1e 5c  |.@.D..D.....f..\|
000000c0  7c 66 89 5c 08 66 8b 1e  60 7c 66 89 5c 0c c7 44  ||f.\.f..`|f.\..D|
000000d0  06 00 70 b4 42 cd 13 72  05 bb 00 70 eb 76 b4 08  |..p.B..r...p.v..|
000000e0  cd 13 73 0d f6 c2 80 0f  84 d8 00 be 8b 7d e9 82  |..s..........}..|
000000f0  00 66 0f b6 c6 88 64 ff  40 66 89 44 04 0f b6 d1  |.f....d.@f.D....|
00000100  c1 e2 02 88 e8 88 f4 40  89 44 08 0f b6 c2 c0 e8  |.......@.D......|
00000110  02 66 89 04 66 a1 60 7c  66 09 c0 75 4e 66 a1 5c  |.f..f.`|f..uNf.\|
00000120  7c 66 31 d2 66 f7 34 88  d1 31 d2 66 f7 74 04 3b  ||f1.f.4..1.f.t.;|
00000130  44 08 7d 37 fe c1 88 c5  30 c0 c1 e8 02 08 c1 88  |D.}7....0.......|
00000140  d0 5a 88 c6 bb 00 70 8e  c3 31 db b8 01 02 cd 13  |.Z....p..1......|
00000150  72 1e 8c c3 60 1e b9 00  01 8e db 31 f6 bf 00 80  |r...`......1....|
00000160  8e c6 fc f3 a5 1f 61 ff  26 5a 7c be 86 7d eb 03  |......a.&Z|..}..|
00000170  be 95 7d e8 34 00 be 9a  7d e8 2e 00 cd 18 eb fe  |..}.4...}.......|
00000180  47 52 55 42 20 00 47 65  6f 6d 00 48 61 72 64 20  |GRUB .Geom.Hard |
00000190  44 69 73 6b 00 52 65 61  64 00 20 45 72 72 6f 72  |Disk.Read. Error|
000001a0  0d 0a 00 bb 01 00 b4 0e  cd 10 ac 3c 00 75 f4 c3  |...........<.u..|
000001b0  00 00 00 00 00 00 00 00  b2 17 01 00 00 00 00 20  |............... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 80 aa  |!...(....... ...|
000001d0  29 82 07 fe ff ff 00 08  20 00 00 00 40 05 00 fe  |)....... ...@...|
000001e0  ff ff 05 fe ff ff fe 0f  60 05 02 f8 3f 05 00 fe  |........`...?...|
000001f0  ff ff 83 fe ff ff 00 08  a0 0a 00 b8 47 04 55 aa  |............G.U.|
00000200

On remarque la marque du MBR (0x55AA), codée ici en little-endian. La table des partitions est donc dans les 64 octets qui précédent : des deux derniers octets (00 20) de la 34e ligne jusqu'au 04 précédent la marque). Nous remarquons la présence de 4 partitions :

  1. 00 20 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 (lignes 34-35)
  2. 80 aa 29 82 07 fe ff ff 00 08 20 00 00 00 40 05 (lignes 35-36)
  3. 00 fe ff ff 05 fe ff ff fe 0f 60 05 02 f8 3f 05 (lignes 36-37)
  4. 00 fe ff ff 83 fe ff ff 00 08 a0 0a 00 b8 47 04 (lignes 37-38)

Détaillons :

  1. Une partition GNU/Linux (0x83) de 2097152 secteurs (00 00 20 00 => 0x00200000 à cause du little-endian ensuite 0x200000 = 2097152 en décimal).
  2. Une partition HPFS ou NTFS ou exFAT (0x07) de 88080384 secteurs (00 00 40 05 => 05400000 pour le little-endian puis conversion). Cette partition est bootable (0x80).
  3. Une partition étendue (0x05) de 88078338 secteurs. Pour en savoir plus, il faudra consulter le début de la partition pour avoir une nouvelle table des partitions nous indiquant la nature exacte de la première partition logique et l'adresse de la prochaine partition logique).
  4. Une partition GNU/Linux (0x83) de 71809024 secteurs.

Donc, dans notre exemple, le boot flag est sur le 463e octet. Pour l'effacer :

sudo dd if=/dev/zero of=/dev/sdb seek=462 bs=1 count=1

On obtiendra donc :

$ hexdump -vC sortie 
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 0e 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 74 05 f6 c2 70  |...........t...p|
00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|
00000080  00 20 fb a0 64 7c 3c ff  74 02 88 c2 52 be 80 7d  |. ..d|<.t...R..}|
00000090  e8 17 01 be 05 7c b4 41  bb aa 55 cd 13 5a 52 72  |.....|.A..U..ZRr|
000000a0  3d 81 fb 55 aa 75 37 83  e1 01 74 32 31 c0 89 44  |=..U.u7...t21..D|
000000b0  04 40 88 44 ff 89 44 02  c7 04 10 00 66 8b 1e 5c  |.@.D..D.....f..\|
000000c0  7c 66 89 5c 08 66 8b 1e  60 7c 66 89 5c 0c c7 44  ||f.\.f..`|f.\..D|
000000d0  06 00 70 b4 42 cd 13 72  05 bb 00 70 eb 76 b4 08  |..p.B..r...p.v..|
000000e0  cd 13 73 0d f6 c2 80 0f  84 d8 00 be 8b 7d e9 82  |..s..........}..|
000000f0  00 66 0f b6 c6 88 64 ff  40 66 89 44 04 0f b6 d1  |.f....d.@f.D....|
00000100  c1 e2 02 88 e8 88 f4 40  89 44 08 0f b6 c2 c0 e8  |.......@.D......|
00000110  02 66 89 04 66 a1 60 7c  66 09 c0 75 4e 66 a1 5c  |.f..f.`|f..uNf.\|
00000120  7c 66 31 d2 66 f7 34 88  d1 31 d2 66 f7 74 04 3b  ||f1.f.4..1.f.t.;|
00000130  44 08 7d 37 fe c1 88 c5  30 c0 c1 e8 02 08 c1 88  |D.}7....0.......|
00000140  d0 5a 88 c6 bb 00 70 8e  c3 31 db b8 01 02 cd 13  |.Z....p..1......|
00000150  72 1e 8c c3 60 1e b9 00  01 8e db 31 f6 bf 00 80  |r...`......1....|
00000160  8e c6 fc f3 a5 1f 61 ff  26 5a 7c be 86 7d eb 03  |......a.&Z|..}..|
00000170  be 95 7d e8 34 00 be 9a  7d e8 2e 00 cd 18 eb fe  |..}.4...}.......|
00000180  47 52 55 42 20 00 47 65  6f 6d 00 48 61 72 64 20  |GRUB .Geom.Hard |
00000190  44 69 73 6b 00 52 65 61  64 00 20 45 72 72 6f 72  |Disk.Read. Error|
000001a0  0d 0a 00 bb 01 00 b4 0e  cd 10 ac 3c 00 75 f4 c3  |...........<.u..|
000001b0  00 00 00 00 00 00 00 00  b2 17 01 00 00 00 00 20  |............... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 07 fe ff ff 00 08  20 00 00 00 40 05 00 fe  |)....... ...@...|
000001e0  ff ff 05 fe ff ff fe 0f  60 05 02 f8 3f 05 00 fe  |........`...?...|
000001f0  ff ff 83 fe ff ff 00 08  a0 0a 00 b8 47 04 55 aa  |............G.U.|
00000200

Normalement, la recherche du boot flag incombe à la routine d'amorçage une fois celle-ci chargée en mémoire par le BIOS. Néanmoins, on remarque des comportements différents selon les PCs : certains, ne voyant pas de boot flag sur un médium repassent la main à ce qui doit être le BIOS afin que ce dernier recherche un nouveau média de boot. Sur d'autres PCs, le fait qu'un médium ne soit pas bootable est bloquant (attention : je parle bien pour deux configurations de BIOS identiques et notamment l'ordre de boot). Pour ces derniers, enlever le boot flag sera inutile. Il faudra configurer le BIOS pour ne pas tenir compte du médium ou retirer le medium le temps du boot.