TL;DR

  • DOS에서 SimCity 2000 저장 파일을 헥스 편집해 게임 머니를 늘리며, 디스크에 저장된 바이트와 16진수를 익힌 경험임.
  • Packard Bell 386 SX에서 여러 게임과 교육용 소프트웨어를 사용했고, 플로피 디스크로 소프트웨어를 직접 소유하던 시절의 기억임.
  • 저장 파일에서 게임 머니 값을 찾아 바꾸는 과정에 헥스 에디터를 사용했고, 값을 단계적으로 키워 약 1,600만 달러까지 늘림.
  • 당시 이해한 저장 방식은 정확하지 않았으며, 실제로는 머니가 부호 있는 32비트 값으로 저장되고 데이터는 런 렝스 인코딩(RLE) 됨.
  • 게임 치트를 통해 바이트와 16진수, 디스크 파일과 메모리의 수정 가능성을 익혔고, 이후 직접 게임을 만들고 싶다는 생각으로 이어짐.

컴퓨터와의 개인사

  • Commodore 64 다음으로 컴퓨터를 경험하면서 디스크에 저장된 바이트와 16진수를 알게 된 이야기를 기록함. 대단하거나 중요한 일화는 아니지만, 기억에 선명하게 남은 여정의 한 부분임.

Packard Bell 데스크톱

  • 가족이 베이지색 Packard Bell 386 SX 데스크톱과 CRT 모니터를 보유했고, MS-DOS를 실행했음. 기억 속 버전은 5와 6으로 시작함.
  • 어린 시절에는 컴퓨터를 주로 게임 기기로 여겼고, Carmen Sandiego, Operation Neptune, Oregon Trail, Scorched Earth, SimCity 2000 등을 플레이함.
  • 교육용 소프트웨어인 Dinosaur Adventure와 Orbits도 사용함. Dinosaur Adventure에는 좋은 음악이 있었고, Orbits는 행성 표면의 중력이 물체에 미치는 영향을 시각적으로 보여줌.
  • 각 행성의 중력 조건에서 알을 동시에 떨어뜨려 어느 알이 가장 빨리 떨어지는지 비교할 수 있었으며, 명왕성에서는 알이 깨지지 않을 정도였음.
  • Orbits는 명왕성이 여전히 행성으로 여겨지던 시기에 제작된 프로그램임.
  • Egghead Software와 Electronics Boutique에서 게임과 소프트웨어를 구경한 기억이 있음. 매력적인 박스 아트가 있는 큰 상자 제품과 3.5인치 플로피 디스크만 쌓아 둔 제품이 함께 판매됨.
  • 플로피 디스크는 느리고 결국 작동을 멈추기도 했지만, 제한된 라이선스를 받거나 모든 것을 대여하는 대신 소프트웨어를 실제로 소유할 수 있다는 점을 여전히 좋게 여김.
  • 초기에 구매한 게임 가운데 하나가 SimCity 2000임.

SimCity 2000

  • 실제로 SimCity 2000을 아주 많이 플레이한 것은 아니지만, 돌이켜보면 컴퓨터와 함께한 여정에서 중요한 순간으로 이어짐.
  • SimCity 2000은 등각 투영 방식의 도시 건설 게임임. 좋은 평가를 받았는지는 확실하지 않지만, 그래픽이 아름답다고 느꼈고 샌드박스 게임의 즐거움을 처음 경험하게 해 줌.
  • 게임에는 달성해야 할 목표가 있었지만, 도시에 이것저것 짓고 결과를 지켜보는 것을 더 좋아함.
  • 게임을 잘하지 못해 목표를 달성하기 전에 돈이 바닥나곤 함.

저장 게임

  • SimCity 2000은 도시 저장 데이터를 컴퓨터의 파일로 보관함. 어느 시점에 디스크의 저장 파일을 편집할 수 있다는 사실을 알게 됐지만, 어떻게 알았는지는 기억나지 않음.
  • 저장 게임이 디스크 파일로 저장된다는 점의 의미를 스스로 독립적으로 알아냈을 가능성은 10% 정도라고 생각함.
  • 게임 머니를 늘리는 과정은 다음과 같음.
  • 게임에서 보유한 돈을 기록하고 게임을 저장함.
  • 저장 파일을 열어 해당 값을 이진 데이터에서 검색함.
  • 값을 더 크게 바꿔 저장한 뒤, 저장 게임을 다시 불러옴.
  • MS-DOS에 내장된 EDIT 명령은 텍스트 파일만 편집할 수 있어 이진 파일 편집에는 적합하지 않았음.

