4 puan yazan GN⁺ 2026-01-13 | 1 yorum | WhatsApp'ta paylaş
  • 13KiB boyutunda tek bir dosya olarak Windows, Linux ve tarayıcıda çalışan bir Snake oyunu; üç platformu da tek bir kaynak üzerinden destekliyor
  • Yılanı kontrol edip yemi yiyerek duvarlara çarpmamaya dayanan klasik Snake kurallarını izliyor; puan, seviye ve labirent yapısı içeriyor
  • Her platform için C (WinAPI/X11) ve JavaScript (HTML5 Canvas) ile uygulanmış; her biri yaklaşık 3~5KiB düzeyine sıkıştırılıp birleştirilmiş
  • Windows tarafı alışılmadık bir PE başlığı ve apphelp mekanizmasını, Linux tarafı lzma sıkıştırma ve shell dropper'ı, tarayıcı tarafı ise HTML/CSS hilelerini kullanarak çalışıyor
  • Üç uygulamanın birleştirilmesiyle 13.312 baytlık tek bir çalıştırılabilir dosya ortaya çıkıyor ve çok platformlu çalıştırılabilir dosya yapılarının deneysel potansiyelini gösteriyor

Cosmopolitan libc'den esinlenen çok platformlu deneme

  • Cosmopolitan libc, C kaynak kodunu birden fazla işletim sisteminde çalışabilen tek bir ikiliye derleyebilen bir araç takımı
    • Windows, Linux, BSD gibi çeşitli işletim sistemlerinde yerel çalıştırmayı destekliyor
  • GUI desteğinin olmaması ve büyük ikili boyutu sınırlaması nedeniyle, yazar 16KiB'nin altında bir video oyunu yapma meydan okumasını seçmiş
    • Hedef, Windows, Linux ve tarayıcıda çalışan, tek kaynak tabanlı bir oyun geliştirmek

Oyun yapısı ve kuralları

  • Oyun, yön tuşları veya WASD ile kontrol edilen standart bir Snake oyunu
    • ESC ile çıkış, R ile sıfırlama, P ile duraklatma, boşluk tuşu ile başlatma
  • Her yem yendiğinde puan artıyor; normal yem 10 puan, sarı yem (%15 olasılık) ise 20 puan veriyor
    • Yemler belirli bir süreden sonra kayboluyor ve kaybolma süresi yılanın hızına (uzunluğuyla orantılı) göre belirleniyor
  • 10 yem yenince bir sonraki seviyeye geçiliyor ve duvar yerleşimi rastgele değişiyor
    • Labirent, yeme giden bir yol her zaman bulunacak şekilde oluşturuluyor
    • Yılanın başlangıç konumu da rastgele, ancak en az 5 karelik boş alan sağlayan bir yöne yerleştiriliyor
  • Tamamlanan oyun dosyasının boyutu 13.772 bayt

Üç platform için uygulama yöntemi

  • Windows sürümü, WinAPI tabanlı C koduyla yazılmış ve sıkıştırma betiği ile açıcı stub içeriyor
    • PE başlığındaki MZ imzasından sonra serbestçe kontrol edilebilen baytlar kullanılarak bir shell betiği gömülüyor
    • Bu sayede dosya hem bir Windows çalıştırılabilir dosyası hem de aynı anda geçerli bir Linux shell betiği oluyor
    • İlk çalıştırmada “The application was unable to start correctly (0xc0000005)” hatası görülebilir, ancak yeniden çalıştırıldığında normal biçimde çalışıyor
  • Linux sürümü, lzma sıkıştırması kullanıyor ve küçük bir shell dropper sıkıştırılmış ELF64 ikilisini çıkarıp çalıştırıyor
    • Dosyanın başındaki ve sonundaki bazı bölümleri atlayarak çalışacak şekilde yapılandırılmış
  • HTML sürümü, tarayıcının dosyanın gereksiz ön kısmını yok sayıp HTML'i işlemesi özelliğinden yararlanıyor
    • CSS ile gereksiz verilerin ekranda görünmemesi sağlanıyor

Tek dosyada birleştirme ve yapı

  • Üç platforma ait dosyalar belirli bir sırayla birleştirilerek (concatenate) her ortamın yalnızca kendisine uygun kısmı çalıştırması sağlanıyor
    • Windows PE bölümünü, Linux ELF bölümünü, tarayıcı ise HTML bölümünü tanıyor
  • Son dosya boyutu 13.312 bayt ve üç ortamda da çalışabilen bir polyglot ikili elde ediliyor
  • Dosyanın içinde Windows PE başlığı, Linux için LZMA sıkıştırılmış kod ve HTML/CSS/JavaScript kodu art arda yer alıyor
    • Örnek kod bloklarında MZ imzası, ks işaretçisi, <html> etiketi ve <script> bloğu gibi parçalar sırasıyla bulunuyor

Teknik önemi

  • Tek dosyayla Windows, Linux ve tarayıcıyı aynı anda destekleyen bir çalıştırma yapısı hayata geçiriliyor
  • PE, ELF ve HTML biçimlerinin iç içe kullanımı ile platforma göre yürütme yolu ayrıştırılıyor
  • 13KiB gibi son derece küçük bir boyutta sıkıştırma, biçim hack'leri ve çok platformlu çalıştırma bir araya getirilerek deneysel bir başarı elde ediliyor

