고전 게임 황금도끼에 대해서 아주 오래 전에 글을 쓴 적이 있었는데 또 내용을 첨언할 게 생겼다.
그 글은 이 블로그가 생기기도 전, 제로보드 시절에 썼던 글이니 시기로는 2009년이나 그 이전의 정말 옛날 글이다.
황금도끼는 오락실용 원판이 나온 이후로 다양한 플랫폼으로 이식되었다.
그 중 Mega Drive/Genesis 판(게임기용?)은 레벨을 좀 더 추가하고 Duel이라는 결투 모드를 넣는 등 게임 시스템에 변화를 좀 넣었는데, PC(도스)용 버전은 바로 이 버전에서 파생되어 나왔다. 원판이 1989년에 나왔고 PC용이 그 이듬해에 나왔다는 것은 페르시아의 왕자와 일치하는 내력이다.
Mega Drive/Genesis에서 추가되고 PC용에서도 도입된 결투 모드는 스토리(아케이드)를 따라 진행되는 정식 게임이 아니라, 주인공이 고정된 arena에서 정해진 적들과 PvP를 벌이는 일종의 대전 게임이다. 첫 레벨에서는 그냥 잡몹 한두 마리만 나오지만, 레벨이 올라갈수록 보스급 몬스터가 등장하면서 진행이 어려워진다.
결투 모드에서는 아케이드 때와는 달리 몹도 체력이 화면에 나온다. 정확히는 화면에 존재하는 모든 몹들의 체력의 합임. 덕분에 적을 얼마나 더 두들겨 패야 이번 레벨을 끝낼 수 있는지를 얼추 알 수 있다.
사실, MMORPG나 전략 시뮬, 아니면 아예 1:1 대전 액션 게임 같은 장르 말고 통상적인 액션/아케이드형 게임에서 내가 싸우고 있는 몹의 체력을 알 수 있는 게임은 별로 없다. 페르시아의 왕자는 적과 싸우는 것은 1:1 대전 컨셉을 표방했기 때문에 친절하게 적의 HP가 화면에 나오는 것일 테고, 황금도끼도 아케이드가 아닌 결투 모드에서는 그런 컨셉을 추구하여 적의 HP를 표시해 주는 것 같다.
단, PC용의 경우, 해골 두 마리가 등장하는 레벨 9 이상부터는 주인공과 몹들의 HP가 화면에 안 나오기 시작한다. 화면에 아무 정보도 표시되지 않으며, 이 덕분에 부하가 좀 줄어들어서 게임의 진행이 약간 빨라지기도 한다.
Mega Drive/Genesis 판에서는 레벨이 올라갈수록 날이 점점 어두워져서 밤이 되는 효과가 있으나, PC용은 그런 것도 없다. 아무튼...
그렇게 레벨 13까지 가면 빨간 기사와 빨간 뚱보에 잡몹 둘까지.. 총 4마리나 되는 몬스터가 나타난다.
그런데 문제는 이 레벨을 깬 다음이다. 무슨 파일이 없는지 다음 디스크를 넣으라는 메시지와 함께 게임 진행이 중단된다.
이건 뭐 취소할 수도 없고 프로그램을 종료할 수도 없다. 황금도끼를 돌리고 있는 도스 에뮬레이터를 강제 종료하는 수밖에 없다.
도대체 왜 이러는 것일까?
혹시 프로그램 배포에 문제가 있는 게 아닌가 싶어서 국내외 여러 곳에서 서로 다른 황금도끼 파일을 구해 봤지만, 파일 구성은 변한 게 없으며 레벨 13 이후에 저렇게 진행이 중단되는 건 여전했다.
그럼에도 불구하고 유튜브를 뒤져 보면, 황금도끼 PC판에서 레벨 13 이후에도 결투를 진행하는 플레이 동영상이 존재한다. 세상에! (☞ 링크 클릭. 2분 58초부터)
레벨 14는 아케이드 레벨 6의 보스인 Death Adder 주니어와 부하 해골 두 마리이며, 레벨 15는 아케이드 마지막 레벨의 최종 보스인 그 시커먼 Death Adder와 부하 해골 두 마리이다. 그리고 이게 결투의 마지막이다.
이 사람은 어떻게 해서 레벨 14와 15까지 잠금해제를 한 걸까?
결론부터 말하자면, 뜻밖에도 인터넷에 굴러다니는 황금도끼 배포본에 일부 파일이 누락됐거나 문제가 있는 건 아니다.
레벨 14~15의 리소스도 다 준비돼 있는데 프로그램 자체에 버그가 있어서 그걸 제대로 인식을 못 한 거라고 한다.
외국의 어느 리버스 엔지니어링/해커 팀에서 해당 프로그램을 기계어 코드를 일일이 분석하면서 디버깅한 끝에 그 버그가 무엇인지를 알아냈다. 이 문서를 참고하시라.
황금도끼 PC판은 gold.exe라는 실행 파일이 lzexe라는 과거의 16비트 도스용 실행 파일 압축기로 압축되어 있다.
그런데 저 글을 쓴 해커는 unlzexe가 있는 줄 모르고, 실행 파일 내부에 들어있는 압축 해독 루틴과 압축된 데이터를 읽고 따라가면서 그냥 근성으로 실행 파일의 로직을 추적했다고 한다.;; 8086 어셈블리와 도스 인터럽트 API에 통달한 사람이라면 최소한 80년대 이전생의 old timer일 텐데, unlzexe를 모르는 것도 신기하다만... 아무튼 괴수.
물론, 그 lzexe를 만든 사람도 괴물인 건 두 말할 나위가 없고 말이다. (ioccc 입상자이며, lzexe는 그가 겨우 고등학생일 때 만든 작품이다.. 쩝~)
자, 저 문서의 내용을 요약하면 이렇다.
문제의 원인은 레벨 14로 갈 때 프로그램이 잘못된 파일 이름을 요청한다고 한다. 파일 이름에 아스키 코드 4번 제어 문자가 들어있다고 하니 이는 명백한 오류이다.
역추적을 해 보면 드디어 레벨별로 소환할 몬스터 정보가 담긴 테이블에까지 도달하는데..
레벨 14와 15를 보면 비정상적인 값이 들어있다. 메모리의 내용을 강제로 일관성 있게 수정해 주니 놀랍게도 모든 결투 레벨이 정상적으로 진행된다.
이런 걸 찾아내다니 저 해커에게 경의를 표하는 바이다. 정말 안 되던 걸 되게 만든 사람이다.
SI가 가리키는 값을 보면 남자 여자 소형 잡몹은 따로 처리해 주는 게 없고, 0xA는 그 chicken leg 탈것이고 0xB+0x10은 붉은 용, 0xB+0x11은 푸른 용이다. 0x6은 대머리 보스, 0x3은 해골, 0x8은 칼 든 기사 보스, 그리고 0x7은 Death Adder의 스프라이트에 대응한다는 걸 알 수 있다.
저 메모리 테이블은 다행히 황금도끼의 실질적인 실행 파일에 해당하는 axe.dat에 고스란히 들어있다. unlzexe로 얘의 압축을 푼 뒤, 메모리를 패치하듯이 잘못된 값이 들어있는 부분(오프셋이 대략 0xFFxx대에 있음)을 고치면.. 레벨 14~15가 모두 잠금해제된 황금도끼를 즐길 수 있다~!
옛날에 게임 위저드 32를 이용해서 주인공의 HP를 강제로 늘리거나 심지어 값이 바뀌지 않는 무적 상태를 만들어 놓고 게임을 즐긴 적도 있다. HP 한 칸이 내부 HP 4에 대응하는 형태이기 때문에 비교적 쉽게 메모리 주소를 찾을 수 있었다.
지금도 그런 해킹 프로그램이 있다면 저 테이블을 메모리에서 찾아내서 결투 모드 버그 정도는 런타임 때 고칠 수 있을 듯하다.
디버깅을 할 줄 알면 이런 것도 다 가능하다는 걸 알 수 있었다.
Posted by 사무엘