4 poin oleh GN⁺ 2026-01-13 | 1 komentar | Bagikan ke WhatsApp
  • Sebuah game Snake yang berjalan di Windows, Linux, dan browser dalam satu file berukuran 13KiB, dengan dukungan untuk ketiga platform dari satu source
  • Mengikuti aturan Snake klasik: mengendalikan ular untuk memakan makanan sambil menghindari tabrakan dengan dinding, serta mencakup skor, level, dan struktur labirin
  • Diimplementasikan per platform dengan C (WinAPI/X11) dan JavaScript (HTML5 Canvas), lalu masing-masing dikompresi dan digabung hingga berukuran sekitar 3~5KiB
  • Windows berjalan dengan memanfaatkan header PE yang tidak lazim dan mekanisme apphelp, Linux menggunakan kompresi lzma dan shell dropper, sedangkan browser memakai trik HTML/CSS
  • Hasil penggabungan tiga implementasi tersebut adalah sebuah file eksekusi tunggal berukuran 13.312 byte, yang menunjukkan kemungkinan eksperimental struktur executable multiplatform

Upaya multiplatform yang terinspirasi dari Cosmopolitan libc

  • Cosmopolitan libc adalah toolkit yang dapat mengompilasi source code C menjadi satu binary yang bisa dijalankan di berbagai sistem operasi
    • Mendukung eksekusi native di beragam OS seperti Windows, Linux, BSD, dan lainnya
  • Karena tidak mendukung GUI dan memiliki keterbatasan ukuran binary yang besar, penulis memilih tantangan membuat video game di bawah 16KiB sendiri
    • Tujuannya adalah membuat game berbasis satu source yang dapat berjalan di Windows, Linux, dan browser

Struktur dan aturan game

  • Game ini adalah Snake standar, dikendalikan dengan tombol arah atau WASD
    • ESC untuk keluar, R untuk reset, P untuk pause, dan spasi untuk mulai
  • Setiap kali memakan makanan, skor bertambah: makanan biasa bernilai 10 poin, sedangkan makanan kuning (peluang 15%) bernilai 20 poin
    • Makanan akan hilang setelah waktu tertentu, dan waktu hilangnya ditentukan oleh kecepatan ular (sebanding dengan panjangnya)
  • Setelah memakan 10 makanan, pemain naik ke level berikutnya, dengan susunan dinding yang diacak ulang
    • Labirin dibuat agar selalu ada jalur menuju makanan
    • Posisi awal ular juga acak, tetapi ditempatkan ke arah yang memiliki setidaknya 5 petak ruang kosong
  • Ukuran file game yang sudah selesai adalah 13.772 byte

Cara implementasi di tiga platform

  • Versi Windows ditulis dalam kode C berbasis WinAPI, dan menyertakan skrip kompresi serta stub dekompresor
    • Memanfaatkan byte yang bisa dikendalikan secara bebas setelah signature MZ pada header PE untuk menyisipkan shell script
    • Karena itu, file tersebut sekaligus valid sebagai executable Windows dan shell script Linux
    • Pada eksekusi pertama, bisa muncul error “The application was unable to start correctly (0xc0000005)”, tetapi saat dijalankan ulang akan berfungsi normal
  • Versi Linux menggunakan kompresi lzma, dan shell dropper kecil mengekstrak lalu menjalankan binary ELF64 yang telah dikompresi
    • Dirancang agar berjalan sambil melewati sebagian data di bagian awal dan akhir file
  • Versi HTML memanfaatkan sifat browser yang mengabaikan bagian awal file yang tidak diperlukan lalu memproses HTML
    • CSS digunakan agar data yang tidak perlu tidak terlihat di layar

Penggabungan dan struktur file tunggal

  • File untuk tiga platform digabungkan (concatenate) dalam urutan tertentu, sehingga tiap lingkungan hanya menjalankan bagian yang sesuai untuknya
    • Windows mengenali section PE, Linux mengenali section ELF, dan browser mengenali section HTML
  • Ukuran file akhir adalah 13.312 byte, menghasilkan binary polyglot yang bisa berjalan di ketiga lingkungan
  • Di dalam file tersebut, header PE Windows, kode terkompresi LZMA untuk Linux, dan kode HTML/CSS/JavaScript disusun berurutan
    • Pada contoh code block terdapat signature MZ, marker ks, tag <html>, dan block <script> secara berurutan

Makna teknis

  • Mewujudkan struktur eksekusi satu file yang mendukung Windows, Linux, dan browser sekaligus
  • Memecah jalur eksekusi per platform melalui pemanfaatan bertumpuk format PE, ELF, dan HTML
  • Menjadi pencapaian eksperimental yang menggabungkan kompresi, format hacking, dan eksekusi multiplatform dalam ukuran sangat kecil, yakni 13KiB

