이 게임은 Windows, Linux, 브라우저에서 실행되는 단일 13KiB 파일임

4 weeks ago 11

  • 13KiB 크기의 단일 파일로 Windows, Linux, 브라우저에서 모두 실행되는 Snake 게임으로, 세 플랫폼을 하나의 소스에서 지원
  • 뱀을 조작해 먹이를 먹고 벽에 부딪히지 않도록 하는 고전적인 Snake 규칙을 따르며, 점수·레벨·미로 구조가 포함됨
  • 각 플랫폼별로 C(WinAPI/X11)JavaScript(HTML5 Canvas) 로 구현되었으며, 각각 3~5KiB 수준으로 압축·병합됨
  • Windows는 비정상적인 PE 헤더와 apphelp 메커니즘, Linux는 lzma 압축 및 셸 드로퍼, 브라우저는 HTML/CSS 트릭을 이용해 실행
  • 세 구현을 결합한 결과 13,312바이트의 단일 실행 파일이 완성되어, 멀티플랫폼 실행 파일 구조의 실험적 가능성을 보여줌

Cosmopolitan libc에서 착안한 멀티플랫폼 시도

  • Cosmopolitan libc는 C 소스 코드를 여러 운영체제에서 실행 가능한 단일 바이너리로 컴파일할 수 있는 툴킷
    • Windows, Linux, BSD 등 다양한 OS에서 네이티브 실행 지원
  • GUI 미지원과 큰 바이너리 크기 한계로 인해, 저자는 16KiB 이하의 비디오 게임을 직접 제작하는 도전을 선택
    • 목표는 Windows, Linux, 브라우저에서 모두 실행되는 단일 소스 기반 게임 제작

게임 구조와 규칙

  • 게임은 표준 Snake 게임으로, 방향키 또는 WASD로 조작
    • ESC로 종료, R로 리셋, P로 일시정지, 스페이스바로 시작
  • 먹이를 먹을 때마다 점수가 증가하며, 일반 먹이는 10점, 노란색 먹이(15% 확률) 는 20점
    • 먹이는 일정 시간 후 사라지며, 사라지는 시간은 뱀의 속도(길이에 비례)에 따라 결정
  • 10개의 먹이를 먹으면 다음 레벨로 이동, 벽 배치가 무작위로 변경
    • 항상 먹이까지의 경로가 존재하도록 미로 생성
    • 뱀의 초기 위치도 무작위지만, 최소 5칸의 여유 공간이 확보된 방향으로 배치
  • 완성된 게임 파일 크기는 13,772바이트

세 플랫폼별 구현 방식

  • Windows 버전은 WinAPI 기반 C 코드로 작성되어, 압축 스크립트와 디컴프레서 스텁을 포함
    • PE 헤더의 MZ 시그니처 이후 자유롭게 제어 가능한 바이트를 활용해 셸 스크립트를 삽입
    • 이로 인해 파일이 Windows 실행 파일이면서 동시에 Linux 셸 스크립트로도 유효
    • 첫 실행 시 “The application was unable to start correctly (0xc0000005)” 오류가 발생할 수 있으나, 재실행 시 정상 동작
  • Linux 버전은 lzma 압축을 사용하고, 작은 셸 드로퍼가 압축된 ELF64 바이너리를 추출·실행
    • 파일의 앞뒤 일부를 건너뛰며 실행되도록 구성
  • HTML 버전은 브라우저가 파일의 불필요한 앞부분을 무시하고 HTML을 처리하는 특성을 이용
    • CSS를 통해 불필요한 데이터가 화면에 보이지 않도록 처리

단일 파일 결합 및 구조

  • 세 플랫폼용 파일을 특정 순서로 연결(concatenate) 하여, 각 환경이 자신에게 맞는 부분만 실행하도록 구성
    • Windows는 PE 섹션, Linux는 ELF 섹션, 브라우저는 HTML 섹션을 인식
  • 최종 파일 크기는 13,312바이트로, 세 환경에서 모두 실행 가능한 폴리글롯 바이너리 완성
  • 파일 내부에는 Windows PE 헤더, Linux용 LZMA 압축 코드, HTML/CSS/JavaScript 코드가 순차적으로 포함됨
    • 예시 코드 블록에는 MZ 시그니처, ks 마커, <html> 태그, <script> 블록 등이 순서대로 존재

기술적 의의

  • 단일 파일로 Windows, Linux, 브라우저를 모두 지원하는 실행 구조를 구현
  • PE, ELF, HTML 포맷의 중첩 활용을 통해 플랫폼별 실행 경로를 분기
  • 13KiB라는 극도로 작은 크기에서 압축, 포맷 해킹, 멀티플랫폼 실행을 결합한 실험적 성취

Read Entire Article