Исполняемые эмодзи: программа для x86 из одних смайликов
Всё началось с случайного наблюдения. Автор баловался с собственным онлайн-дизассемблером x86 и заметил, что вставленный в адресную строку эмодзи козы 🐐 кодируется в UTF-8 как последовательность %F0%9F%90%90. Знакомым с ассемблером x86 байт 90h скажет о многом: это опкод NOP, «пустая операция». Байт F0h на процессоре 8088 — префикс LOCK, который для большинства инструкций попросту игнорируется, а 9Fh — это LAHF. Иными словами, коза целиком представляет собой корректный код: lock lahf; nop; nop.
Дальше последовал закономерный вопрос. Подавляющее большинство эмодзи в UTF-8 начинаются с байтов F0 9F, так почему бы не написать программу для 8088, используя одни только отображаемые смайлики?
Прецеденты
Идея не нова: давно известно, что исполняемые файлы можно собирать из одних печатных ASCII-символов. Самый знаменитый пример — тестовый файл EICAR, который одновременно является строкой и валидным DOS-исполняемым, печатающим предупреждение антивируса. Публиковались и крохотные ASCII-утилиты вроде терминала TCOM, которые можно было в крайнем случае набрать с клавиатуры. А вот эмодзи как машинный код, по словам автора, никто прежде всерьёз не пробовал.
«HELLO» на смайликах
Первым делом — Hello World, точнее его усечённая версия, печатающая лишь HELLO (арифметика в эмодзи — сущее мучение). Итоговая программа из 141 байта сохраняется как .COM-файл в UTF-8 без BOM и исполняется в DOSBox-X. Буквы синтезируются вручную, по одной; например, вычитание FFB8h эквивалентно прибавлению 48h — а 48h как раз ASCII-код буквы H. Одна из букв L при этом выходит зелёной: инструкция LAHF затирает регистр флагов, содержимое которого случайно оказывается видимым атрибутом цвета. Автор оставил этот глюк намеренно — как «крохотный намёк на творящийся за кулисами кошмар».
В статье приводится целый справочник — «эмоджиассемблер»: таблицы отдельных эмодзи (коза как четырёхбайтовое выравнивание, корова 🐮 как аккуратный инкремент указателя), эмодзи с «открытым хвостом», чьи недописанные байты подхватывает следующий символ, и готовые «гаджеты» с говорящими именами вроде BunnySad, PlateGoat и FrogStrap.
Загрузчик и демо на VGA
Писать так напрямую автор честно называет мучительным занятием без нормальных чисел, арифметики и переходов. Поэтому он собрал загрузчик: короткий декодер извлекает произвольные байты из «хвостов» эмодзи с помощью недокументированной особенности инструкции AAD, позволяющей задавать недесятичное основание. Эффективность упаковки — всего 25%, зато на выходе получилась полноценная VGA-демка размером 1092 байта, работающая в любом DOSBox.
На эмодзи автор не остановился: тот же трюк проделан с японской каной и корейским хангылем, тоже печатающими «Hello World». В финале он мечтательно спрашивает: а нельзя ли собрать из эмодзи целый BIOS, операционную систему или, чем чёрт не шутит, EmojiDOOM? Примеры «исполняемого Unicode» он обещает собирать в отдельном репозитории на GitHub.
Источник: Lobsters
Комментарии
Войдите, чтобы комментировать.