Quels sont les fichiers EXE ?

Un Exe, comment c'est fait ?
Voilà la question que je me suis souvent posé avant de me pencher sur le format de fichier en question. Dans la suite de cet article, je vais tenter de faire la lumière sur ce sujet par des mots simples et des schémas, qui je l'espère, seront compréhensible par tous.
A quoi ça sert ?
Bon, c'est simple pour la plupart des programmeurs mais rappelons ce qu'est un exe. Un exe avant tout, c'est un fichier, donc une suite de données ou octets placée sur le disque dur comme n'importe quel fichier text ou autre. Cela dit, ces données ne sont pas lisibles sous forme de lettre ou de chiffre par nous autres être humain (bien que certains montrent des prédispotions ;-P ). Ce type de fichier, comme son nom l'indique, est executable. Cela signifie que la machine peut non seulement le lire mais aussi réagir en fonction de ce qu'il y a écrit dedans. C'est une suite de commande qui indique à la machine de faire telle ou telle chose, et tant que toutes les commandes n'ont pas été traité (sachant que les commandes peuvent être executer indéfiniment), il reste en mémoire et continue d'être executer. On peut voir à partir du TaskManager de Windows (en tapant Ctrl+Alt+Supp), tous les fichiers exe en cours d'execution, c'est en quelque sorte tous les fichiers que la machine est en train de lire. jusque là ... c'est plutôt clair !
Existe-t-il plusieurs types d'exe ?
Oui, il existe plusieurs types d'executables exe, dll, ocx, sys, vxd, drv, icl, cpl et bien d'autres encore. Pour faire simple, nous ne parlerons que des fichiers exe et dans ces fichiers, il y a aussi des sous catégories. La plus connue est la catégorie de platforme. C'est-à-dire qu'il existe des exe pour les platformes DOS, Windows 16Bits, Windows 32Bits que l'on appelle respectivement MZ, LE ou NE et PE. Ces lettres designent la signature du fichier, c'est-à-dire son espèce ou sa forme. Nous ne traiterons dans cet article que de "l'espèce" PE (ou Portable Executable) qui correspond aux fichiers exe que l'on trouve le plus souvent sur les machines qui tournent sur Win9x à WinXP, par exemple Notepad.exe (le bloc note) est un Exe PE !
De quoi est fait un exe ?
Voici notre premier schéma d'un exe, c'est un peu comme un cv fait avec un traitement de texte. Il comporte plusieurs parties représentant le programme, expliquant ses connaissances, ses dependances ainsi que tout ce dont il est capable de faire :
Quels sont les fichiers EXE ?
Au tout debut du fichier on trouve l'entête MZ ou entête DOS, il permet la compatibilité des programmes sous DOS, c'est lui qui affiche le fameux message "This program can not be run in dos mode".
Vient apres l'entête PE ou Win32, il explique au système comment executer le programme et definit plusieurs options. Par exemple, c'est lui qui indique au système si l'executable est un Exe ou une dll. Il explique aussi au système quelles dll doivent être chargées au demarrage.
Puis viennent les sections : ce sont les données qui représentent le code machine, les tables ou les ressources comme les icones.
Comment le système lit mes fichiers exe ?
Voyons maintenant comment le système utilise les fichiers exe. Lorsque vous cliquez sur l'icone d'un programme ou lorsque celui-ci démarre, le système commence par verrouillé le fichier en mémoire dans le but de le lire. Il peut être executé par la machine et dispose donc de 2Go d'espace mémoire virtuel qui vont être utilisé pour diverses raisons, comme le mapping de dll ou pour la gestion des tableaux dynamique etc...
Quels sont les fichiers EXE ?
Le fichier est disponible en mémoire comme on peut le voir sur le schéma, chaque octet est à la place qu'il occupait sur le disque à part les sections qui vont être chargées une à une. Une relocation peut être effectuer sur certaines parties du fichier qui n'ont pas besoin d'être lu ou qui peuvent être lu plus tard. Ce qui permet d'économiser de la mémoire en fonction des besoins du programme.
Une fois mappée, la machine commence à lire et à executer les commandes une à une, à partir du point d'entrée du programme. Point d'entrée qui peut se trouver n'importe où dans le fichier. Ce point d'entrée est néanmoins defini dans l'entête PE.