Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
la_partie_executable_du_mbr [Le 22/09/2016, 11:38] – [Exemple de zone exécutable d'un mbr] Nasman | la_partie_executable_du_mbr [Le 23/04/2020, 12:49] (Version actuelle) – [Exemple de zone exécutable d'un mbr] 82.254.192.58 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | . | ||
+ | {{tag> tutoriel mbr BROUILLON}} | ||
+ | ---- | ||
+ | |||
+ | ====== Que trouve-t-on comme programme dans le mbr ====== | ||
+ | |||
+ | Si vous êtes arrivés sur cette page par erreur, faites demi tour sans tarder car ici se trouve l' | ||
+ | \\ | ||
+ | Le mbr est le premier secteur du disque chargé en mémoire lors du démarrage d'un ordinateur. Il a pour fonction principale de rechercher une partition où se trouve un système d' | ||
+ | \\ | ||
+ | Avant tout il faudra vérifier que la table des partitions est conforme - à défaut un message d' | ||
+ | |||
+ | ===== Pré-requis ===== | ||
+ | |||
+ | * Disposer des [[: | ||
+ | * Connaitre la numération hexadécimale. | ||
+ | * Connaitre le langage assembleur | ||
+ | * Avoir installé un assembleur/ | ||
+ | |||
+ | ===== Que se passe-t-il au démarrage d'un PC ? ===== | ||
+ | |||
+ | Lors de la mise sous tension, différentes routines se mettent en place ; la première consiste à attendre que la tension de l' | ||
+ | \\ | ||
+ | Vient ensuite la recherche de périphériques de démarrage selon l' | ||
+ | \\ | ||
+ | Le bios charge alors le premier secteur du disque (512 octets) en mémoire vive à l' | ||
+ | \\ | ||
+ | Ce type d' | ||
+ | \\ | ||
+ | Une fois le chargement terminé et sans erreur, l' | ||
+ | \\ | ||
+ | <note tip>Lors d'un démarrage en mode UEFI avec un disque GPT, le mbr (protector) ne semble quasiment pas utilisé et seul l' | ||
+ | ===== Comment accéder à ces informations ===== | ||
+ | |||
+ | Nous avons vu comment afficher le contenu du mbr ; ici il faudra effectuer deux opérations : | ||
+ | \\ | ||
+ | \\ | ||
+ | - effectuer une copie de la partie exécutable du mbr (les 440 premiers octets) sous la forme d'un fichier | ||
+ | \\ | ||
+ | - utiliser un désassembleur pour afficher les instructions sous une forme lisibles par un humain (c'est tout relatif - à moins que je ne sois pas humain) au lieu de valeurs hexadécimales (opcodes) | ||
+ | \\ | ||
+ | \\ | ||
+ | Pour la première opération, on rentrera dans un terminal | ||
+ | < | ||
+ | \\ | ||
+ | La deuxième opération transforme le fichier d' | ||
+ | \\ | ||
+ | < | ||
+ | \\ | ||
+ | ndisasm est le désassembleur du paquet nasm, -b16 indique que le code doit être considéré comme de l' | ||
+ | Le résultat est écrit dans le fichier ~/ | ||
+ | \\ | ||
+ | Le résultat brut pose problème car des chaines de texte ont été considérées comme des instructions et sont donc mal interprétées. Il faut alors procéder par tâtonnement pour les repérer (par exemple avec un éditeur hexa) et les exclure du traitement de désassemblage. | ||
+ | \\ | ||
+ | Une autre difficulté est que certaines adresses peuvent contenir, soit du code à un moment donné, soit des données (zone tampon) lorsque le code n'est plus utilisé. | ||
+ | |||
+ | ===== Exemple de zone exécutable d'un mbr ===== | ||
+ | |||
+ | L' | ||
+ | \\ | ||
+ | J'ai effectué une analyse (partielle) du fonctionnement des différents morceaux mais des parties restent encore nébuleuses. | ||
+ | \\ | ||
+ | Le programme utilise des fonctions du bios (seules fonctions disponibles à ce stade du démarrage du PC) et je me suis servi de la liste des [[http:// | ||
+ | | ||
+ | \\ | ||
+ | \\ | ||
+ | Voilà donc à quoi ressemble la chose. | ||
+ | \\ | ||
+ | < | ||
+ | 00000000 | ||
+ | 00000002 | ||
+ | 00000003 | ||
+ | 00000004 resb 1 ; mode : 0x00 pour le mode CHS, 0x01 pour le mode LBA | ||
+ | |||
+ | ; Buffer pour chargement en mode CHS | ||
+ | 00000005 resd 1 ; nombre de secteurs | ||
+ | 00000009 resd 1 ; nombre de têtes | ||
+ | 0000000D resd 1 ; nombre de cylindres | ||
+ | |||
+ | ; Buffer pour chargement en mode LBA | ||
+ | 00000005 | ||
+ | 00000007 resw 1 ; 0x0001 - nb blocs à transférer | ||
+ | 00000009 resw 1 ; 0x0000 | ||
+ | 0000000B resw 1 ; 0x7000 - buffer en 0x70000000 | ||
+ | 0000000D resd 1 ; 0x00000001 - emplacement LBA du bloc à charger | ||
+ | 00000011 resd 1 ; 0x00000000 - démarrer au bloc 0x0000000000000001 | ||
+ | |||
+ | |||
+ | 0000005A | ||
+ | 0000005C | ||
+ | 00000060 | ||
+ | 00000064 | ||
+ | |||
+ | 00000065 | ||
+ | 00000066 | ||
+ | 00000067 | ||
+ | 00000068 | ||
+ | 0000006B | ||
+ | 0000006D | ||
+ | 0000006F | ||
+ | 00000074 | ||
+ | 00000076 | ||
+ | 00000078 | ||
+ | 0000007A | ||
+ | 0000007D | ||
+ | 0000007E | ||
+ | 00000081 | ||
+ | 00000083 | ||
+ | 00000085 | ||
+ | 00000087 | ||
+ | 00000088 | ||
+ | 0000008B | ||
+ | 0000008E | ||
+ | 00000090 | ||
+ | 00000093 | ||
+ | |||
+ | 00000096 | ||
+ | 00000099 | ||
+ | 0000009C | ||
+ | 0000009E | ||
+ | 000000A0 | ||
+ | 000000A3 | ||
+ | 000000A5 | ||
+ | 000000A6 | ||
+ | 000000A7 | ||
+ | 000000A9 | ||
+ | 000000AD | ||
+ | |||
+ | 000000AF | ||
+ | 000000B2 | ||
+ | |||
+ | ; traitement extension lba_mode | ||
+ | 000000B4 | ||
+ | 000000B6 | ||
+ | 000000B9 | ||
+ | 000000BA | ||
+ | 000000BD | ||
+ | 000000C0 | ||
+ | 000000C4 | ||
+ | 000000C9 | ||
+ | 000000CD | ||
+ | 000000D2 | ||
+ | 000000D6 | ||
+ | 000000DB | ||
+ | 000000DD | ||
+ | 000000DF | ||
+ | 000000E1 | ||
+ | 000000E4 | ||
+ | |||
+ | ; traitement sans extension chs_mode | ||
+ | 000000E6 | ||
+ | 000000E8 | ||
+ | 000000EA | ||
+ | 000000EC | ||
+ | 000000EF | ||
+ | 000000F3 | ||
+ | 000000F6 | ||
+ | |||
+ | 000000F9 | ||
+ | 000000FD | ||
+ | 00000100 | ||
+ | 00000101 | ||
+ | 00000105 | ||
+ | 00000108 | ||
+ | 0000010B | ||
+ | 0000010D | ||
+ | 0000010F | ||
+ | 00000110 | ||
+ | 00000113 | ||
+ | 00000116 | ||
+ | 00000119 | ||
+ | 0000011C | ||
+ | 00000120 | ||
+ | 00000123 | ||
+ | |||
+ | ; Convertit adresse linéaire en tête, secteur et cylindre | ||
+ | 00000125 | ||
+ | 00000129 | ||
+ | 0000012C | ||
+ | 0000012F | ||
+ | 00000131 | ||
+ | 00000133 | ||
+ | 00000137 | ||
+ | 0000013A | ||
+ | 0000013C | ||
+ | 0000013E | ||
+ | 00000140 | ||
+ | 00000142 | ||
+ | 00000145 | ||
+ | 00000147 | ||
+ | 00000149 | ||
+ | 0000014A | ||
+ | 0000014C | ||
+ | 0000014F | ||
+ | 00000151 | ||
+ | 00000153 | ||
+ | 00000156 | ||
+ | 00000158 | ||
+ | 0000015A | ||
+ | |||
+ | ; Copie des données chargées (partie commune mode CHS ou LBA) | ||
+ | 0000015C | ||
+ | 0000015D | ||
+ | 0000015E | ||
+ | 00000161 | ||
+ | 00000163 | ||
+ | 00000165 | ||
+ | 00000168 | ||
+ | 0000016A | ||
+ | 0000016B | ||
+ | 0000016D | ||
+ | 0000016E | ||
+ | 0000016F | ||
+ | |||
+ | |||
+ | 00000173 | ||
+ | 00000176 | ||
+ | 00000178 | ||
+ | 0000017B | ||
+ | 0000017E | ||
+ | 00000181 | ||
+ | 00000184 | ||
+ | 00000186 | ||
+ | |||
+ | ; Chaînes messages d' | ||
+ | 00000188 | ||
+ | 0000018E | ||
+ | 00000193 | ||
+ | 0000019D | ||
+ | 000001A2 db " Error", | ||
+ | |||
+ | ; Affiche caractère | ||
+ | 000001AB | ||
+ | 000001AE | ||
+ | 000001B0 | ||
+ | |||
+ | ; Affiche une chaine | ||
+ | 000001B2 | ||
+ | 000001B3 | ||
+ | 000001B5 | ||
+ | 000001B7 | ||
+ | \\ | ||
+ | <note tip> | ||
+ | \\ | ||
+ | Ici nous avons la LBA qui vaut 1, soit le secteur qui suit le mbr. Dans le cas d'un partitionnement GPT cet emplacement est occupé par l' | ||
+ | \\ | ||
+ | Le programme chargé en mémoire à l' | ||
+ | \\ | ||
+ | \\ | ||
+ | Différentes parties sont visibles : | ||
+ | \\ | ||
+ | \\ | ||
+ | de 065 à 095 - Routine vérifie que le boot s' | ||
+ | \\ | ||
+ | de 096 à 0b3 - Définit l' | ||
+ | \\ | ||
+ | de 0b4 à 0e5 - Charge le premier secteur de core.img en mode LBA (interruption bios int13/ | ||
+ | \\ | ||
+ | de 0e6 à 0f8 - Récupère les paramètres du disque et gère les erreurs | ||
+ | \\ | ||
+ | de 0f9 à 124 - Sauvegarde ces paramètres dans la zone des paramètres de chargement | ||
+ | \\ | ||
+ | de 125 à 15b - Convertit l' | ||
+ | \\ | ||
+ | de 15c à 172 - Recopie le secteur chargé à son nouvel emplacement et saute à cet emplacement (première partie de core.img, soit diskboot.img) | ||
+ | \\ | ||
+ | de 173 à 187 - Affichage des messages d' | ||
+ | \\ | ||
+ | de 1ab à 1b0 - Affichage de caractères | ||
+ | \\ | ||
+ | de 1b2 à 1b7 - Affichage des chaînes des messages d' | ||
+ | \\ | ||
+ | ===== Voir aussi ===== | ||
+ | \\ | ||
+ | |||
+ | * **(fr)** [[http:// | ||
+ | * **(fr)**[[http:// | ||
+ | * [[http:// | ||
+ | * **(fr)**[[http:// | ||
+ | |||
+ | |||
+ | ---- | ||
+ | // | ||