16진수

  • 이진 데이터를 편집하려면 텍스트 편집기의 이진 파일 버전과 같은 헥스 에디터를 사용함.
  • 헥스 에디터는 바이트 단위로 맞춰 간결하게 표시하기 위해 보통 16진수를 기본으로 사용하고, 옆에 ASCII 표시를 함께 제공함. 사용한 프로그램은 Norton Utilities의 DiskEdit였던 것으로 추정함.
  • 16진수는 10진수와 기본적으로 같지만, 밑을 2의 거듭제곱에 맞추기 위해 A부터 F까지를 추가한다는 점을 배움.
  • 게임 머니 값을 16진수로 검색해 모든 자릿수를 F로 바꾸면 보유 금액을 최대로 늘릴 수 있었음.
  • 저장 파일 형식에 관한 당시의 설명은 완전히 정확하지 않음.
  • 당시에는 저장 형식이 머니 값을 가능한 한 적은 바이트로 기록한다고 이해함. 예를 들어 20,000달러는 16진수 4E20이므로 두 바이트만 기록되고, 이를 FFFF로 바꾸면 65,535달러가 됨.
  • 그 뒤 저장 게임을 불러와 몇 달러를 버는 사소한 행동을 하고 같은 과정을 반복하면, 이번에는 FFFFFF로 바꿔 약 1,600만 달러까지 늘릴 수 있었음.
  • 이후 누군가 SimCity 2000 파일 형식을 역공학한 결과, 실제로는 데이터가 런 렝스 인코딩(RLE)되고 머니 값은 항상 부호 있는 32비트 값이라는 점이 밝혀짐.
  • 상위 두 바이트의 0000은 두 번째 바이트인 00을 한 번 더 반복하라는 뜻의 8100으로 변환됨. 반복되는 바이트가 큰 엔디안 머니 값 안에 들어 있지 않다면, 어린 시절 사용한 방법은 설명과 달리 실제로도 잘 작동함.

16진수 변환

  • 아버지가 요청을 받고 10진수를 16진수로 바꾸는 변환기를 만들었던 것으로 기억함. C로 작성했고, Power C 컴파일러를 썼을 가능성이 있으며, for 반복문을 사용했을 수도 있음.
  • 현재의 구현은 C 표준 라이브러리를 이용해 입력된 부호 없는 정수를 16진수로 출력하는 방식임.
  • 16진수를 10진수로 바꾸는 기능은 필요하지 않았음. 16진수 자릿수를 모두 F로 덮어쓰기만 하면 됐기 때문임.

치트 과정을 다시 살펴보기

  • 앞서 설명한 10진수-16진수 변환기는 사실 불필요했음. 과정을 다시 확인하다가 Norton DiskEdit에 이미 내장된 16진수 변환 기능이 있다는 점을 알아챔.
  • DiskEdit는 원래 DosBox에서는 작동하지 않고 DosBox-X에서만 작동했으며, IMGMOUNT를 통해 원시 이미지 파일을 마운트해야 했음.
  • DiskEdit는 DOS 파일 API를 거치지 않고 하드 드라이브를 직접 조작하는 것으로 보임.

SimCity를 넘어

  • 지금은 비트와 바이트, 16진수가 익숙해 사소한 작업이지만, 당시에는 큰 돌파구였음. SimCity 2000에서 치트를 할 수 있었고, 바이트와 16진수도 배움.
  • 그 지식을 바탕으로 다른 게임도 해킹할 수 있을지 궁금해했고, 이후 플레이한 거의 모든 게임에서 비슷한 시도를 했을 가능성이 있음.
  • 나중에는 게임 실행 중 메모리의 바이트를 검색하고 수정하는 도구도 찾음. Game Wizard라는 이름이었던 것으로 기억함.
  • 이 도구로 체력 값이 메모리의 어디에 저장됐는지 찾아 원하는 때에 체력을 가득 채울 수 있었음.
  • Nintendo Entertainment System용 Game Genie도 이런 방식으로 작동했을 것으로 추측하지만, 도구를 찾아 실제 동작을 확인할 만큼 부지런하지는 않음.

배운 점

  • 게임 치트를 통해 다음을 이해함.
  • 16진수는 원시 바이트를 표시하는 데 편리함.
  • 디스크의 파일은 쉽게 접근할 수 있음. 적어도 DOS에서는 그러했으며, 현대 휴대전화에서는 그렇지 않음.
  • 메모리와 디스크에 있는 바이트는 수정할 수 있음.
  • 이런 이해가 이후 컴퓨터 분야에서의 성공에 기여했을 가능성이 있음. 작은 토대였지만, SimCity 2000에서 이기는 방법을 익힌 뒤 컴퓨터를 더 큰 목표에 활용하고 싶어졌고, 직접 게임을 만들고 싶다는 생각으로 이어짐.