- 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
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
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 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)
Setelah 40 tahun, petanya diekstrak, dan PNG-nya saja lebih dari 800KB
Lihat peta game
Para desainer menyusunnya seperti teka-teki di bawah batasan ruang
Referensi struktur peta Zelda
Hasil pengujian saya
.htmllzmatidak ada, lalu setelah memasang paketxzmenjadi berjalan.comatau.exemuncul error (0xc0000005), tetapi setelah menonaktifkan pengaturan DEP jadi berjalanchmod +x snake.comlalu dijalankan, Mono akan mencoba menanganinya dan gagalSebagai gantinya, jalankan dengan
bash snake.comdan itu bekerja dengan baik. Ini pada Debian 13Yang 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)
Saya penasaran apakah ada cara menjalankannya di Mac selain lewat browser
Muncul error
cannot execute binary fileSaya 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 jauhKemampuan membuka HTML langsung lewat protokol
file://itu sangat kuat, tetapi sering diabaikanArtinya, ini bukan sekadar membuka instance browser, tetapi benar-benar dua aplikasi native penuh
Menarik bahwa file polyglot seperti ini baru muncul terlambat
Secara teknis rasanya ini sudah mungkin dilakukan 10–20 tahun lalu
EICAR.COM terlintas sebagai contoh awal yang merangkap teks dan executable
Ini mengingatkan saya pada kompetisi game web super kecil seperti js13kGames