본문 바로가기
비디오 게임 관련

요즘 업로드 되는 치트 롬이 만들어 지는 과정

by DsNo 2019. 7. 20.
728x90

지금 제 블로그에 업로드 되는 치트 롬 파일이 어떻게 제작되고 있는지 간략하게 설명을

해보려 합니다.

 

실제 제작하고 싶으신 분들이 참고하시기엔 매우 부족하고 이해의 난이도가 있으니

그냥 이렇게 제작되는구나 하고 봐주시기 바랍니다.

 

잘 안보이는 스샷들은 클릭하면 원래 사이즈로 보실 수 있습니다.

 

 

*** 치트 롬 파일이 만들어지는 과정 ***

 

 

https://gamehacking.org 라는 사이트에 Game Genie 코드를 먼저 찾아봐서 코드가 있다면 작업이 굉장히

쉬워집니다.

 

이미 만들어진 치트 코드를 롬에 적용해서 작동이 잘 하는지 테스트만 해보면 끝입니다.

 

 

위 사이트에 코드가 없을 경우 차선책으로 https://wikiwiki.jp/nnnes1 사이트에서

메모리 치트라도 있는지 찾아봅니다.

 

메모리 치트라도 있으면 FCEUX 에뮬레이터를 통해서 실제 롬 파일의 주소를

찾을 수 있습니다.

 

만약 위 두개의 사이트에서 못 찾았다면 이제부터는 쌩 노가다가 시작됩니다.

 

아래는 생 노가다가 어떻게 이루어지는지 대충 설명을 드려보겠습니다.

 

제 경우에는 패미콤 게임의 치트 롬을 만들때 FCEUX, Mesen 두개의 에뮬레이터를

사용합니다. FCEUX 가 주로 사용되는데 간혹 FCEUX 에서 구동이 되지 않는 게임이

있어서 이런 경우는 Mesen 을 사용합니다.

 

 

FCEUX 로 찾을때 스샷... 기본적으로 에뮬레이터에서 내장된 디버거와 헥스 에디터는

기본으로 켜놓고 작업합니다.

 

 

Mesen 을 사용할때 스샷... 마찬가지로 디버거와 에뮬레이터에서 내장된 메모리 에디터는

기본으로 켜놓고 작업합니다.

 

 

에뮬레이터에 내장된 메모리 치트 검색 툴로 목숨을 갯수를 찾아봅니다.

 

 

메모리 주소를 찾았다면 치트 항목에 추가해봅니다.

 

 

치트가 제대로 적용 되는지 살짝 플레이 해보고 목숨이 그대로인지 몇번 죽어봅니다.

문제가 없다면 다음 단계로 넘어갑니다.

 

 

찾은 메모리 치트 코드가 007A : 05 (메모리 7A 의 값을 05 로 고정) 였는데

에뮬레이터의 내장된 헥스 에디터에서 7A 를 살펴보니 값이 04 로 되어 있습니다.

 

이 말은 메모리 04 = 목숨 5대라는 뜻 입니다.

 

 

실제 메모리 7A 라는 주소는 어느 부분에서 작업이 되는지 Write 브레이크포인트를

걸어봅니다.

 

디버거에서 브레이크포인트는 아주 중요한데 간단하게 메모리 7A 를 최종적으로

어느 부분에서 호출 또는 작업이 되는지 검색하기 위해 사용합니다.

 

 

디버거의 브레이크포인트 부분에 메모리 7A 부분에 쓰기 기능이 어디에서

사용되는지 등록이 됐습니다.

 

 

아직 결과를 찾은게 아니기 때문에 실제 게임에서 목숨에 관련된 부분이니

검색이 될 때까지 죽어봅니다.

 

 

걸어둔 브레이크포인트가 검색되면 자동적으로 게임이 멈추고 디버거에 찾은 부분이

표시가 됩니다.

 

00:97F5: C6 7A     DEC $7A = #$04

 

라고 검색이 되는군요. 잘 보니 $7A = #$04 를 보니 메모리 7A 에 04 (5대) 값을 넣어서

DEC (메모리 감소) 옵코드 (Opcode)가 사용이 됐습니다.

 

DEC 옵코드는 C6 이라고 지정되어 있군요.

 

C6 7A 가 결국 메모리 7A 의 값을 감소시키는 옵코드로 설정 되어 있습니다.

결국 한대가 죽으면 7A 의 값을 하나 감소시키라는 명령어라고 볼 수 있습니다.

 

