De 🐐 au code machine
Le développeur GloriousCow est tombé sur un secret remarquable en construisant un x86 disassembler basé sur le web. Il a observé un comportement curieux : coller des emojis dans son outil les faisait encoder en URL sous forme de séquences d'octets hexadécimaux. Ce détail apparemment trivial allait bientôt révéler une bizarrerie profonde de l'encodage numérique.
Le moment charnière est arrivé avec un simple emoji chèvre. GloriousCow a collé 🐐, et le système a renvoyé la chaîne encodée en URL %F0%9F%90%90. En supprimant les signes de pourcentage, la séquence hexadécimale brute F0 9F 90 90 l'a frappé : c'était un langage assembleur 8088 parfaitement valide.
L'emoji chèvre, par pure coïncidence, s'est désassemblé en instructions CPU spécifiques. F0 représentait le préfixe LOCK, garantissant un accès exclusif à la mémoire. 9F se traduisait par l'instruction LAHF, chargeant le registre AH avec l'octet inférieur du registre EFLAGS. Deux octets 90 étaient des NOP classiques, ou instructions "no operation".
Il ne s'agissait pas simplement d'une occurrence aléatoire. Presque chaque graphème emoji de quatre octets en UTF-8 commence par le préfixe d'octet F0 9F. Cet aspect fondamental de l'encodage Unicode, utilisé pour les caractères en dehors du Basic Multilingual Plane, a par inadvertance jeté les bases pour que les emojis fonctionnent comme du code machine exécutable.
La coïncidence Unicode
Une coïncidence remarquable commence avec l'encodage Unicode. La plupart des emojis, comme 🐐, résident en dehors du Basic Multilingual Plane, nécessitant des séquences UTF-8 de quatre octets. De manière cruciale, presque chaque graphème emoji en UTF-8 commence par le préfixe d'octet F0 9F, un choix de conception standard pour les caractères supplémentaires.
Un processeur 8088 interprète l'octet F0 comme le préfixe LOCK, un modificateur d'instruction. Sur ces anciennes architectures x86, ce préfixe est souvent ignoré sans dommage ou agit comme un no-op pour de nombreuses instructions. Cela permet à l'octet 9F suivant de s'exécuter, fréquemment en tant qu'instruction LAHF, et aux octets emoji restants de continuer à former des opcodes ou des opérandes valides.
GloriousCow a découvert que certaines séquences d'emojis créent des instructions incomplètes, possédant un opcode mais manquant des données nécessaires. Ce mécanisme de "open tail" permet aux octets d'un emoji suivant de fournir l'opérande manquant, comme une valeur immédiate pour une instruction MOV. En enchaînant les emojis, les développeurs construisent des commandes assembleur complexes et fonctionnelles, transformant des symboles apparemment inoffensifs en code exécutable.
Construction de la chaîne d'outils 'Emojissembly'
GloriousCow est rapidement passé de la découverte à la démonstration. Il a créé un programme "Hello" entièrement fonctionnel, l'assemblant à partir d'environ 30 emojis soigneusement sélectionnés. Enregistré sous forme de fichier UTF-8 brut avec une extension .com, cet exécutable unique a fonctionné parfaitement dans un environnement DOS, imprimant son message d'accueil à l'écran. Ce triomphe initial a validé le potentiel bizarre des emojis en tant que code machine.
La construction de programmes complexes a cependant présenté un obstacle technique important : comment encoder des données arbitraires. Bien que certains emojis correspondent par hasard à des instructions x86 utiles, la grande majorité des valeurs d'octets manquaient d'un équivalent emoji propre et direct. Cela signifiait que représenter directement des données, comme des chaînes de texte ou des constantes numériques, devenait un défi formidable.
GloriousCow a conçu une solution ingénieuse exploitant l'instruction x86 AAD, ou "ASCII Adjust AX Before Division". Cette instruction, normalement utilisée pour l'arithmétique BCD, peut spécifier une base personnalisée pour ses calculs internes. En utilisant AAD, il a construit un décodeur minuscule et autonome capable de reconstruire n'importe quelle valeur d'octet souhaitée à partir des octets finaux d'un ensemble spécialement choisi de 256 emojis. Cette percée a permis la construction de programmes avec une prise en charge complète des données.
Cet article vous plaît ? Recevez-en un comme celui-ci chaque matin.
un e-mail par jour · désinscription en deux clics · aucun traqueur tiers
Pourquoi l'ingénierie peu pratique est importante
La découverte accidentelle de GloriousCow, détaillée par Better Stack dans « So Emojis Are Apparently Executable Now », constitue un excellent exemple d'ingénierie merveilleusement inutile. Ce projet célèbre une connaissance approfondie des systèmes, transformant des séquences d'octets abstraites en symboles fantaisistes et exécutables. C'est une démonstration ingénieuse de la façon dont une compréhension approfondie de l'encodage Unicode et des jeux d'instructions x86 peut révéler des capacités surprenantes, presque poétiques, au sein d'architectures établies, transformant le familier en fantastique.
La réponse de la communauté à cette révélation a été immédiate et enthousiaste, inventant rapidement le terme 'emojissembly'. Cela a suscité des discussions animées dans les cercles du rétro-informatique et du développement bas niveau, remettant en question les hypothèses sur la façon dont nous interagissons avec le code machine. Les développeurs ont débattu des implications du préfixe F0 9F de l'UTF-8, s'émerveillant de l'alignement fortuit de l'encodage des emojis et des opcodes x86, mettant en valeur la flexibilité latente de ces normes vieilles de plusieurs décennies.
Il est crucial que de tels projets existent. Ils encouragent une exploration ludique, repoussant les limites de ce qui est considéré comme possible avec les technologies existantes, plutôt que de se concentrer uniquement sur des applications pratiques. Le travail de GloriousCow révèle que même des systèmes vieux de plusieurs décennies, comme l'environnement DOS exécutant son programme Hello de 30 emojis, recèlent encore des secrets délicieux et inattendus qui attendent que des esprits curieux les découvrent. Cette ingéniosité ludique inspire les générations futures à creuser plus profondément, prouvant que l'innovation naît souvent des entreprises les plus inattendues et apparemment peu pratiques.
Foire aux questions
N'importe quel emoji peut-il être utilisé comme code exécutable ?
Non, pas tous. Le phénomène s'applique principalement aux emojis UTF-8 de quatre octets, dont beaucoup commencent par un préfixe d'octet spécifique (F0 9F) que le processeur 8088 peut interpréter comme des instructions valides.
Qui a découvert que les emojis pouvaient être exécutables ?
Un développeur connu sous le nom de GloriousCow (Daniel Balsom) a fait cette découverte accidentelle alors qu'il construisait un désassembleur x86 basé sur le Web et qu'il a remarqué comment un emoji de chèvre était encodé en URL.
Est-ce une façon pratique d'écrire des logiciels ?
Absolument pas. C'est une preuve de concept très peu pratique mais brillante qui démontre une compréhension approfondie des systèmes bas niveau. C'est une prouesse d'ingénierie créative, pas un nouveau paradigme de programmation.
Qu'est-ce que l'« emojissembly » ?
« Emojissembly » est le nom informel donné à la technique consistant à écrire des programmes en langage assembleur exécutables en utilisant uniquement des caractères emoji comme code source.
Comment cela gère-t-il des données arbitraires comme des chaînes de texte ?
Le créateur a construit un minuscule décodeur utilisant l'instruction x86 AAD. Cela permet au programme de reconstruire n'importe quelle valeur d'octet à partir des octets de fin uniques de 256 emojis spécifiquement choisis.

