로그인

회원가입 | ID/PW 찾기

연재

고대하던 컴퓨터의 구입, 그리고 ‘동급생’을 해킹하다

게임 프로그래머 문기영의 ‘게임 프로그래머 이야기’ ②

ProgC 2013-09-30 13:41:54

요즈음 컴퓨터는 누구나 살 수 있지만 옛날에는 컴퓨터가 비싸서 아무나 살 수 없었다. 당시에 컴퓨터 하나를 사려면 300만 원 정도 했었는데, 그 당시에 300만 원 가치는 최소한 지금의 2배 이상은 되는 것 같다. 운이 좋게도 내 친구는 컴퓨터를 갖고 있었고, 덕분에 나도 컴퓨터 게임을 즐길 수 있었다.

 

지금은 상상도 할 수 없겠지만 게임 중간 중간에 ‘다음 디스크를 넣어 주세요와 같은 문구를 보고 다음 게임을 진행하기 위해서 플로피 디스켓을 꺼내고 다른 디스켓을 넣어서 플레이했다. 그 이유는 당시 컴퓨터들은 램이 1메가(MB)도 안 됐기 때문이다. 


이전 이야기 ☞ 게임 프로그래머의 길 ① 게임을 잘하던 아이


 

 

지금은 추억의 물건이 플로피 디스켓.(출처: //en.wikipedia.org/wiki/Floppy_disk)

 

시간이 흘러 내가 처음으로 산 컴퓨터는 586이었다. 윈도우 95를 운영체제로 하고 있었고 이와 같은 바탕화면을 설정했었다.

 

 

큰 돈을 들여서 컴퓨터를 샀지만, 사실 컴퓨터를 어떻게 사용해야 하는지는 전혀 몰랐다. 컴퓨터를 사자마자 <동급생>이라는 게임을 가장 먼저 돌려 봤는데, 게임이 실행되지 않았다. EMS를 사용해야 한다는 말이 있었고 이를 위해서 autoexec.bat, config.sys 파일을 수정해야 했다. 주변에 컴퓨터를 제대로 할 수 있는 사람이 거의 없었고 그냥 무작정 서점으로 달려가서 책을 골랐다.

 

PC 메모리 관리에 대한 책이었는데 사실 당시에 내용은 거의 이해할 수 없었고 어쩔 수 없이 친구 PC의 autoexec.bat와 config.sys를 복사해서 한 줄 한 줄 추가해 보며 게임이 실행될 때까지 파일 수정과 재부팅을 반복했다.

 

autoexec.bat은 부팅이 되고 나면 자동으로 실행이 되는 배치 파일이었는데, 여기에 재미난 것들을 할 수 있었다. 예를 들어,

 

echo hello

 

와 같은 내용을 한 줄 입력하고 컴퓨터를 재부팅하면 화면에 hello가 나왔다. 이것이 왜 신기했냐 하면 내가 직접 입력하지 않아도 컴퓨터가 부팅되면 내가 원하는 글자가 나왔기 때문이다. echo 외에도 배치 파일은 약간의 프로그래밍이 가능했었는데 당시 서점에 가서 배치 파일 프로그래밍이라는 책을 사서 열심히 공부했던 기억이 난다. 나중에는 배치 파일 안에 퀴즈 프로그램을 작성해서 퀴즈를 내고 사용자의 입력을 받은 후 답안에 따라서 O, X를 주는 코드를 작성할 수 있었다.

 

config.sys 파일로도 재미있는 것을 할 수 있었다. 바로 나만의 PC 메뉴를 만드는 것이다. 컴퓨터를 부팅할 때 어떤 게임을 실행하느냐에 따라 메뉴를 골라서 PC 사용이 가능했다. 지금은 상상도 하기 힘들지만 당시에는 게임 하나를 즐기기 위해서 재부팅을 많이 해야 했다. 이 때 메뉴를 구성해 놓으면 부팅할 때 어떤 게임을 할지에 따라 설정을 다르게 할 수 있었다. 예를 들어,

 

 

[MENU]

 MENUITEM=WIN, Windows

 MENUITEM=XMS, DOS with only Extended Memory

 MENUDEFAULT=WIN, 10

[COMMON]

 DOS=HIGH,UMB

 DEVICE=C:\DOS\HIMEM.SYS

 SHELL=C:\DOS\COMMAND.COM C:\DOS /E:512 /P

[WIN]

 DEVICE=C:\DOS\EMM386.EXE RAM

 DEVICEHIGH=C:\DOS\ANSI.SYS

[XMS]

 DEVICE=C:\DOS\EMM386.EXE NOEMS

 

(출처: //en.wikipedia.org/wiki/VXD_(CONFIG.SYS_directive)#VXD)

 

위와 같은 구문을 config.sys에 넣으면 부팅할 때 사용자가 선택할 수 있는 메뉴가 등장한다. 그래서 지긋지긋한 재부팅을 그나마 덜 할 수 있게 되었다.

 

간단한 퀴즈를 만들 수 있었지만 이상하게 내가 만든 것은 확장자가 bat였고, 다른 실행 가능한 프로그램들은 모두 확장자가 exe나 com이었다.

 

‘어떻게 하면 내가 만든 것도 com, exe로 만들 수 있을까?

 

라는 단순한 생각을 했다. 내가 만든 bat 파일도 내용을 모두 볼 수 있으니 com과 exe 파일도 볼 수 있지 않을까? 이런 생각으로 문서 편집기(MS-Dos Editor)로 해당 파일을 열어 보았었다.

 

알 수 없는 글자들….


알 수 없는 글자들을 보고 이런 생각이 들었다.

 

‘이걸 만드는 사람들은 천재다.

 

exe 파일을 만드는 건 도저히 안 될 것 같아서 심난해 하던 중에 당시에 해킹이라는 단어가 눈에 들어왔다. 컴퓨터 해커가 되면 컴퓨터로 무엇이든지 할 수 있을 것 같은 그런 생각이 들었다.

 

‘해커라면 com, exe 같은 것도 만들 수 있을 거야!

 

해커가 되겠다고 다짐한 후 서점에 가서 책을 하나 골랐는데 ‘해커선언’이라는 책이었다.

 

 

책 자체는 잃어버렸고 오래된 책이라서 이미지를 구하기도 힘들었다. 해킹 관련된 책들은 대부분 해킹 툴 사용법과 같은 아주 단순한 내용만 다루는 경우가 많았는데, 이 책은 좀 달랐다. 모든 것이 다 기억나지는 않지만 이 책은 어셈블리어를 다루고 있었다.

 

어셈블리(//en.wikipedia.org/wiki/Assembly_language)는 컴퓨터 프로그래밍 언어인데 C언어와 같은 고급언어가 아닌 저급 언어다. 어셈블리어의 모양은 다음과 같이 처음 보는 사람들은 이해하기가 어려울 것이다

 

(출처: //en.wikipedia.org/wiki/Assembly_language)

 

이 코드는 \0으로 끝나는 문자열(예를 들어 ‘abcdef)의 길이를 구하는 루틴이다.

 

mov ecx, -1

 

mov는 move의 약자이며 ecx 레지스터에 -1을 할당하라는 뜻이다. C언어와 같은 고급 언어를 사용하는 사람들도 어셈블리어를 한번도 써보지 않았다면 ecx가 무엇인지, eax가 무엇인지, cmp가 무엇을 뜻하는지 모를 것이다. C언어와 같은 고급 언어들이 이러한 하위단에서 돌아가는 세부 내용들을 모두 감추기 때문이다.

 

당시에 ‘해커선언이라는 책을 읽으면서 제대로 이해했던 것은 사실 아무것도 없었다. 그냥 책에 나와 있는 어셈블리어 코드를 그대로 옮겨 적으면 com 파일을 만들 수 있었고 그것을 실행하면 화면에 컬러로 된 외곽선이 생긴다는 것뿐이었다. 그리고 어셈블리어 코드의 마지막에는 반드시 int 21h를 실행해야 한다는 것. 그렇지 않으면 항상 컴퓨터를 재부팅해야만 했다.

 

어셈블리어를 제대로 이해하진 않았지만 기계어가 어떤 것이고 com과 exe 파일들이 어떻게 만들어지는지 알게 되었다. 결국 이상한 기호들로 프로그램을 만드는 것이 아니라 누구나 알아 볼 수 있는 코드로 작성하고 그것이 기계어로 바뀐다는 점이었다. 그렇게 내부 구조가 어떻게 만들어지는지 밑바닥부터 알게 되자, 다시 게임 쪽으로 관심이 가게 되었다.

 

당시에 친구가 빌려준 <삼국지>를 하게 되었는데, 이 <삼국지>를 제대로 플레이하려면 많은 시간을 들여야 했다. 특히 돈(게임머니)이 많이 부족했는데 돈을 더 많이 얻는 방법은 없을까 생각하다가 해킹을 떠올렸다.

 

‘맞아. 세이브 파일에 내 정보가 들어 있으니… 그걸 어떻게 바꿔 보면 안 될까?

 

에디터로 세이브 파일을 열어 보았더니 com과 exe 파일을 열었을 때와 비슷하게 알아볼 수 없는 글자들로 가득했다. 세이브 파일을 해킹하기 위해서 hex 에디터를 사용해야 했는데, hex는 ‘hexadicimal의 약자로 16진수를 의미한다. 컴퓨터는 내부적으로 2진수 시스템으로 이루어져 있지만 화면에 무언가를 표시할 때는 16진수를 사용한다. 왜냐면 2개의 글자 FF로 숫자 255까지 표현이 가능하기 때문이다. 어쨌든 당시에 hex에디터를 찾고 있었고 he.com이라는 프로그램을 접하게 되었다.

 

he.com이라는 프로그램의 모습.


이 프로그램은 실행 파일 하나로 되어 있었고 그 외에 다른 파일을 필요로 하지 않았다. 이 프로그램을 사용하는 방법은 하이텔에서 누군가 써 놓은 글을 읽고 하나씩 알게 되었는데 그 이유는 당시에 그림과 같은 간단한 영어조차도 읽을 수 없었기 때문이었다.

 

실제로 대부분의 세이브 파일은 바이너리 포맷으로 되어 있는데, 이 많은 데이터 중에 어떤 데이터가 내가 게임에서 원하는 돈(골드 혹은 관심이 있는 숫자) 관련 데이터인지 알기가 매우 어려웠다. 그래서 곰곰이 생각해 보니 다음과 같은 결론이 나왔다.

 


 ※ 노트: 바이너리(Binary) 포맷의 뜻은 //ko.wikipedia.org/wiki/%EC%9D%B4%EC%A7%84_%ED%8C%8C%EC%9D%BC를 참고 하길 바랍니다.

 

 

우선 게임에서 내가 가지고 있는 돈의 숫자가 100이라고 치자. 이때 세이브를 해서 A라는 파일을 하나 만들고, 이 A라는 파일을 다른 곳에 복사해 놓는다. 이름은 ‘OriginalA라고 하자.

 

그리고 게임에서 허용하는 기능을 이용해 돈을 사용하는 것이다. 돈이 더 많아지든 적어지든 상관없다. 하지만 여기서는 일단 돈이 적어졌다고 생각하고, 이제 돈이 90이 되었다. 90이 된 상태에서 다시 세이브를 하고 파일 이름은 ‘NewA라고 해보자. 이제 게임을 끄고 해킹을 시도할 차례다.

 

이제 우리가 가진 파일은 OriginalA과 NewA 두 개가 있다. 세이브 파일을 해킹하기 위해 필요한 트릭은 바로 이 두 개의 파일을 비교해 보는 것이다. 이해를 쉽게 하기 위해 이미지로 살펴보자.

 

OriginalA와 NewA의 데이터.


이미지를 보면 다른 구석이 있다. 아직 잘 모르겠다면 다음 이미지를 보자.

 

다른 부분을 빨간색 사각형으로 표시.


실제로 다른 부분은 이렇게 바로 나오지 않고 꽤 많을 수도 있는데 이 부분은 감으로 알거나 반복작업(일명 노가다)을 통해서 알 수 있다. 지금 예를 든 경우 16진수로 64가 10진수 100이라는 뜻이고, 바뀐 데이터 16진수 5A가 10진수로 90이 되기 때문에 쉽게 알 수 있었다. 그렇지 않을 경우에는 다른 부분의 숫자를 모두 FF와 같은 (10진수 255) 숫자로 바꾼 다음에 게임을 실행하고 바꾼 세이브 파일을 로드해서 확인해 보면 그 위치를 찾을 수 있다.(물론 그 위치를 찾을 때까지 반복한다는 게 포인트다.)

 

이렇게 내가 원하는 데이터의 위치를 찾을 때까지 하는 게 포인트다. 조금 익숙해지니까 거의 대부분의 게임 개발자가 숫자 데이터는 그대로 저장한다는 것을 알고 바뀐 부분에서 원래 OriginalA에서 가지고 있던 돈의 숫자(16진수)로 검색해 보면 관심 없는 데이터는 내가 수정하지 않아도 되었다. 조금 똑똑한 개발자는 숫자 데이터를 변형해서 바이너리에 저장하기도 했다. 그런 경우는 찾는 게 조금 어려웠는데 그래도 근성을 갖고 도전하면 데이터를 바꿀 수 있었다. 실패는 곧 컴퓨터 재부팅으로 이어졌기 때문에 신중에 신중을 기해야 했다.

 

단순한 파일 비교 트릭을 이용해 게임 데이터가 어떻게 바이너리 형태로 저장되는지 알게 되고, 그것을 수정함으로써 게임의 동작 방식이 바뀐다는 것을 알게 된 후에는 본격적(?)으로 작업에 들어갔다. 바로 <동급생>이었다.

 

<동급생>이라는 게임은 이벤트를 갖춰야만 모든 이벤트(?)들을 볼 수 있었는데 그것을 모두 보기가 너무 어려웠다. 게다가 플로우차트를 보고 시간에 맞게 움직여서 이벤트를 달성하는 것이 내게는 너무 시간 낭비 같았다. 그래서 해킹을 결심하게 되었고 그 결과….

 

게임 <동급생>.

 

게임 상에서 8월 10일에 모든 데이터를 볼 수 있게 되었다.(사실 이 글을 쓰기 위해서 도스 박스를 이용해야했고 옛날 기억을 되살려서 다시 해킹했다.) 이 게임을 해킹하는 것도 <삼국지>를 해킹할 때와 같은 방법을 사용했었다.

 

<동급생>의 폴더를 살펴 보면 여러 개의 파일들이 존재하는데, 사실 가장 중요한 것은 ‘FLAG0라는 파일이다. 지금은 이런 방식의 게임을 어떻게 만드는지 알기 때문에 더 쉽게 해킹이 가능했지만 옛날에는 어떤 것이 세이브 파일인지 몰랐기 때문에 모든 파일을 백업한 후에 게임을 조금 실행하다가 저장한 후 바뀐 파일들이 어떤 것인지 모두 검색해서 세이브 파일을 알아냈던 기억이 난다.

 

사실 지금 와서 생각해 보면 바뀐 파일들은 마지막으로 파일이 수정된 날짜로 시간이 바뀌기 때문에 더 쉽게 어떤 파일이 세이브 파일인지 알아낼 수 있었을 것이다.

 

그렇게 FLAG0이 게임의 정보를 저장하고 있다는 것을 알아냈고 FLAG0라는 데이터를 헥사 에디터로 살펴보니 다음과 같았다.

 

<동급생> 세이브 파일을 헥사 에디터로 살펴본 모습.


이 세이브 파일의 경우 아무런 이벤트도 진행하지 않은 채로 게임을 저장했을 때의 모습이다. 그리고 아까 <삼국지>를 해킹했을 때와 마찬가지로 어떠한 이벤트를 하나 실행한 이후에 세이브 파일과 비교해서 어떤 부분들이 바뀌었는지를 검색해 보면 된다.

 

그래서 얻은 힌트는 바로,

 

하나 이상의 이벤트를 얻어낸 후에 세이브 파일을 비교한 화면.


00으로 되어 있던 부분이 10 혹은 11로 되어 있었다. 그 데이터를 FF로 설정해서 게임을 해보았지만 바로 크래시(게임 다운)가 났었기 때문에 10 혹은 11로 되어 있던 구간 일부분을 모두 10이나 11로 교체해서 게임을 다시 실행해 봤다.

 

찾아낸 데이터가 맞는지, 바꾼 숫자가 제대로 된 값인지 알아내는 방법은 없다. 파일을 저장하고 게임을 실행해서 원하는 결과가 나오는지 아닌지를 확인해 보는 수밖에 없다. 데이터를 잘못 설정하거나 잘못된 주소의 데이터를 바꾸게 되면? 그 결과는 컴퓨터 재부팅이었다.

 

어쨌거나 나는 <동급생>에서 맵을 돌아다니지 않고 모든 이벤트 장면을 볼 수 있었다. 바로 다음과 같이 말이다.

 

갤러리 보기. 해킹에 성공한 이미지(?)는 올리지 못함을 양해 드리며….


마지막으로 기억이 나는 것은 <바이오 하자드> PC 버전의 경우 총알 탄수를 FF로 설정하면 총을 무한으로 쏠 수 있기도 해서 (아마 개발자 테스트 용도였던 거 같다) 게임의 재미가 반감되기도 했었다.

 

그렇게 게임 해킹을 열심히 하다가 다른 분야도 손대기 시작했는데, 어떤 일로 큰 충격(?)을 받았다. 그 이후로 해킹은 그만두게 되었다.

 

그리고 어느덧 고등학교에 입학하게 되었다.

  • 게임 프로그래머의 길 ① 게임을 잘하던 아이

  • 고대하던 컴퓨터의 구입, 그리고 ‘동급생’을 해킹하다

  • 게임 프로그래밍의 맛! 2,000 원을 벌고 책을 쓰다

  • 게임 프로그래밍을 위해 C언어를 배우다