Nous allons voir comment rendre une partition active, réinstaller un MBC dans le MBR et mettre la signature 0xAA55 dans un secteur qui ne l'a pas. Pour chaqune de ces opérations, il existe au moins deux manières d'arriver au but: la manière douce (utilisant les outils système) et la manière forte, qui consiste à recopier les éléments à l'endroit ou ils auraient du se trouver, à l'aide d'un éditeur hexadécimal de disque, ou à défaut d'un moyen d'accès direct au disque du style dd.
Pour commencer notre travail, nous allons déja voir si le I-Bead est un périphérique USB de classe 8 (stockage de masse). Sur un PC doté de Windows 2000, on
branche donc le I-Bead sur un port USB, et on attends que ca infuse... Une petite boite de dialogue apparait la premiere fois qu'on effectue cette opération
sur ce PC, pour signaler qu'un nouveau périphérique viens d'être trouvé. Elle affiche le nom du périphérique, et ne demande pas de drivers avant de
disparaitre, ce qui est une bonne chose.
Une petite icône s'affiche à coté de l'horloge pour signaler qu'un périphérique amovible est présent, et peut être déconnecté proprement en lui
cliquant dessus. Quand on clique une fois sur cette icone, un menu apparait pour proposer un choix de périphériques à déconnecter.
Utiliser ce menu permet au système de fermer tous les fichiers en cours d'utilisation sur ce périphérique, ou d'alerter l'utilisateur si ce
n'est pas possible, ce qui évite de perdre des données si on débranchais juste le périphérique sans en avertir le système avant. Ce menu nous indique aussi
le type du périphérique, comme sur l'image ci-contre.
On peut aussi confirmer le type de périphérique en allant dans le gestionnaire de périphériques (click droit sur l'icône du poste de travail, Gerer, et Gestionnaire de périphériques). On obtient alors une liste de périphériques reconnus, dans lesquels on retrouve notre 'Périphérique de stockage de masse USB' :
Pour ceux qui ont plusieurs périphériques de ce type, en double cliquant sur le périphérique en question, on obtient plus d'informations dessus, parmis lesquelles on retrouve bien le nom du périphérique : 'I-BEAD Multi player'.
On pourait tenter dès à présent de démarrer sur l'I-Bead, mais il y a peu de chance que celui ci soit fourni avec un système d'exploitation
préinstallé, et en état de démarrer tel quel. En effet, pour être sur d'avoir la même base de travail j'ai reformatté le I-Bead avec l'utilitaire
fournis. Ce dernier ne contient donc rien à part une table de partition, une partition à peu près de la taille du disque, et un système de fichier FAT16 vide
sur cette partition.
Toujours dans le Gestionnaire d'Ordinateur, nous allons regarder la structure du disque. Cette fois ci, on utilise le Gestionnaire de disque logique, qui se trouve un peu plus bas dans la catégorie Stockage. Normalement, après avoir formatté l'I-Bead avec l'utilitaire d'ISM, on doit obtenir quelquechose qui ressemble à ça :
On a la bonne surprise de voir ici qu'une partie du travail a déjà été fait, en effet la partition est active. La marque (Actif) sur une partition
indique que cette partition est inscrite comme active dans la table de partition. Si ce n'etait pas le cas, on peut activer la partition grace au un menu
contextuel de la partition intitulé 'Marquer la partition comme active'. C'est a peu près tout ce qu'on peut tirer du gestionnaire de disque
logique, il n'est apparament pas possible de réinstaller un MBC dans le MBR comme avec la commande DOS FDISK /MBR dans cet outil.
Il est possible d'arriver au même résultat via la Console de Récupération, qui est disponnible dans le menu de boot de Windows 2000/XP (accessible
en pressant F8 pendant le démarrage du PC). Si vous ne l'avez pas, allez dans le dossier I386 de votre source d'installation de windows (sur le CD, sur
un partage réseau, ou caché sur le disque dans un coin si vous avez un portable préinstallé), puis lancez la commande WINNT32.EXE /cmdcons. Cela créera
un dossier cmdcons caché à la racine de votre partition système, et l'option dans le menu de boot de windows. Un autre moyen d'avoir la console
de récuperation est de booter sur le CD de windows, qui propose aussi d'y acceder.
La console de récuperation vous donne accès à quelques commandes utiles en cas de problème, dont un qui nous intéresse dans le cas du MBR manquant: FIXMBR. Cette commande permet de réinstaller un MBR bootable sur un disque. Elle prend en paramètre le nom du disque (pas E:\, mais son nom de périphérique qui est quelque chose du genre \device\harddisk2). Pour trouver quel est le nom de périphérique du disque amovible qui nous intéresse, on utilise une autre commande de la console de restauration : MAP. MAP liste les lettres de lecteurs en face des noms de périphériques des disques et partitions. Cette méthode est un peu laborieuse, puisqu'elle nécéssite un redémarrage en mode console de restauration, donc pour le MBC on va plutôt utiliser la manière forte.
Pour cette opération délicate, il nous faut un moyen d'écrire directement sur le disque. Pour ma part et dans cet exemple j'utiliserais l'éditeur
hexadécimal Hex Workshop de BreakPoint Software (quand un soft est aussi excellent, il mérite de la pub...), dont on peut télécharger une version
d'évaluation sur [ plein de sites ].
A l'aide de cet éditeur, nous allons remplacer les 446 premiers octet du disque qui n'a pas de MBC par un MBC qui fonctionne. Ceux qui ont déjà
utilisés un éditeur hexadécimal peuvent passer à [ la suite ], aux autres je recommande quand même de lire ce qui suis, histoire de savoir
un peu ce que vous faites...
Pour arriver à être aussi versatile, l'éditeur hexadécimal ne fait pas de miracles. Il serait quasiment impossible de connaitre la façon dont sont
stockées les données de tous les types de données différents (TXT, RTF, DOC, PDF, GIF, JPEG, TIF, SGI, WAV, MP3, S3M, AVI, MPG, MKV, format des sauvegardes de
Morrowind, REG, MBR, ...), compte tenu du fait que de nouveaux formats de données sortent tous les jours, et qu'il y en a déjà un certain nombre en
circulation qui ne sont documentés nulle part.
Donc dans le cas du concept de l'éditeur hexadécimal, on a pris le partis de ne pas INTERPRETER les données qui sont affichées.
L'interpretation du sens des octets est fait par l'utilisateur de l'éditeur, car seule elle connait le contexte des données sur lesquelles elle
travaille, en étant éventuellement assisté par l'éditeur hexadécimal. Ainsi un éditeur hexadécimal peut travailler sur des fichiers contenant des images,
mais il ne montre pas l'image elle même, de même qu'il ne propose pas un crayon ou un pinceau pour la modifier. L'éditeur hexadécimal montre et
permet de modifier les octets stockant l'image, mais ne sais pas que les données sur lesquelles il travaillent représentent une image.
Pour travailler sur ces octets, il affiche leur valeur séparément, ou par groupe de 2 ou 4 octets la plupart du temps. Un octet étant un nombre compris entre
0 et 255, on peut afficher le contenu d'un fichier de 5 octets en affichant séparément la valeur de chaqun de ces 5 octets. Par exemple pour un fichier
texte de 5 octets contenant le texte "Salut" créé sur un PC, l'éditeur hexadécimal va nous afficher 5 nombres : 53 61 6C 75 74
Là, deux choses peuvent vous sembler étranges :
Oui, en notation hexadécimale un nombre est composé de chiffres hexadécimaux, qui sont des chiffres pouvant prendre 16 valeurs différentes (hexa -> 16) contrairement à nos traditionnels chiffres décimaux qui ne peuvent eux qu'en prendre 10 (déci -> 10). Les 16 symboles utilisés pour représenter ces 16 valeurs différentes sont 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E et F, A valant 10, B valant 11, ... jusqu'à F qui vaut 15. Donc, rien de surprenant à trouver des lettres dans un nombre hexadécimal, c'est juste une convention d'écriture. Les lettres peuvent être écrites en majuscule ou minuscule, peu importe. On ajoute souvent un préfixe aux nombres hexadécimaux afin de ne pas les confondre avec des nombres décimaux si ils ne contiennent pas de chiffres valant plus de 9. Les préfixes les plus souvent employés sont '0x', '#', '$' et '&H'. Un nombre écrit 7F2E3c sera évidemment hexadécimal, mais concernant le nombre hexadécimal 732645 valant 7546437 en décimal, il vaut mieux mettre un préfixe pour le distinguer de son homologue décimal. J'utiliserais le préfixe 0x dans ces pages.
Il y a en hexadécimal des appellations courantes pour les nombres, selon de combien de chiffres ils sont composés. Un nombre d'un seul chiffre est appelé Nibble, un nombre de deux chiffres Byte (octet). Un Word (mot) est un nombre ayant 4 chiffres (2 octets). Un Double Word (DWORD) a quant à lui 4 octets (8 chiffres).
Concernant la valeur d'un nombre hexadécimal ayant plusieurs chiffres, le fonctionnement est le même qu'avec les nombres décimaux : On fait la somme des unités, dixaines, centaines, miliers, ... Dans le cas des nombres hexadécimaux cependant, une 'dixaines' vaut en fait 16 car chaque chiffre du nombre peut représenter 16 possibilités, non plus 10. De même, une 'centaine' vaut maintenant 16*16 = 256 au lieu de 10*10 = 100, un 'millier' 16*16*16 = 4096...
Pour avoir la valeur décimale du nombre hexadécimal 0x6C, on fait 0x6*0x10 + 0xC, soit 6*16 + 12 qui donne 108 en décimal. Si on ajoute 1 à 0x6C, on obtiens
0x6D, puis 0x6E, puis 0x6F, puis 0x70, qui vaut 0x7*0x10 + 0 = 112 (soit 108+4, ce qui est normal, on a ajouté 4 fois 1 à un nombre valant 108).
Vous pouvez vous demander pourquoi on utiliser un truc aussi compliqué. On pourait faire un éditeur décimal, qui afficherait bètement la valeur des octets
sous forme décimale. Le principal avantage d'afficher en hexadécimal est qu'on évite de faire la confusion entre la valeur d'un octet, et le
sens de cet octet, vu que la valeur ne saute pas au yeux quand elle est écrite en hexa. Deux octets 0x03 et 0xE8 se suivant, valant respectivement en
décimal 3 et 232, peuvent en fait n'être qu'un seul et même nombre valant 1000 (3*256 + 14*16 + 8), stocké sur deux octets. Le fait de l'afficher en
hexadécimal (03 E8) nous évite d'interpreter immédiatement ces octets comme ayant un sens séparément l'un de l'autre.
Pour interpreter le sens de ces deux octets, on s'appuiera sur le format du fichier, la position de ces octets dans ce fichier, ... Un autre avantage est
qu'on a pour habitude de notter les zéro précédant les valeurs hexadécimales, donc on peut coller l'un à coté de l'autre des octets en hexadécimal
sans risque de se mélanger les pinceaux (ex: 5A08e2303f représente 5 octets en hexa, alors que 9082264863 peut vouloir dire 90 8 226 48 63 ou 90 82 26 48 63 en
décimal).
La on rentre dans la partie intéressante de la manipulation directe des octets. Concernant la valeur des octets dans un fichier, tout est question de
convention. Quand j'ai écrit que mon fichier texte créé sur PC contenait le texte "Salut", j'ai décrit la convention utilisée pour enregistrer le
texte "Salut" sous la forme d'une suite de valeurs. Cette convention s'appele ici ASCII, qui est une norme de codage des valeurs associées à chaque
caractère d'un texte courament utilisée sur PC. Ce fichier texte aurait pu être créé sur un autre système, utilisant une norme de codage différente
(UNICODE, EBCDIC, ...) et alors le texte "Salut" aurait été composé de différentes valeurs, voir d'un nombre différent d'octets (10 ou 12 pour UNICODE).
Le fait de travailler sur les données brutes permet de comprendre comment un ordinateur peut stocker différent types de données dans une suite de valeurs.
Travailler directement en hexadécimal permet de voir les conventions utilisées en informatique (ex: la couleur d'un point d'une image est souvent
stockée sous la forme de trois valeurs représentant l'intensité de chaque couleur primaire (rouge, vert, bleu) dans ce point, un son est stocké en le
découpant en petits échantillons dont on quantifie l'intensité sonore, ...).
Ces nombres sont donc les valeurs représentant le texte "Salut" selon la convention ASCII, qui dit qu'un 'a' minuscule sera codé en utilisant la valeur 97 (0x61), un 'b' minuscule vaudra 98 (0x62), ...
Si on veux modifier notre texte, on va donc modifier la valeur de quelques octets afin qu'ils soit interprétés par un éditeur de texte comme étant
d'autres caractères. Si par exemple je mets 0x62 à la place du 0x61 dans ma suite de 5 valeurs hexa, un éditeur de texte ASCII lira maintenant "Sblut".
Ce que je viens de dire concernant des données de type texte est vrai pour tout type de données. A partir du momment ou vous comprenez la convention utilisée
pour stocker les données d'un certain type, vous pouvez via l'éditeur hexadécimal les modifier selon votre bon plaisir, souvent d'une manière non
prévue par les logiciels exploitant ces données.
Après la théorie, place à un peu de pratique via Hex Workshop.
Nous allons d'abord créer un fichier texte sous le bloc note contenant le texte "Salut", l' enregistrer dans un coin (c:\temp\truc.txt par exemple) et fermer le bloc note. Ensuite, lançons Hex Workshop pour pouvoir bricoler ce fichier. Pour ce faire, deux méthodes : la plus simple consiste à faire un click droit sur le fichier, et à cliquer sur 'Hex Edit with Hex Workshop', l'autre consistant à lancer Hex Workshop depuis le menu démarrer, puis ouvrir le fichier avec le menu File/Open.
Une fois le fichier ouvert, vous devriez avoir quelque chose comme ça devant les yeux :
La fenêtre d'Hex Workshop se décompose en 5 parties principales.
Cette partie affiche les octets du fichier sous forme hexadécimale les uns après les autres, groupés par mots (2 octets) quand c'est possible. Le curseur permet de se déplacer d' un octet à l'autre comme dans un éditeur de texte classique, et de modifier les valeurs hexadécimales de ces octets en rentrant les chiffres hexadécimaux les uns à la suite des autres.
Cette partie affiche le nombre d'octets précédent la ligne affichée dans la vue hexadécimale qui est juste à droite. On peut choisir d'afficher la position sous forme décimale ou hexadécimale, selon les gouts. La position du curseur est aussi affichée dans la barre d'état sous la forme Offset: 00000000. Cela permet de savoir directement à quelle position on va modifier les données.
Cet assistant affiche une analyse textuelle des données. Les caractères qui ne sont pas reconnus comme faisant partie d'un texte sont remplacés par des points. Grace à cette vue, on peut aisément modifier des zones de texte dans les données, sans avoir à se munir d'une table de correspondance caractère <=> valeur hexa. Il faut cependant noter que cet assistant utilise par défaut la convention ASCII pour analyser les données, donc si vous éditez des données provenant d'une autre source qu'un PC, il peut être intéressant de changer cette convention, Hex Workshop étant assez souple sur la façon dont il analyse les données textuelles (voir menu Options/Preferences, onglet Display, champ Character Filter). On peut de même définir des conventions personnalisées qui colorisent certaines valeurs, facilitant grandement l'analyse des données.
Cet assistant tente quant à lui d'interprèter les données sous le curseur. Il affiche les valeurs décimales de l'octet, du mot, du double mot, et autres sous forme de nombres décimaux. Il faut cependant retenir que concernant les valeurs décimales des nombres hexadécimaux il existe encore une fois des conventions de stockages différentes. Les deux plus utilisées sont appelées Little Endian (Motorola) et Big Endian (Intel). Le nombre 1000 sera stocké sur deux octets dans les deux cas, mais dans le premier il sera écrit dans le fichier 03E8 (soit en notation naturelle) et dans le deuxième cas E803. Les PC utilisant la plupart du temps la deuxième notation, cet assistant afficher par défaut les données en Big Endian. Vous pouvez changer cela dans le menu Options/Byte Order.
Un onglet Structure Viewer permet d'afficher les données selon un type de données décrit dans un fichier, sous la forme d'une structure arborescente. Cette option facilite grandement l'édition de types de données les plus classiques.
Le dernier assistant d'Hex Workshop affiche les résultats d'opérations prenant un peu de temps, telles que les comparaisons entre fichiers, le calcul de sommes de contrôle sur tout ou partie d'un fichier, les recherches de données diverses,...
Nous allons donc changer un octet de ce fichier, en se positionnant sur le deuxième octet hexadécimal (0x61) à l'aide de la flèche droite du clavier, puis en appuyant sur les touches 6 et 2. L'assistant texte affiche maintenant Sblut, comme prévu. On peut maintenant enregistrer le résultat dans notre fichier truc.txt avec le menu File/Save, et constater en réouvrant le fichier avec le bloc note que celui-ci à bien interpreté notre modification comme nous le pensions, vu qu'il affiche lui aussi Sblut.
Pour modifier le MBR de notre disque amovible, nous allons ouvrir Hex Workshop, puis ouvrir le disque amovible en entier, via le menu Disk/Open Drive. Une fenêtre vous propose alors un choix de disques à ouvrir, dans laquelle nous alons sélectionner uniquement les disques entiers (Physical Disks dans la liste Select), puis choisir le disque amovible dans la liste du dessous (Physical Disk 2 (58.00 MB) dans l'exemple ci-dessous). Pour reconnaitre votre disque amovible de vos autres disques, regardez la taille indiquée entre parenthèses, si vous avez un disque amovible de quelques centaines de Mégaoctets, cela devrait être facile.
Une fois le disque ouvert, Hex Workshop vous affiche le contenu du disque par secteur, en se positionnant sur le secteur zéro au début du disque. On peut se prommener sur tout le disque en changeant de secteur avec les touches Alt + flèches haut et bas, mais dans notre cas on va juste travailler sur le secteur zéro (MBR), donc on est déjà bien positionné. La manipulation à faire consiste en le changement des 446 premiers octets affichés, puis des deux derniers octets du secteur, et enfin de la sauvegarde du secteur. Pour éviter de devoir tapper un à un les 446 octets correspondant à un MBC valide, j'inclus en dessous ce qu'on va rentrer, de manière à ce qu'on puisse le copier/coller directement.
Les 446 octets suivants correspondent à un programme pour compatibles PC d'un MBC des plus classique, qui boote la partition active ou se plaint si il
n'en trouve pas. Ce MBC est directement issu du site ATA-ATAPI ou vous pourrez trouver le code désassemblé
de ce MBC si cela vous rassure/intéresse.
Pour commencer, nous allons créer un fichier temporaire, via Ctrl+N ou File/New. Sélectionnez tous les octets ci-dessus, puis copiez les via Ctrl+C ou le menu contextuel de votre navigateur. Allez ensuite dans Hex Workshop, puis sélectionnez le nouveau fichier. Enfin, utilisez le menu Edit/Paste Special..., et choisissez dans la liste qui s'affiche CF_TEXT, en cochant Interpret as a hexadecimal string. Vous devriez maintenant avoir dans votre nouveau fichier 446 octets affichés dans la vue hexadécimale. Allez maintenant dans le menu Tools/Generate Checksum..., vérifiez que CRC-32 et MD5 sont séléctionnés et cliquez sur Generate.
Dans l'assistant de résultat, vous devez maintenant avoir les sommes de contrôle qui suivent. Si ce n'est pas le cas, vérifiez que vous affichez les
données en hexadécimal partout (Options/File Offset/Hex), et relisez bien le paragraphe précédent.
Sommes de contrôle du MBC :
CRC-32 798CDA59
MD5 7208B105E661849D4A48C279D3177D8D
Vous avez maintenant vérifié que vous aviez un MBC correctement copié depuis cette page web, nous allons pouvoir le coller sur le disque amovible à la place de l'ancien qui ne marche pas. Copiez le MBC depuis votre fichier temporaire (Ctrl+A, Ctrl+C) pour l'avoir dans le presse papier dans un format propre à Hex Workshop. Allez maintenant dans la vue correspondant à votre disque amovible. Pour nous aider à positionner correctement les données à coller, nous allons utiliser le Structure Viewer d'Hex Workshop dans l'assistant numérique.
Cliquez sur son onglet, puis click droit au milieu de la fenètre du Structure Viewer. Choisissez Select Structure Library..., puis recherchez le fichier filesystem.hsl dans le dossier Structures contenu dans le dossier d'installation d'Hex Workshop (D:\Program Files\BreakPoint Software\Hex Workshop 4.1\ chez moi). Un nouveau click droit sur le Structure Viewer, puis Add Structure... vous permettra d'ajouter la structure MASTER_BOOT_RECORD comme sur l'exemple ci-dessous :
En cliquant sur BootCode dans la structure affichée, vous devriez voir apparaitre en vert la zone sur laquelle nous allons travailler. Le fait qu'il n'y ait que des zéro dans cette zone nous prouve que le MBC était bel et bien absent de ce MBR, d'ou la nécéssité de l'opération qui viens.
A l'aide de la souris, sélectionnez dans la vue hexadécimale toute la zone verte, puis collez le MBC correct à la place de cette sélection en utilisant au choix Edit/Paste, Ctrl+V, le menu contextuel. Une fois ceci fait, on va aussi mettre une marque valide à la fin du secteur du MBR, en cliquant sur EndOfSectorMarker dans le structure viewer, puis en tappant 55AA dans la zone maintenant en vert (les deux derniers octets). Il ne reste plus qu'à enregistrer ce secteur modifié sur le disque amovible, via File/Save.