Skip to content
research

絵文字に隠された秘密のコード

ある開発者が、多くの絵文字が有効なx86マシンコードになるというUnicodeの奇妙な特性を偶然発見しました。これにより、すべて絵文字と記号で書かれた完全に機能するDOSプログラムが作成されるに至りました。

Aki Tanaka
絵文字に隠された秘密のコード

🐐からマシンコードへ

開発者のGloriousCow氏は、Webベースのx86 disassemblerを構築中に驚くべき秘密を偶然発見しました。彼は奇妙な挙動に気づきました。ツールに絵文字を貼り付けると、それらがURLエンコードされて16進数のバイトシーケンスに変換されたのです。この一見些細な詳細が、後にデジタルエンコーディングの深遠な特性を解き明かすことになります。

転機は単純なヤギの絵文字から訪れました。GloriousCow氏が🐐を貼り付けると、システムはURLエンコードされた文字列%F0%9F%90%90を返しました。パーセント記号を取り除くと、生の16進シーケンスF0 9F 90 90が目に飛び込んできました。これは完全に有効な8088アセンブリ言語だったのです。

ヤギの絵文字は、偶然にも特定のCPU命令に逆アセンブルされました。F0は排他的なメモリアクセスを保証するLOCK prefixを表していました。9FはLAHF命令に変換され、EFLAGSレジスタの下位バイトをAHレジスタにロードします。2つの90バイトは古典的なNOP、つまり「何もしない」命令でした。

これは単なる偶然ではありませんでした。UTF-8における4バイトの絵文字書記素のほぼすべてが、F0 9Fというバイトプレフィックスで始まります。基本多言語面(Basic Multilingual Plane)以外の文字に使用されるこのUnicodeエンコーディングの基本的な側面が、意図せずして絵文字が実行可能なマシンコードとして機能するための土台を築いていたのです。

Unicodeの偶然

驚くべき偶然はUnicodeエンコーディングから始まります。🐐のようなほとんどの絵文字はBasic Multilingual Planeの外側に存在し、4バイトのUTF-8シーケンスを必要とします。重要なのは、UTF-8におけるほぼすべての絵文字書記素が、補助文字の標準的な設計選択であるF0 9Fバイトプレフィックスで始まるという点です。

8088プロセッサはF0バイトを命令修飾子であるLOCKプレフィックスとして解釈します。これらの古いx86アーキテクチャでは、このプレフィックスは多くの場合、無害に無視されるか、多くの命令に対してNOPとして機能します。これにより、後続の9Fバイトが実行され(多くの場合LAHF命令として)、残りの絵文字バイトが有効なオペコードやオペランドを形成し続けることが可能になります。

GloriousCow氏は、一部の絵文字シーケンスが不完全な命令を作成し、オペコードはあっても必要なデータが欠けていることを発見しました。この「open tail」メカニズムにより、後続の絵文字のバイトが、MOV命令の即値のような欠落したオペランドを補うことができます。絵文字を連鎖させることで、開発者は複雑で機能的なアセンブリコマンドを構築し、一見無害な記号を実行可能なコードに変えることができるのです。

「Emojissembly」ツールチェーンの構築

GloriousCow氏は発見からデモンストレーションへと素早く移行しました。彼は慎重に選んだ約30個の絵文字から、完全に機能する「Hello」プログラムを作成しました。生のUTF-8ファイルとして.com拡張子で保存されたこのユニークな実行ファイルは、DOS環境で完璧に動作し、画面に挨拶を表示しました。この最初の成功が、マシンコードとしての絵文字の奇妙な可能性を証明しました。

しかし、複雑なプログラムの構築には大きな技術的ハードルがありました。それは任意のデータをどのようにエンコードするかという点です。一部の絵文字は偶然にも有用なx86命令にマッピングされましたが、バイト値の大部分には直接対応する絵文字がありませんでした。つまり、テキスト文字列や数値定数のようなデータを直接表現することが、非常に困難な課題となったのです。

GloriousCowは、x86のAAD命令(「除算前のASCII調整」)を活用した独創的なソリューションを考案しました。本来はBCD演算に使用されるこの命令は、内部計算用のカスタム基数を指定できます。彼はAADを使用して、256個の厳選された絵文字の末尾バイトから任意のバイト値を再構築できる、小さく独立したデコーダーを構築しました。この画期的な手法により、完全なデータサポートを備えたプログラムの構築が可能になりました。

この記事が気に入ったら、毎朝同じようなものをメールで受け取れます。

1日1通 · 2クリックで解除 · サードパーティのトラッキングなし

なぜ「非実用的なエンジニアリング」が重要なのか

Better Stackの「So Emojis Are Apparently Executable Now(絵文字が実行可能になったらしい)」で詳しく紹介されたGloriousCowの偶然の発見は、素晴らしく無駄なエンジニアリングの好例です。このプロジェクトは、抽象的なバイトシーケンスを風変わりな実行可能シンボルへと変換することで、深いシステム知識を称賛しています。これは、Unicodeエンコーディングとx86命令セットの両方に対する深い理解が、確立されたアーキテクチャの中に驚くべき、ほとんど詩的とも言える能力を明らかにし、見慣れたものを幻想的なものに変えることができるという独創的な実証です。

この発見に対するコミュニティの反応は即座かつ熱狂的で、すぐに'emojissembly'という用語が作られました。これはレトロコンピューティングや低レイヤー開発のコミュニティ全体で活発な議論を巻き起こし、マシンコードとの対話方法に関する前提を覆しました。開発者たちはUTF-8のF0 9Fプレフィックスの意味について議論し、絵文字のエンコーディングとx86オペコードの偶然の一致に驚嘆し、数十年前の標準規格に潜む柔軟性を再認識しました。

重要なのは、こうしたプロジェクトが不可欠であるという点です。これらは実用的なアプリケーションだけに焦点を当てるのではなく、既存の技術で何が可能かという境界線を押し広げる遊び心のある探求を奨励します。GloriousCowの取り組みは、30個の絵文字で構成されたHelloプログラムを実行するDOS環境のような数十年前のシステムでさえ、好奇心旺盛な人々が発見するのを待っている楽しく予期せぬ秘密を保持していることを明らかにしました。この遊び心あふれる創意工夫は、革新が最も予期せぬ、一見非実用的な試みから花開くことを証明し、次世代に深い探求を促しています。

よくある質問

すべての絵文字を実行可能なコードとして使用できますか?

いいえ、すべてではありません。この現象は主に4バイトのUTF-8絵文字に適用されます。その多くは、8088プロセッサが有効な命令として解釈できる特定のバイトプレフィックス(F0 9F)で始まります。

絵文字が実行可能であることを発見したのは誰ですか?

GloriousCow(Daniel Balsom)という開発者が、Webベースの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