1P by GN⁺ | ★ favorite | 댓글 1개
  • 1989년 게임 F-15 Strike Eagle II의 원본 바이너리를 리버스 엔지니어링해 C 소스 코드를 재구성하는 프로젝트가 실제 플레이 테스트 단계에 들어감
  • egame, end를 포함한 모든 실행 파일의 코드와 데이터를 C로 옮겼고, 대부분의 어셈블리 전용 코드에는 C 대체 구현이 마련됨
  • 최신 릴리스 v0.9.1은 원본 게임 451.03 버전과 Desert Storm 확장팩에서 원본 실행 파일을 교체해 테스트할 수 있음
  • 새 실행 파일은 설정 화면을 거치지 않고 MCGA/VGA, 무음, 조이스틱 없음 상태를 가정하지만 미션 브리핑·비행·디브리핑은 작동해야 함
  • 목표가 원본과 같은 버그까지 보존하는 bug-for-bug 재구성이므로, 원본에도 있는 동작은 현재 버그 리포트 대상에서 제외됨

C 재구성 프로젝트의 진행 상황

  • F-15 Strike Eagle II 재구성은 원본 바이너리를 리버스 엔지니어링해 1989년 게임의 C 소스 코드를 다시 만드는 취미 프로젝트임
  • 한 달 조금 전만 해도 두 번째 실행 파일 egame을 C로 옮기는 데 몇 년이 더 걸릴 것처럼 보였고, 세 번째 실행 파일 end도 남아 있었음
  • 현재는 다음 단계까지 진행됨
    • 모든 실행 파일의 C 코드 재구성 완료
    • 모든 데이터를 어셈블리에서 C로 이동
    • 대부분의 어셈블리 전용 코드에 기능적으로 동등한 C 대체 구현 작성
    • 대부분의 루틴과 데이터 구조에 의미 있는 이름 부여
    • 가까운 시일 내 포팅 프로젝트용 저장소 분기 검토
  • 재구성된 opcode가 원본에 충실한지는 도구로 확인하지만, 데이터 레이아웃 관련 버그까지 모두 잡지는 못함
  • 이제 opcode 일치 확인을 넘어 실제로 실행되는 게임을 유지해야 하므로 외부 테스트가 필요해짐

테스트 방법과 보고할 문제

  • 테스트 대상은 최신 릴리스 v0.9.1
  • 원본 게임 451.03 버전과 Desert Storm 확장팩이 있는 게임 폴더에 새 실행 파일을 넣어 원본 실행 파일을 교체하면 됨
    • 교체 전 백업이 필요함
    • f15.exe 대신 원본 f15.com이 실행되지 않도록 원본 f15.com을 제거해야 할 수 있음
  • 새 실행 파일은 설정 화면으로 들어가지 않음
    • MCGA/VGA 디스플레이를 가정함
    • 사운드 없음
    • 조이스틱 없음
  • 테스트 중 문제가 있으면 GitHub 이슈로 보고할 수 있음
    • 충돌
    • 그래픽 글리치
    • 키 입력 미작동
    • 필요한 경우 dosbox에서 Ctrl+F5로 찍은 스크린샷 첨부
    • 문제가 발생하기 전 어떤 행동을 했는지 적으면 재현과 수정에 도움이 됨
  • 이 프로젝트는 bug-for-bug 재구성을 목표로 하므로 원본 게임에도 있는 동작은 유지해야 함
    • 원본에는 3D 오브젝트가 사라지는 문제, 뒤집힌 상태에서 연료가 없을 때 비행기가 하늘 쪽으로 떨어지는 문제 등이 있음
    • 보고 전 원본에서도 같은 문제가 발생하는지 확인하는 편이 좋음

댓글과 토론