그 명령어가 97F5 주소이 있다고 되어 있네요.

 

패미콤에서 사용하는 옵코드는 http://www.6502.org/tutorials/6502opcodes 에서 보실 수 있습니다.

 

 

그럼 에뮬레이터에 내장된 헥스 에디터로 해당 주소인 97F5 로 가봅니다.

Goto Address 명령을 이용하면 쉽게 이동할 수 있습니다.

 

 

메모리 97F5 로 와보니 C6 7A 옵코드가 보이는군요.

 

 

C6 이 감소 시키는 옵코드니 이 부분을 직접적으로 변경하는게 효과적입니다.

에뮬레이터에 내장된 Game Genie 코드 생성 기능을 이용합니다.

 

 

메모리 97F5 에 C6 옵코드 (메모리 감소 옵코드) 를 다른 옵코드로 변경하면 되는데

제 경우는 해당 주소의 값을 불러오기만 하는 옵코드를 입력했습니다.

 

A5 옵코드는 (LoaD Accumulator) 뒤에 지정된 메모리 주소의 값을 불러오기만 합니다.

 

값을 고정 시키면 보너스를 획득해도 계속 똑같은 댓수만 고정되기 때문에

자연스럽게 보이기 위해서라도 값을 불러오기만 하면 증가되는 보너스도

문제없이 획득할 수 있습니다.

 

이제 생성된 Game Genie 코드도 따로 복사해두고 테스트를 해야하니 치트 목록에

추가시킵니다. 

 

 

치트 목록에 추가된 내용입니다. 메모리 97F5 에 C6 값이 있으면 A5 로 변경하라는 내용입니다.

 

 

치트를 적용하면 실제 에뮬레이터에 내장된 헥스 에디터에도 97F5 주소에 C6 이 A5 로

변경되어 있습니다.

 

이제 실제 게임으로 돌아가서 목숨이 줄어들지 않고 계속 그대로인지 테스트 플레이를

어느정도 진행합니다.

 

게임이 문제없이 어느정도 진행되면 찾은 Game Genie 코드가 제대로 찾았다는 결과입니다.

 

 

이제 실제 롬 파일에 어느 부분에 해당 C6 옵코드가 있는지만 찾아서 수정하면 됩니다.

에뮬레이터에 내장된 헥스 에디터에서 수정한 A5 옵코드를 기준으로 주변의 패턴을

복사해서 실제 롬 파일에서 찾아보면 됩니다.

 

메모리 주소이기 때문에 실제 롬파일에서 주소는 다른곳에 있습니다.

 

옵코드 근처의 Hex 를 복사합니다.

 

 

롬 파일을 에뮬레이터의 헥스 에디터가 아닌 PC 용 헥스 에디터를 이용해서 복사해둔

헥스 패턴을 검색해 봅니다.

 

찾아보니 딱 한군데에 해당 패턴이 있네요. C6 7A 옵코드도 정상적으로 보이고 제대로

찾았습니다. 이제 C6 을 A5 로 수정하면 무한 목숨이 완성됩니다.

 

위 방법외에 좀 다른 방법으로 찾아야 하는 경우도 있으나 큰 틀은 모두 같습니다.

 

 

*** 힘들게 찾았는데 사용하지 못하는 치트들 ***

 

위 방법을 통해 치트를 찾았음에도 불구하고 사용하지 못하는 경우가 있습니다.

 

메모리 치트에서는 문제없이 동작했는데 실제 롬 파일 내에서 수정하는 경우에는

의도된 것과 다르게 작동이 잘못되는 경우가 있습니다.

 

예를 들면 더블 드래곤 III 의 경우 무적 코드가 없는데 사실은 이미 찾았습니다.

그런데 무적 코드를 적용하면 내 캐릭터 뿐 아니라 적들도 똑같이 무적이 되어

버립니다.

 

이런 경우에는 보통 메모리는 내 캐릭터와 적들의 무적 판정이 따로 분리가 되어

있는데 롬 내부에서는 한군데에서 처리하기 때문에 그렇습니다.

 

무한 체력 부분도 똑같은데 체력이 줄어들지 않도록 수정했으나 마찬가지로

내 캐릭과 적 캐릭 모두 똑같이 체력이 줄어들지 않는군요.

 

이런 문제로 인해 메모리 치트에는 있지만 실제 롬 파일에는 적용하지 못하는

치트들이 꽤 많이 있습니다.