- Un jeu de Snake qui s’exécute sous Windows, Linux et dans le navigateur à partir d’un unique fichier de 13 KiB, avec prise en charge des trois plateformes depuis une seule source
- Il suit les règles classiques de Snake : contrôler le serpent pour manger la nourriture sans heurter les murs, avec score, niveaux et structure en labyrinthe
- Chaque plateforme est implémentée en C (WinAPI/X11) et en JavaScript (HTML5 Canvas), puis compressée et fusionnée pour tenir dans environ 3 à 5 KiB chacune
- Windows s’exécute via un en-tête PE atypique et le mécanisme apphelp, Linux via la compression
lzma et un dropper shell, et le navigateur via des astuces HTML/CSS
- En combinant les trois implémentations, l’auteur obtient un unique exécutable de 13 312 octets, montrant le potentiel expérimental d’une structure d’exécutable multiplateforme
Une approche multiplateforme inspirée par Cosmopolitan libc
- Cosmopolitan libc est une boîte à outils permettant de compiler du code source C en un unique binaire exécutable sur plusieurs systèmes d’exploitation
- Exécution native prise en charge sur divers OS comme Windows, Linux et BSD
- En raison de l’absence de support GUI et de la taille importante des binaires, l’auteur a choisi de relever le défi de créer lui-même un jeu vidéo de moins de 16 KiB
- L’objectif était de produire un jeu basé sur une source unique, exécutable sous Windows, Linux et dans le navigateur
Structure et règles du jeu
- Le jeu est un Snake standard, contrôlé avec les flèches directionnelles ou WASD
ESC pour quitter, R pour réinitialiser, P pour mettre en pause, barre d’espace pour démarrer
- Le score augmente à chaque nourriture mangée : 10 points pour la nourriture normale, 20 points pour la nourriture jaune (15 % de probabilité)
- La nourriture disparaît après un certain temps, déterminé par la vitesse du serpent (proportionnelle à sa longueur)
- Après 10 nourritures mangées, on passe au niveau suivant, avec une disposition des murs modifiée aléatoirement
- Le labyrinthe est généré de manière à toujours laisser un chemin jusqu’à la nourriture
- La position initiale du serpent est elle aussi aléatoire, mais placée dans une direction garantissant au moins 5 cases libres
- La taille du fichier du jeu terminé est de 13 772 octets
Implémentation sur les trois plateformes
- La version Windows est écrite en C sur WinAPI et inclut un script de compression et un stub décompresseur
- Elle exploite les octets librement contrôlables après la signature
MZ de l’en-tête PE pour insérer un script shell
- Le fichier est ainsi à la fois un exécutable Windows valide et un script shell Linux valide
- Au premier lancement, l’erreur « The application was unable to start correctly (0xc0000005) » peut apparaître, mais une relance permet un fonctionnement normal
- La version Linux utilise la compression
lzma, et un petit dropper shell extrait puis exécute le binaire ELF64 compressé
- Elle est conçue pour s’exécuter en ignorant certaines parties situées au début et à la fin du fichier
- La version HTML exploite le fait que le navigateur ignore les données inutiles en tête de fichier et traite ensuite le HTML
- Le CSS est utilisé pour empêcher l’affichage à l’écran des données inutiles
Assemblage et structure du fichier unique
- Les fichiers des trois plateformes sont concaténés dans un ordre précis, afin que chaque environnement n’exécute que la partie qui lui correspond
- Windows reconnaît la section PE, Linux la section ELF, et le navigateur la section HTML
- La taille finale du fichier est de 13 312 octets, aboutissant à un binaire polyglotte exécutable dans les trois environnements
- Le fichier contient successivement un en-tête PE Windows, du code compressé LZMA pour Linux, puis du code HTML/CSS/JavaScript
- Les exemples de code montrent notamment la signature
MZ, le marqueur ks, la balise <html> et un bloc <script> placés dans cet ordre
Portée technique
- Mise en œuvre d’une structure d’exécution unique prenant en charge Windows, Linux et le navigateur dans un seul fichier
- Bifurcation des chemins d’exécution selon la plateforme grâce à l’imbrication des formats PE, ELF et HTML
- Une réalisation expérimentale combinant compression, détournement de formats et exécution multiplateforme dans une taille extrêmement réduite de 13 KiB
Aucun commentaire pour le moment.