1 komentar

 
GN⁺ 2026-01-13
Komentar Hacker News
  • Saya mengekstrak executable Linux-nya, dan kaget karena readelf dan objdump tidak bisa membacanya dengan benar
    Setelah ditelusuri, ternyata nama dynamic linker dipaksakan masuk ke field yang tidak digunakan pada header PT_DYNAMIC untuk menghemat ruang

    1. Saya penasaran apakah ini dibuat manual, atau ada tool yang menangani hal seperti ini
    2. Saya juga ingin tahu apakah ada tool yang bisa menganalisis biner tidak normal seperti ini
    • Bisa dibaca dengan ndisasm atau hex editor
      Tapi menurut saya sengaja merusak format seperti ini adalah penghematan yang tidak berarti
      Ini juga bisa berbenturan dengan fitur keamanan seperti antivirus atau DEP, jadi saya tidak ingin menyentuh executable seperti ini
    • Saya tidak tahu arti “choke”, di lingkungan saya kedua tool itu sama-sama berjalan normal
  • Saya terkejut ukuran file game Zelda asli sangat kecil
    Sungguh menakjubkan betapa sedikit kode dan data bisa menghasilkan kesan emosional dan imersi sebesar itu
    The Legend of Zelda (Wikipedia)

    • Benar-benar seperti sihir. Game Eindeloos di Commodore 64 juga memuat peta besar dalam 64KB
      Setelah 40 tahun, petanya diekstrak, dan PNG-nya saja lebih dari 800KB
      Lihat peta game
    • Zelda 1 berukuran 128KB, dan tidak dikompresi. Sekuelnya kira-kira dua kali lipat
    • Dungeon dan gua sebenarnya semuanya berada dalam satu peta persegi panjang
      Para desainer menyusunnya seperti teka-teki di bawah batasan ruang
      Referensi struktur peta Zelda
  • Hasil pengujian saya

    • Browser: berjalan jika ekstensinya diubah menjadi .html
    • Linux: muncul error bahwa perintah lzma tidak ada, lalu setelah memasang paket xz menjadi berjalan
    • Windows: saat dijalankan sebagai .com atau .exe muncul error (0xc0000005), tetapi setelah menonaktifkan pengaturan DEP jadi berjalan
    • Juga berjalan normal di Windows 11
    • Jika hanya chmod +x snake.com lalu dijalankan, Mono akan mencoba menanganinya dan gagal
      Sebagai gantinya, jalankan dengan bash snake.com dan itu bekerja dengan baik. Ini pada Debian 13
  • Yang menarik, file ini sebenarnya gabungan tiga executable menjadi satu
    Jadi secara teori bisa saja memuat program yang benar-benar berbeda untuk tiap platform

  • Ini mengingatkan saya pada game FPS 96KB bernama kkrieger
    Kualitas grafisnya saat itu sungguh mengejutkan
    kkrieger (arsip)

    • Diskusi terkait: 2017, 2023, 2024
    • Sampai sekarang masih bisa dijalankan di PC modern. Saya mengunduh dan mencobanya sendiri
    • Saat baru-baru ini memainkan Metroid Prime 4, saya sempat berpikir bagaimana jika ide seperti ini dipakai untuk membuat game modern
  • Saya penasaran apakah ada cara menjalankannya di Mac selain lewat browser
    Muncul error cannot execute binary file

  • Saya penasaran apakah mekanisme seperti ini bisa dikembangkan menjadi universal binary sungguhan
    Misalnya menulis kode dengan Haxe lalu mengompilasinya ke C++ untuk membuat versi Win32 dan Linux,
    lalu mengubahnya ke JavaScript agar bisa berjalan juga di HTML,
    kemudian menggabungkan ketiga hasilnya menjadi satu file

  • Saya suka konsep aplikasi executable tunggal yang bisa dijalankan di mana saja dari satu file
    Saya juga sedang meneliti arah seperti ini sambil membuat platform serverless
    Idenya adalah membuat aplikasi berbasis data hanya dengan satu file .html, lalu memuat web-components dari jarak jauh
    Kemampuan membuka HTML langsung lewat protokol file:// itu sangat kuat, tetapi sering diabaikan

    • Penulis aslinya memang benar-benar mengimplementasikannya tiga kali — versi C berbasis WinAPI, versi C berbasis X11, dan versi JS berbasis HTML5 Canvas
      Artinya, ini bukan sekadar membuka instance browser, tetapi benar-benar dua aplikasi native penuh
    • Sayangnya, di lingkungan non-HTTPS ada banyak pembatasan fitur browser
    • Saya ingin tahu lebih banyak tentang cara mengembangkan aplikasi HTML tunggal seperti ini. Mungkin ada contoh terbuka?
  • Menarik bahwa file polyglot seperti ini baru muncul terlambat
    Secara teknis rasanya ini sudah mungkin dilakukan 10–20 tahun lalu

    • Saya penasaran kapan file polyglot pertama muncul
      EICAR.COM terlintas sebagai contoh awal yang merangkap teks dan executable
  • Ini mengingatkan saya pada kompetisi game web super kecil seperti js13kGames