Introduction

Ceci est une méthode un peu bourrine pour créer une disquette bootable MS-DOS sous linux, en utilisant la commande dd pour modifier le Master Boot Record(MBR), pour plus d’informations sur le MBR des disquettes MS-DOS il suffit d’aller sur ce site.
Le but est de créer une image de disquette pouvant être utilisé dans VirtualBox.

Prérequis

Avoir récupéré MS-DOS 6.22 sur le site de microsoft :
Fichier fr_msdos622.exe
SHA1SUM :94d1d6dc7758999647e9ceaf0d502437e1556ccc
Avoir installé dosbox et wine :
sudo apt-get install dosbox wine1.4

Avoir récupéré dislite :
Exécutable
Source

Création de la disquette de boot MS-DOS 6.22

Création d’une disquette formatée en FAT12

Allocation de 1.44Mo de la disquette :
dd if=/dev/zero of=floppy144.img bs=1024 count=1440
Formatage de la disquette :
mkdosfs floppy144.img

Extraction des fichiers MS-DOS de l’exécutable Microsoft

Il suffit de lancer la commande :
wine fr_msdos622.exe
Et de choisir où extraire les fichiers, un répertoire MSDOS622 sera créé.

Extraire le MBR du fichier SYS.COM

Le fichier SYS.COM contient un MBR contenant le microprogramme permettant de booter, cet exécutable est compressé par pklite et doit donc être décompressé, pour cela nous allons utiliser le programme dislite avec dosbox.
Placer dans le même répertoire dislite.exe et le fichier SYS.COM extrait précédemment puis exécuter dosbox :
dosbox dislite.exe
dislite SYS.COM
exit

Nous avons donc maintenant un fichier SYS.COM décompressé, il faut l’ouvrir avec un éditeur hexadécimal pour trouver l’emplacement du MBR et rechercher la signature en hexadécimal 55AA, j’ai donc utilisé ghex :
Ghex SYS.COM
L’adresse de l’octet suivant 55AA est dans ce cas 0x3286, le MDR fait 512 Octet soit 0x200, il faut donc extraire le MBR à partir de l’adresse 0x3086 soit 12442, qui commence bien par EB3C90, pour cela nous utilisons la commande dd:
dd if=SYS.COM of=mbr.bin ibs=1 skip=12422 count=512

Merge du MBR Microsoft et de la disquette 1.44

Nous allons extraire l’entête et la fin du MBR extrait de SYS.COM et garder du MBR de la disquette son BIOS Parameter Block, son numéro de série(généré lors du formatage), son nom et l’ID du File System.

Extraction de l’entête du MBR :
dd if=mbr.bin of=top.bin ibs=1 count=11
Extraction de la fin du MBR à partir de 0x3e donc 62 :
dd if=mbr.bin of=bottom.bin ibs=1 skip=62
Extaction du reste sur la disquette 1.44 :
dd if=floppy144.img of=middle.bin ibs=1 skip=11 count=51

Merge du nouveau MBR :
cat top.bin > newmbr.bin
cat middle.bin >> newmbr.bin
cat bottom.bin >> newmbr.bin

Création de la nouvelle disquette bootable MS-DOS 6.22

Extraction du reste de la disquette :
dd if=floppy144.img of=floppy.with.no.mbr.bin ibs=1 skip=512
Concaténation du nouveau MBR et du reste de la disquette :
cat newmbr.bin > newfloppy.ima
cat floppy.with.no.mbr.bin >> newfloppy.ima

Il faut ensuite rajouter les fichiers IO.SYS, MSDOS.SYS et COMMAND.COM extraient précédemment :
Montage de la disquette :
mkdir floppymount
sudo mount -o loop newfloppy.ima floppymount
sudo cp MSDOS622/IO.SYS floppymount
sudo cp MSDOS622/MSDOS.SYS floppymount
sudo cp MSDOS622/COMMAND.COM floppymount
sudo umount floppymount

Ça y est la disquette est bootable.

Pour aller plus loin

Il est possible de désassembler le programme du MBR : en prenant le fichier mbr.bin extrait de SYS.COM et le désassemblant avec la commande :
objdump -D -b binary -mi386 -Maddr16,data1 mbr.bin
Nous pouvons voir que la première instructions est un jump vers 0x3e (début du programme) donc le bottom.bin, il est donc possible de le désassembler avec la commande :
objdump -D -b binary -mi386 -Maddr16,data1 bottom.bin
Attention, le bottom.bin contient aussi les messages d’erreur ainsi que les fichiers cherchés sur la disquette pour démarrer.