4 Punkte von GN⁺ 2026-01-13 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Ein Snake-Spiel, das als einzelne 13-KiB-Datei unter Windows, Linux und im Browser läuft und alle drei Plattformen mit einer einzigen Codebasis unterstützt
  • Es folgt den klassischen Snake-Regeln: Die Schlange wird gesteuert, frisst Futter und darf nicht gegen Wände stoßen; enthalten sind Punktestand, Level und Labyrinth-Strukturen
  • Die Implementierungen für die einzelnen Plattformen wurden in C (WinAPI/X11) bzw. JavaScript (HTML5 Canvas) erstellt und jeweils auf etwa 3–5 KiB komprimiert und zusammengeführt
  • Unter Windows kommen ein ungewöhnlicher PE-Header und der apphelp-Mechanismus zum Einsatz, unter Linux lzma-Komprimierung und ein Shell-Dropper, im Browser HTML/CSS-Tricks
  • Durch die Kombination der drei Implementierungen entstand eine einzelne ausführbare Datei mit 13.312 Byte, die die experimentellen Möglichkeiten einer Multiplattform-Executable-Struktur zeigt

Ein von Cosmopolitan libc inspirierter Multiplattform-Versuch

  • Cosmopolitan libc ist ein Toolkit, mit dem sich C-Quellcode zu einem einzelnen Binärprogramm kompilieren lässt, das auf mehreren Betriebssystemen ausgeführt werden kann
    • Unterstützt native Ausführung auf verschiedenen OS wie Windows, Linux und BSD
  • Wegen fehlender GUI-Unterstützung und der Begrenzung durch große Binärdateien entschied sich der Autor für die Herausforderung, selbst ein Videospiel mit weniger als 16 KiB zu bauen
    • Das Ziel war ein Spiel auf Basis einer einzigen Codequelle, das unter Windows, Linux und im Browser läuft

Spielaufbau und Regeln

  • Das Spiel ist ein standardmäßiges Snake-Spiel, gesteuert mit den Pfeiltasten oder WASD
    • ESC zum Beenden, R zum Zurücksetzen, P zum Pausieren, Leertaste zum Starten
  • Mit jedem gefressenen Futter steigt der Punktestand; normales Futter bringt 10 Punkte, gelbes Futter (15 % Wahrscheinlichkeit) 20 Punkte
    • Futter verschwindet nach einer bestimmten Zeit, die von der Geschwindigkeit der Schlange abhängt (proportional zu ihrer Länge)
  • Nach 10 gefressenen Futterstücken geht es ins nächste Level, wobei die Wandanordnung zufällig verändert wird
    • Das Labyrinth wird so erzeugt, dass immer ein Pfad zum Futter existiert
    • Auch die Startposition der Schlange ist zufällig, wird aber in eine Richtung mit mindestens 5 freien Feldern gesetzt
  • Die fertige Spieldatei hat eine Größe von 13.772 Byte

Implementierung auf den drei Plattformen

  • Die Windows-Version wurde als C-Code auf Basis der WinAPI geschrieben und enthält ein Kompressionsskript sowie einen Dekompressor-Stub
    • Die frei kontrollierbaren Bytes nach der MZ-Signatur im PE-Header werden genutzt, um ein Shell-Skript einzubetten
    • Dadurch ist die Datei zugleich eine Windows-Executable und ein gültiges Linux-Shell-Skript
    • Beim ersten Start kann der Fehler „The application was unable to start correctly (0xc0000005)“ auftreten, beim erneuten Start funktioniert sie jedoch normal
  • Die Linux-Version verwendet lzma-Komprimierung, und ein kleiner Shell-Dropper extrahiert und startet das komprimierte ELF64-Binärprogramm
    • Sie ist so aufgebaut, dass beim Ausführen bestimmte Teile am Anfang und Ende der Datei übersprungen werden
  • Die HTML-Version nutzt aus, dass Browser unnötige Daten am Anfang der Datei ignorieren und anschließend das HTML verarbeiten
    • Über CSS wird sichergestellt, dass unnötige Daten nicht auf dem Bildschirm erscheinen

Zusammenführung und Aufbau der Einzeldatei

  • Die Dateien für die drei Plattformen werden in einer bestimmten Reihenfolge aneinandergehängt (concatenate), sodass jede Umgebung nur den für sie passenden Teil ausführt
    • Windows erkennt den PE-Abschnitt, Linux den ELF-Abschnitt, der Browser den HTML-Abschnitt
  • Die endgültige Datei ist 13.312 Byte groß und bildet damit ein Polyglot-Binärprogramm, das in allen drei Umgebungen lauffähig ist
  • Im Inneren der Datei sind ein Windows-PE-Header, für Linux LZMA-komprimierter Code sowie HTML/CSS/JavaScript-Code nacheinander enthalten
    • Im Beispiel-Codeblock erscheinen der MZ-Header, der ks-Marker, das <html>-Tag und der <script>-Block in dieser Reihenfolge

Technische Bedeutung

  • Implementiert eine Ausführungsstruktur, die mit einer einzigen Datei Windows, Linux und Browser zugleich unterstützt
  • Nutzt die verschachtelte Verwendung der Formate PE, ELF und HTML, um plattformspezifische Ausführungspfade zu verzweigen
  • Eine experimentelle Leistung, die auf extrem kleinen 13 KiB Komprimierung, Format-Hacking und Multiplattform-Ausführung kombiniert

Noch keine Kommentare.

Noch keine Kommentare.