Skip to content
research

Секретный код, скрытый в ваших эмодзи

Разработчик случайно обнаружил странную особенность Unicode, благодаря которой многие эмодзи превращаются в валидный машинный код x86. Это привело к созданию полноценных DOS-программ, написанных исключительно с помощью смайликов и символов.

Aki Tanaka
Секретный код, скрытый в ваших эмодзи

От 🐐 до машинного кода

Разработчик GloriousCow наткнулся на удивительный секрет во время создания веб-инструмента x86 disassembler. Он заметил любопытное поведение: при вставке эмодзи в его инструмент они преобразовывались через URL-кодирование в шестнадцатеричные последовательности байтов. Эта, казалось бы, тривиальная деталь вскоре раскрыла глубокую особенность цифрового кодирования.

Ключевой момент наступил с простым эмодзи козы. GloriousCow вставил 🐐, и система вернула URL-кодированную строку %F0%9F%90%90. Убрав знаки процента, он увидел исходную шестнадцатеричную последовательность F0 9F 90 90, которая оказалась идеально валидным языком ассемблера 8088.

Эмодзи козы по чистому совпадению дезассемблировался в специфические инструкции процессора. F0 представлял собой префикс LOCK, обеспечивающий монопольный доступ к памяти. 9F транслировался в инструкцию LAHF, загружающую регистр AH младшим байтом регистра EFLAGS. Два байта 90 были классическими NOP, или инструкциями «нет операции».

Это было не просто случайное явление. Почти каждый четырехбайтовый графем эмодзи в UTF-8 начинается с префикса байтов F0 9F. Этот фундаментальный аспект кодирования Unicode, используемый для символов вне основной многоязычной плоскости (Basic Multilingual Plane), непреднамеренно заложил основу для того, чтобы эмодзи функционировали как исполняемый машинный код.

Совпадение Unicode

Удивительное совпадение начинается с кодирования Unicode. Большинство эмодзи, таких как 🐐, находятся вне Basic Multilingual Plane, требуя четырехбайтовых последовательностей UTF-8. Важно отметить, что почти каждая графем эмодзи в UTF-8 начинается с префикса байтов F0 9F — стандартного конструктивного решения для дополнительных символов.

Процессор 8088 интерпретирует байт F0 как префикс LOCK, модификатор инструкции. В этих старых архитектурах x86 этот префикс часто безвредно игнорируется или действует как no-op для многих инструкций. Это позволяет последующему байту 9F выполниться, часто как инструкция LAHF, а оставшимся байтам эмодзи — продолжать формировать валидные опкоды или операнды.

GloriousCow обнаружил, что некоторые последовательности эмодзи создают неполные инструкции, имеющие опкод, но лишенные необходимых данных. Этот механизм «открытого хвоста» (open tail) позволяет байтам следующего эмодзи предоставить недостающий операнд, например, непосредственное значение для инструкции MOV. Соединяя эмодзи, разработчики создают сложные функциональные команды ассемблера, превращая внешне безобидные символы в исполняемый код.

Создание тулчейна 'Emojissembly'

GloriousCow быстро перешел от открытия к демонстрации. Он создал полноценную программу «Hello», собрав ее примерно из 30 тщательно отобранных эмодзи. Сохраненный как «сырой» файл UTF-8 с расширением .com, этот уникальный исполняемый файл отлично работал в среде DOS, выводя приветствие на экран. Этот первый триумф подтвердил причудливый потенциал эмодзи как машинного кода.

Однако создание сложных программ представляло собой серьезное техническое препятствие: как кодировать произвольные данные. Хотя некоторые эмодзи удачно отображались в полезные инструкции x86, подавляющее большинство значений байтов не имели чистого и прямого эквивалента в виде эмодзи. Это означало, что прямое представление данных, таких как текстовые строки или числовые константы, стало сложной задачей.

GloriousCow разработал остроумное решение, используя x86 AAD instruction, или «ASCII Adjust AX Before Division». Эта инструкция, обычно применяемая для BCD-арифметики, позволяет задавать произвольное основание для внутренних вычислений. С помощью AAD он создал крошечный автономный декодер, способный восстановить любое нужное значение байта из последних байтов специально подобранного набора из 256 эмодзи. Этот прорыв позволил создавать программы с полной поддержкой данных.

Нравится статья? Получайте такие каждое утро на почту.

одно письмо в день · отписка в два клика · без сторонних трекеров

Почему непрактичная инженерия имеет значение

Случайное открытие GloriousCow, подробно описанное в статье Better Stack «So Emojis Are Apparently Executable Now», является ярким примером удивительно ненужной инженерии. Этот проект воспевает глубокие системные знания, превращая абстрактные последовательности байтов в причудливые исполняемые символы. Это гениальная демонстрация того, как глубокое понимание кодировки Unicode и наборов инструкций x86 может раскрыть удивительные, почти поэтические возможности в устоявшихся архитектурах, превращая привычное в фантастическое.

Реакция сообщества на это открытие была мгновенной и восторженной, быстро появился термин 'emojissembly'. Это вызвало оживленные дискуссии в кругах ретрокомпьютинга и низкоуровневой разработки, поставив под сомнение предположения о том, как мы взаимодействуем с машинным кодом. Разработчики обсуждали последствия префикса F0 9F в UTF-8, восхищаясь случайным совпадением кодировки эмодзи и опкодов x86, что демонстрирует скрытую гибкость этих стандартов, существующих десятилетиями.

Крайне важно, что такие проекты жизненно необходимы. Они поощряют игривое исследование, раздвигая границы возможного с помощью существующих технологий, а не фокусируясь исключительно на практическом применении. Работа GloriousCow показывает, что даже системы десятилетней давности, такие как среда DOS, в которой работает его программа Hello из 30 эмодзи, все еще хранят восхитительные, неожиданные секреты, ожидающие любознательных умов. Эта игривая изобретательность вдохновляет будущие поколения копать глубже, доказывая, что инновации часто расцветают из самых неожиданных и, казалось бы, непрактичных начинаний.

Часто задаваемые вопросы

Можно ли использовать любой эмодзи в качестве исполняемого кода?

Нет, не любой. Это явление в основном применимо к четырехбайтовым эмодзи UTF-8, многие из которых начинаются со специфического байтового префикса (F0 9F), который процессор 8088 может интерпретировать как корректные инструкции.

Кто обнаружил, что эмодзи могут быть исполняемыми?

Разработчик, известный как GloriousCow (Daniel Balsom), сделал это случайное открытие во время создания веб-дизассемблера x86, заметив, как эмодзи козы было закодировано в URL.

Является ли это практичным способом написания программного обеспечения?

Абсолютно нет. Это крайне непрактичное, но блестящее доказательство концепции, демонстрирующее глубокое понимание низкоуровневых систем. Это творческий инженерный подвиг, а не новая парадигма программирования.

Что такое 'emojissembly'?

'Emojissembly' — это неофициальное название техники написания исполняемых программ на языке ассемблера с использованием только символов эмодзи в качестве исходного кода.

Как это работает с произвольными данными, например, текстовыми строками?

Создатель построил крошечный декодер, используя инструкцию x86 AAD. Это позволяет программе восстанавливать любое значение байта из уникальных хвостовых байтов 256 специально подобранных эмодзи.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only