1 yorum

 
GN⁺ 2026-01-13
Hacker News yorumları
  • Linux çalıştırılabilir dosyasını çıkardım ve readelf ile objdump'ın onu düzgün okuyamamasına şaşırdım
    İnceleyince, yer kazanmak için PT_DYNAMIC başlığının kullanılmayan alanlarına dinamik bağlayıcının adının zorla yerleştirildiğini gördüm

    1. Bunun elle mi yapıldığını, yoksa bunu bu şekilde yapan bir araç olup olmadığını merak ediyorum
    2. Bu tür anormal ikilileri analiz edebilen araçlar olup olmadığını da öğrenmek istiyorum
    • ndisasm ya da bir hex düzenleyiciyle okunabilir
      Ama böyle bir formatı bilerek bozmanın anlamsız bir tasarruf olduğunu düşünüyorum
      Antivirüs ya da DEP gibi güvenlik özellikleriyle çakışabilir, bu yüzden böyle çalıştırılabilir dosyalarla uğraşmak istemem
    • “choke”un ne anlama geldiğini anlamadım; benim ortamımda iki araç da normal çalıştı
  • Orijinal Zelda oyununun dosya boyutunun bu kadar küçük olmasına şaşırdım
    Bu kadar az kod ve veriyle ne kadar büyük bir duygu ve sürükleyicilik yaratabildiklerine hayran kaldım
    The Legend of Zelda (Wikipedia)

    • Gerçekten sihir gibi. Commodore 64'teki Eindeloos adlı oyun da 64KB içine devasa bir harita sığdırmıştı
      40 yıl sonra haritayı çıkardım ve sadece PNG olarak bile 800KB'ı aşıyor
      Oyun haritasını görüntüle
    • Zelda 1 128KB idi ve sıkıştırma da yoktu. Devam oyunu yaklaşık iki katıydı
    • Zindanlar ve mağaralar aslında tek bir dikdörtgen harita içinde yer alıyordu
      Tasarımcılar bunu alan kısıtları içinde bir bulmaca gibi kurgulamıştı
      Zelda harita yapısı için bkz.
  • Test sonuçlarım

    • Tarayıcı: uzantıyı .html yapınca çalışıyor
    • Linux: lzma komutu yok hatası verdi, xz paketini kurunca çalıştı
    • Windows: .com ya da .exe olarak çalıştırınca hata (0xc0000005) aldım, DEP ayarını kapatınca çalıştı
    • Windows 11'de de normal çalışıyor
    • Sadece chmod +x snake.com yapıp çalıştırınca Mono deniyor ve başarısız oluyor
      Bunun yerine bash snake.com ile çalıştırınca sorunsuz çalışıyor. Debian 13 üzerinde denedim
  • İlginç olan, bu dosyanın bir araya getirilmiş üç çalıştırılabilir dosya olması
    Bu yüzden her platformda tamamen farklı bir program da içerebilir

  • Bu bana 96KB'lık FPS oyunu kkrieger'i hatırlattı
    O dönem için grafik seviyesi şaşırtıcıydı
    kkrieger (arşiv)

    • İlgili tartışmalar: 2017, 2023, 2024
    • Hâlâ modern PC'lerde çalışıyor. İndirip bizzat denedim
    • Yakın zamanda Metroid Prime 4 oynarken, bu fikirle modern bir oyun yapılsa nasıl olur diye düşündüm
  • Mac'te tarayıcı dışında bunu çalıştırmanın bir yolu olup olmadığını merak ediyorum
    cannot execute binary file hatası alıyorum

  • Bu mekanizmanın geliştirilip gerçek bir evrensel çalıştırılabilir dosya (universal binary) yapılıp yapılamayacağını merak ediyorum
    Örneğin kodu Haxe ile yazıp C++'a derleyerek Win32 ve Linux sürümleri üretmek,
    JavaScript'e dönüştürüp HTML içinde de çalıştırılabilir hâle getirmek,
    sonra bu üç çıktıyı tek bir dosyada birleştirmek mümkün olabilir gibi görünüyor

  • Tek bir dosyayla her yerde çalışabilen tek dosyalı uygulama fikrini seviyorum
    Ben de sunucusuz bir platform geliştirirken bu yönde araştırma yapıyorum
    Veri odaklı uygulamaları tek bir .html dosyasıyla oluşturup web-components'ları uzaktan yükleyen bir yapı kuruyorum
    HTML'i doğrudan file:// protokolüyle açabilmek çok güçlü bir özellik ama sık sık göz ardı ediliyor

    • Asıl yazar bunu gerçekten üç kez uygulamış — WinAPI tabanlı C, X11 tabanlı C ve HTML5 Canvas tabanlı JS sürümü
      Yani sadece bir tarayıcı örneği açmamış, iki tam yerel uygulama da yapmış
    • Ne yazık ki HTTPS olmayan ortamlarda tarayıcı işlevlerinde çok fazla kısıtlama var
    • Tek HTML uygulaması geliştirme yaklaşımı hakkında daha fazla şey öğrenmek isterim. Açık örnekler var mı diye merak ediyorum
  • Polyglot dosyaların bu kadar geç ortaya çıkmış olması ilginç
    Teknik olarak bunun 10-20 yıl önce de mümkün olması gerekirdi gibi geliyor

    • İlk polyglot dosyanın ne zaman ortaya çıktığını merak ediyorum
      EICAR.COM hem metin hem çalıştırılabilir dosya olan erken bir örnek olarak aklıma geliyor
  • js13kGames gibi ultra küçük web oyunu yarışmalarını hatırlattı