Hacker News 의견들
  • 플레이 가능한 DOS 버전이 있음
    첫 단계는 전체를 어셈블러로 역공학하는 것이었고, 두 번째 단계는 어셈블러를 컴파일된 C 코드와 바이너리 동일하게 바꾸는 것임. 이 작업은 어셈블러 코드가 남지 않을 때까지 DOS 위에서 계속하고, 그다음 Linux와 Windows 포팅을 시작할 예정
    역공학은 새 버그를 끌어들이기 쉽고, 이렇게 오래된 역공학 코드에서 모든 버그를 찾기는 쉽지 않지만 지금까지는 모두 동작하는 듯함
    F-15 451.03 버전이 있고 Dosbox나 실제 DOS가 있다면 열린 버그를 찾아봐 달라
    최신 DOS 릴리스는 여기서 받을 수 있음: https://github.com/neuviemeporte/f15se2-re/releases
    f15_se2-*.zip 파일에는 DOS 게임용 대체 실행 파일이 들어 있음
    Air Force needs YOU!

    • USAF 참전 군인임. F-15 Strike Eagle II를 하며 자랐고, 안타깝게도 내 복사본은 오래전에 망가졌음. 이 프로젝트를 보니 정말 기쁨
      다만 다른 군종들이 내가 의자를 얼마나 사랑하는지 들고나오게 만들 아주 작고 개인적인 꼬투리가 하나 있음
      Air Force는 두 단어임
    • 잘 만들었음
      Linux 포트에 너무 부담을 가질 필요는 없을 듯함. 에뮬레이터 지원이 워낙 좋고 널리 쓰이니, 거기서 돌아간다면 충분히 성공으로 봐도 됨
      나는 쓰기 편해서 Lutris(https://lutris.net/)를 사용함
      다만 저수준을 좋아하는 사람으로 보여서, 멋진 레트로 게임을 하는 것보다 이 자체가 하나의 퀘스트일 수도 있겠음
    • 나도 지금 게임 몇 개를 역공학하고 있음. 요즘은 AI 덕분에 꽤 쉬워졌음
      다만 이게 전반적으로 법적으로 괜찮은지 걱정됨. 이에 대한 생각이 궁금함
  • 초보 질문임. 부정적으로 들리지 않았으면 좋겠음
    오래된 게임이 동작하게 시간을 들이는 건 정말 좋지만, DOSbox 같은 걸로 에뮬레이션 가능한 게임을 왜 디컴파일하는지 궁금함. 이렇게 오래된 게임이면 아주 낮은 사양 하드웨어에서도 충분히 잘 돌아가지 않나?

    • 핵심은 게임을 실행하는 게 아니라 수정 가능하게 여는 것임. 바이너리 형태의 게임을 패치하는 건 터무니없이 어렵고, 단순 버그 수정 이상의 작업은 거의 불가능에 가까움
      소스 코드가 있으면 기능 전체를 추가하거나, Windows 10으로 포팅하거나, 4K HDR, 텍스처, 새 모델, 새 임무까지 구현할 수 있음. 한계가 사실상 없어짐
      또 하드코딩된 데이터 오프셋이 들어간 어셈블리 명령어만 보고 게임을 분석하기는 정말 어려움. C 코드라면 동작을 직접 읽거나, 계측·디버깅 코드를 넣어서 파악할 수 있음
    • 몇 년 전 DOS 시대 게임의 역공학을 시도했을 때는 이유가 여럿 있었음
      파일 형식을 문서화하고, 데이터를 뒤져 미사용 미디어를 찾고, 심한 버그를 식별해서 고치고, 모딩 도구를 만들고, 어린 시절 기억에 남은 무언가가 어떤 기법으로 만들어졌는지 이해하고 싶었음
      현대 시스템에서 실행하는 마찰을 줄이고, 더 높은 해상도나 텍스처 교체 같은 선택적 개선도 가능하게 만들고 싶었음
      결국 끝낼 만큼의 인내심은 없었지만, 지금이라면 가능할 수도 있겠다는 생각이 듦
    • 플로피 기반 게임 다수는 당시 디스크 드라이브의 문서화되지 않은 동작을 이용한 디스크 복사 방지 패턴을 갖고 있음. 그래서 Greaseweazle 같은 도구가 아카이브된 플로피의 전체 자기 플럭스 맵을 구성하는 데 필요할 정도임
      또 이런 게임들은 다양한 그래픽·사운드 하드웨어에서 돌아가도록 만들어지는 경우가 많아서, 사실상 드라이버가 게임 안에 컴파일되어 있음
      [0] https://github.com/keirf/greaseweazle
  • 어릴 때 정말 많이 했던 게임. F-19 Stealth Fighter, F-117A Nighthawk Stealth Fighter도 같이 했고, 이 둘이 이 게임 전후로 나온 작품이었다는 건 오늘 처음 알았음. F-14 Tomcat도 조금 했음
    제대로 읽었다면 이건 실행하려면 원본 게임 파일이 필요한 듯함. 그래서 이 비행기를 다시 몰기보다는 개발 일지를 읽는 쪽이 될 것 같음

    • F-19는 훌륭한 게임이고, 내가 가장 좋아하는 Sid Meier 타이틀 중 하나임
      1980년대 후반 Electronics Boutique에서 사서 집의 Packard Bell 286으로 플레이했던 기억이 남. 복사 방지는 매뉴얼에서 항공기를 찾아 식별해야 하는 방식이었고, 그 결과 게임에 나오는 항공기 전체를 외워버렸음
      게임하려고 Gravis Analog 조이스틱도 샀고, 키보드 오버레이는 아직도 갖고 있음
      이 게임의 현대적 리부트를 정말 보고 싶음
    • 이게 친구와 앞좌석/뒷좌석 역할로 협동 플레이할 수 있던 그 게임이었나, 아니면 III였나?
      친구에게 유선전화로 한참 전화해서 모뎀 설정을 맞추고, 다시 전화를 걸게 한 뒤 게임을 시작하고, 또 끊기고, 이번엔 무슨 일이었는지 보려고 다시 전화하고를 반복했음
      마침내 동작했을 때는 너무 끊임없이 플레이해서, 친구 어머니가 몇 시간씩 유일한 전화선을 점유한다고 모뎀 플레이를 금지했음
      다른 비행 시뮬레이터나 우주 시뮬레이터에서도 비슷한 멀티플레이를 찾고 싶고, 이 게임도 다시 돌아가게 해서 친구를 추억으로 낚아보고 싶음
    • 개발 블로그는 레트로 역공학 일지 중에서도 손꼽히게 좋음. 즐겁게 읽을 수 있을 것임
    • 이런 이름들은 상표 등록되어 있지 않나? Lockheed가 부수입으로 권리를 팔 수도 있을 것 같음
  • 요즘 게임 포팅은 말도 안 되게 쉬워졌음
    https://robin.tooclever.orgAPI 시간 기준 하루도 안 걸렸음

    • 멋지다. 이렇게 포팅된 게임이나 오픈소스 포트의 색인이 따로 있나?
  • 심볼 이름이 없는 상태에서 디컴파일된 프로젝트의 구조를 추론하는 데 AI가 잘 맞는지 궁금함
    내 분야는 아니지만, 소스 맵이 없는 JavaScript 구조의 의도를 AI가 꽤 잘 파악하는 걸 보고 놀랐음

    • AI는 어셈블리를 읽고 이해하는 데 초인적임. 디컴파일되어 있든 심볼이 있든 크게 신경 쓰지 않고, 없으면 조금 느려질 뿐임
      어떤 경우에는 도구 없이도 심하게 난독화된 제어 흐름을 직접 이해할 수 있음
    • 맞음, 아주 도움이 됨
  • 이 이야기가 이제 YouTube에 올라왔음: https://youtu.be/aIPKkOpIiF8

    • 영상은 멋진데, AI 내레이션이 거슬림
  • F15를 몰았던 친구가 있어서 이걸 보내줬음

  • 이런 오래된 게임 커뮤니티들은 좋아하는 타이틀에 네 가지 자유를 확보하는 데 놀라운 일을 해내고, 정말 영감을 줌

  • 이건 해본 적 없지만 Jane's F/A-18은 해봤고, 훌륭한 게임이었음

    • 그리고 Jane's USAF도 있었지!
  • 비행 중 도플러 지도를 쌓아서 SLAM 발사에 쓰느라 많은 시간을 쏟았음
    Digital Integrations의 Tornado와 함께 훌륭한 시뮬레이터였고, Tornado는 정말 리부트가 필요함