나만의 메모노트

[리버싱] 치트 엔진으로 싱글 게임 분석해보기 본문

Security/Reversing

[리버싱] 치트 엔진으로 싱글 게임 분석해보기

sp3arm4n 2021. 7. 27. 03:13

공부 목적으로 Cheat Engine을 이용하여 간단한 게임 핵을 만들어보았다.

이 싱글 게임은 어릴적 학교 컴퓨터실에서 많이 해봤던 피카츄 배구다.

이 게임은 포켓몬스터의 마스코트 캐릭터 피카츄가 몬스터볼을 사용해 배구를 하는 것으로 1명 또는 2명의 플레이어가 간단한 조작만으로 플레이가 가능한 싱글 게임이다. 2명의 플레이어가 서로 머리를 이용하여 몬스터볼을 치거나 스매쉬를 날려 가장 많은 포인트를 획득하는 플레이어가 승리를 가져가게 된다.

그럼 이제 치트 엔진을 이용해서 어떠한 상황에서도 내 점수만 올라가도록 메모리를 변조해보자!!


1. 메모리 분석

가장 먼저 Cheat Engine에 피카츄 배구를 Attach해줘야 한다. 그래야 메모리 분석을 할 수 있다.

그럼 이제 실제로 피카츄 배구를 플레이 해보며 어떤 값이 변하는지 확인한다.

상대 플레이어가 친 몬스터볼이 내 구역으로 떨어지자 점수가 1증가되는 것을 확인했고,

이를 통해 몬스터볼이 바닥에 닿는 순간 점수가 변하는 것을 알 수 있었다.

따라서, Cheat Engine을 통해 상대방의 점수가 1점씩 오를 때마다 Scan을 떠본다.

우선 1부터 천천히 Scan 떠보면 다음과 같이 무수히 많은 값들이 나타나는 것을 확인할 수 있다.

Next Scan을 누르면서 값을 찾다보니 최종적으로 나타나는 값이 0228134C라는 것을 확인할 수 있었다.

Value값에 대한 메모리 주소값을 찾았다면 이제 이 값이 어떤식으로 동작하는지 살펴보자

F6을 눌러 테이블에 있는 메모리 값을 따라가면 해당 주소에 값이 들어가기 이전의 작업들이 어디서 일어나는지 아래 어셈블리어를 보고 알 수 있다.

즉, 주소값이 00403CAE인 instruction이 실행되면 0228134C에 값이 저장된다.

아래 어셈블리어를 보면 ECX에 00000001이라는 값이 저장된 것으로 보아 이 값이 점수를 올려주는 레지스터로 보인다.

그렇다면 좀 더 원활하고 자세히 분석하기 위해 Show disassembler를 실행하고, F5를 눌러 해당 지점에 BP를 걸어준다.

근데 해당 지점에 BP를 걸자 몬스터볼이 바닥에 닿기도 전에 게임이 멈추게 된다.

즉, BP를 건 지점이 몬스터볼이 바닥에 닿는 순간일 것이고, 이는 점수와 매우 관련이 있다고 보여진다.

다음은 해당 구간에 어셈블리어 코드이다.

앞서 eax가 점수를 올려주는 레지스터라고 예측을 했다.

그렇다면 해당 어셈블리어를 살펴보도록 하자.

 

00403CA2부터 보면 eax에 00000001을 넣고, 비교 결과값이 '0'이거나 작을 경우 00403CAB로 점프한다.

그러나 비교 결과값이 '0'이 아니기 때문에 점프하지 않고, 다음 명령 줄로 넘어간다.

 

다음 명령 줄을 보면 xor 연산을 통해 eax의 값을 초기화시켜주며, inc 명령어가 실행된다.

inc 명령어는 증감 명령어로 해당 명령어에 1을 더해준다.

 

이 때 3C가 상대 플레이어의 점수값이라는 것을 확실히 알 수 있었고,

4C가 내 점수를 저장하는 값이라는 것을 추측할 수 있다.

 

따라서, mov  [esi+4C], eax 이전의 Opcode를 변조하면 내 점수만 올라갈 것이라는 것을 유추해볼 수 있다.

그렇다면 xor  eax, eax을 변조해보면 확인할 수 있을 것이다.


2. 메모리 변조

Cheat Engine으로 메모리를 변조하는 방법에는 2가지가 있다.

첫 번째로, 변조하기 위한 메모리값을 선택하고 마우스 우측을 누르면 Replace with code that does nothing라는 것이 보인다. 이를 통해 쉽게 메모리를 변조할 수 있다.

두 번째로, Auto Assamble 기능을 사용하여 Code Injection을 수행하는 방법이다.

Ctrl + A를 누르면 Auto Assamble 창이 나타나면 Ctrl + Alt + T를 눌러 Cheat Table framework code를 먼저 생성한다.

다음으로 Ctrl + I를 누르면 다음과 같이 Code Injection을 하기 위한 Code가 생성된다.

우리는 xor 부분을 nop로 바꿔준 후 Execute한다.

그럼 다음과 같이 메모리가 변조된 것을 확인할 수 있다.


3. 실행결과

다음은 메모리를 변조한 후 게임을 실행한 것이다.

난 이제 피카츄 배구의 무적이 됬다.

이제는 어떤 누구와도 피카츄 배구를 한다면 100%의 승률을 보일 수 있을 것이다.