Mame Rom Hacking Reversing 롬 해킹 및 리버싱

2 minute read

MAME 기반의 게임 해킹

최근에 중국 해킹롬 the king of the fighters 98 을 플레이 하다가 문득, 고전게임의 롬파일 수정은 어떻게 하는걸까? 라는 생각을 가졌다. 고전게임도 결국 프로그래머가 프로그래밍한 프로그램일텐데, 지가 뛰어봐야 폰노이만 모델 아닌가? 라는 생각에 자료를 뒤지기 시작했다.

가장 기본적인 해킹 방식은 역시나 메모리 치팅이었다. 메모리 치팅이 진행되는 방식은 처음에 모든 값을 검색하고, 값의 범위를 좁혀나가는 작업으로 반복한다.

예를 들면, 생명의 개수를 조작하고 싶다. 그러면 처음에 메모리를 초기화 하고, 생명의 현재 개수를 검색한다. 생명이 5개라면 5를 검색, 한번 죽고 나서 4를 검색, 반복.

그렇게 하다보면 필연적으로 하나의 메모리 값이 나오게 된다. 그 메모리 값을 99 와 같은 큰 값으로 고정시키면 목숨이 무한개가 된다. 어릴 때 다들 T-search 와 gamehack 같은 툴로 한번씩은 해봤을 법한 작업이다.

이 작업은 mame 의 debugger 툴에서 똑같이 진행할 수 있다. 간단한거부터 해볼까?

우리의 타겟이 되는 게임은 Dungeons & Dragons: Shadow over Mystara 일명 던전 앤 드래곤이라는 게임이다. 줄여서 던드라고 칭하겠다.

이 게임은 내가 기억하기에 죽어가던 아케이드 시장에서 마지막으로 꽃을 피운 작품이다. 타임어택과 같은 방식을 제외한 일반 게임 진행시 1시간을 넘어가는 말도 안되는 볼륨을 보여준다. 고작 20MB 의 용량으로. 여러명에서 함께 하는 게임으로 아마 아케이드 시장에서 가장 성공한 게임이 아닌가 싶다. 이전의 타워오브둠에서의 단점이었던 빈약한 액션감을 보완하면서 최고의 게임으로 평가받고 있고, 현재에도 매니아들은 이 게임을 여전히 매일 매일 즐기고 있다. ( 액션감을 너무 강조한 나머지 난이도가 말이 안되게 쉬워졌지만 )

에뮬레이터 & 롬

여러 자식 롬들이 있지만 가장 건들기 쉬운 ddsomud 으로 진행한다.

mame 에 디버거를 띄우는 방법부터 알아야 한다. 일단 MAC 과 WINDOWS 기준으로 설명한다.

MAC

버전정보: sdlmame 0.174

https://nagarry.tistory.com/182 - 설치법

https://sdlmame.lngn.net/stable/ - 다운로드

MAC 에서는 sdlmame 0.174 를 써서 압축을 풀고 ./mame64 -debug

WINDOWS

버전정보: mame plus 0.167

ui 상에서 디버거 체크

가장 간단한 원시적인 게임 조작

지금부터 가장 원시적인 게임 조작을 해보겠다. 캐릭터의 피통을 맞아도 데미지가 안먹게 해보겠다.

위에서 지시한 대로 세팅하고 롬파일을 구동시키면 디버거가 뜬다.

image image

기본적인 mame debugger 의 사용법(https://docs.mamedev.org/debugger/cheats.html)은 각자 익히시고 따라하기 식으로 설명한다.

image

1. 처음 마을에 도착한 후 디버거 창에서 ci 를 입력 - 메모리 검색 초기화
2. 한대 맞고 cn de - 감소한 값 찾기
3. 한대 맞고 cn de - 감소한 값 찾기
4. 한대 맞고 cn de - 감소한 값 찾기

피통은 두개의 후보 중 하나다.

FF831D 는 바꿨을 때 피통이 바뀌지 않고, FF8641 을 AA 로 고쳤을 때 피통이 차는 모습을 볼 수 있었다.

우리가 찾던 변수는 FF8641 이라는 것을 알 수 있다. 우리는 FF8641 변수를 항상 특정값으로 고정시키는 치트를 써도 원하는 목적을 달성할 수 있으나, 핵롬을 만들기 위해서 변수를 고치는 것이 아니라 이 변수를 세팅하는 코드를 고쳐야 한다.

image

이제 어떤 코드에서 해당 변수를 바꾸는지 찾아야 하는데 이 때 쓰는 디버거 명령은 wp

명령어 입력창에 wp ff8641,1,w 를 입력하고 몬스터한테 맞아본다. ff8641 영역의 1바이트영역에 write 가 일어나면 breakpoint 걸리게 하는 명령이다.

image

27566 | sub.w D0, ($62, A0) | 9168 0062
2756A | bpl $27570

2756A 에서 게임이 멈추게 된다. 아마 ($62, A0) 위치에 D0 만큼 값을 빼면서 breakpoint 가 걸린 듯 하다.

27566 위치의 명령어를 아무것도 안하게 만들면 맞아도 데미지를 안입지 않을까?

한번 바꿔보자. 디버거에서 ctrl+m 을 누르고 Region ‘:maincpu’ 영역으로 이동 한 뒤 27566 위치로 이동해서

4E71 4E71 로 값을 입력해보자. 참고로 4E71 4E71 은 아무것도 하지 않는 명령어인 nop 이 두개 들어간 형태다.

image

이제 맞아도 데미지를 먹지 않는다.

Code Cave 를 향해

던전 앤 드래곤의 cpu 모델

던드의 롬파일의 식별자는 ddsom 이며 자식롬 구조는 ddsomxx 으로 정해져있다.

image

mame 소스의 cps2.cpp 를 보면 던드의 cpu 모델은 68000(68k)다.

M86K Assembler

Updated:

Comments