본문으로 바로가기

파일의 IT 블로그

  1. Home
  2. 보안 강좌/CheatEngine
  3. [Cheat Engine Game] 치트엔진 튜토리얼 게임 Step #1 풀이

[Cheat Engine Game] 치트엔진 튜토리얼 게임 Step #1 풀이

· 댓글개 · KRFile

이전 튜토리얼 마지막 문제인 Step 9에서 Skip을 누르거나 클리어를 하셨다면

 

다음과 같이 게임 형태의 새로운 튜토리얼이 등장합니다.

 

이제부터 치트엔진 메인 화면에서 Help 를 눌러서 맨 아래에 있는 Cheat Engine Tutorial Games 바로가기로 열 수도 있습니다.

 

만약에 치트엔진 튜토리얼 게임에서 1개 이상의 문제를 클리어 한 상태로 다시 실행하면 이렇게 Level 을 선택할 수 있는 인터페이스가 나와서, 캐릭터로 저기 과녁에 총알을 맞춰 부수면 특정 레벨의 튜토리얼 게임 문제 풀이를 진행할 수 있습니다. (총알 발사 키 : Space)

 

어쨌던 간에.. 치트엔진 튜토리얼 이후 다음 문제인 치트엔진 튜토리얼 게임 Step1부터 다시 문제 풀이를 시작해보도록 하겠습니다! 

 

Step 1:
캐릭터로 총알 5발을 발사할 때마다 당신은 재장전 해야 하며, 그 후에 목표물이 치유됩니다.
목표물을 파괴할 방법을 찾으십시오.

(클릭 시 숨김)

 

Solution 1 -  내 캐릭터 무한 총알 발사

일단은 1번 문제 답게 매우 쉬워보이는 문제입니다.

처음이니깐 일단 스페이스바로 저 과녁을 부숴보도록 하겠습니다.

 

 

일단 4발을 맞췄고 저 초록색이 남은 체력입니다.

 

마지막 1발을 맞추자마자 과녁의 체력이 쫙 차버리네요.

위에 설명을 보셨듯이 내 캐릭터는 5발을 쏜 뒤에 재장전 시간이 있으므로 이런 식으로 가다간 절대로 과녁을 부술 수 없습니다.

 

오른쪽에 몇 발에 재장전이 필요한 지 표시되고 있습니다. 혹시 이 값을 검색하면 되지 않을까요?

 

4 Bytes, Exact Value 로 5를 검색해 보았습니다.

 

값을 변경 한 뒤에 다시 3 검색

 

값을 변경 한 뒤에 다시 1을 검색.. 했습니다만 값이 나오지 않네요!

 

지금까지 치트엔진 튜토리얼 프로그램에선 눈에 보이는 값을 그대로 검색하면 메모리 상에서 그 값을 그대로 찾을 수 있었습니다. 그러나 실제로 허접해보이는 싱글 게임이라도 이렇게 눈에 보이는 값이 그대로 검색되는 경우는 매우 드뭅니다. 대부분 보이는 대로 값을 메모리에 저장하지 않고 암호화 된 상태로 저장하거나, 어떻게든 다른 식으로 저장해두는 경우가 많습니다. 최소한의 보안을 위한 암호화라고 보시면 됩니다. 지금까지 치트엔진 튜토리얼에선 암호화가 전혀 적용되지 않았으며, 눈에 보이는 값이 그대로 검색되었으나 치트엔진 튜토리얼 게임 시리즈부턴 값을 쉽게 쉽게 눈에 보이는 대로 찾게 허용하지 않습니다. (물론 별도의 어려운 암호화가 걸려있다는 뜻은 아닙니다. 눈에 보이는 대로 값을 찾기 어려워졌다는 것이죠.)

화면에 보이는 저 재장전 수치가 5로 표시 될지라도 암호화가 되어 있거나, 모종의 이유로 인해 실제 메모리엔 5로 표시 되어 있지 않은 겁니다. 이러면 어떻게 해야할까요?

 

이제부터 값이 암호화 되어있거나, 암호화 되어 있지 않거나 상관 없이 애초에 값이 어떻게 바뀌고 있을 지 파악 자체가 어려울 때 값을 확실히 찾아 낼 수 있는 테크닉을 소개해드리겠습니다.

 

Technique1 - 모르는 값 노가다로 찾기

해당 테크닉은 "노가다" 를 활용해서 암호화/비암호화 여부에 상관 없이 원하는 값을 찾아 낼 수 있는 강력한 방법입니다.

사실 거창하게 테크닉이라고 소개했지만 이미 튜토리얼 #3번에서 비슷하게 나마 소개를 드렸던 방법입니다.

 

바로 치트엔진의 Unkown Initial Value 와 Changed / Unchanged Value 를 활용하는 방법입니다.

 

현재 문제를 풀이할려는 방법은 솔루션 제목에서 보시면 알다 싶이 캐릭터가 재장전 없이 무한으로 총알을 발사하여 과녁을 부술려고 합니다.

 

하지만 지금 저희는 게임 화면만 볼 수 있지 메모리 상황은 어떻게 돌아가는지 알 수가 없으므로 지금부터 "가정" 을 하고 노가다를 해야 합니다.

 

해당 게임은 어떻게 재장전을 처리하고 있을까?

1. 총알을 몇 발 발사했는지 변수에 기록하고 변수 값이 5발이 되면 잠시 멈췄다가 재장전 후 다시 0으로 초기화 해서 처리하는걸까?

2. 반대로 오른쪽 아래 화면에 표시된 것처럼 총알 5발을 쏠 수 있으니 5라는 숫자값을 (암호화하여) 변수에 기록했다가, 다 쏘고 0이 된 상태가 오면 Reloading 을 표시했다가 다시 5로 초기화 하는걸까? 

3. 이외에도 특수한 방법을 사용하여 (bool 값이라던지) 캐릭터의 재장전을 관리하고 있지 않을까?

 

처럼 수 많은 가정이 오고 갈 수 있습니다. 하지만 이렇게 가정을 하면 끝이 없습니다. 그러나 확실한 것은 총알을 쏘면 무언가 값이 "바뀔 것" 이라는건 확신할 수 있습니다. 그렇죠?

캐릭터가 총알을 몇 발 쐈는지 변수에 기록하건, 총알이 몇 발 남았는지 기록하건 어떻게 됐던 간에 캐릭터가 총알을 쏜 이후부터 총알에 관련된 값은 반드시 "바뀝니다".

 

이 값의 변화를 염두에 두고 치트엔진으로 검색해보도록 하겠습니다.

 

일단 총알에 관련된 값은 정수라고 가정한 뒤 Unknown initial value(모르는 초기값) 모드로 4바이트 검색하겠습니다.

저번 튜토리얼에서도 해보셨겠지만 Unknown initial value 를 사용하면 관련 데이터 타입 (현재는 4바이트 정수)에 관한 모든 값들을 검색합니다.

한마디로 해당 게임에서 사용하는 RAM에 저장된 모든 정수 데이터를 검색하겠다! 라는 뜻이죠.

 

값이 굉장히 많이 나왔습니다. 모든 정수 데이터가 검색됐으니 당연하기도 합니다. 여기서 총알을 쐈을 때만 반응하는 값들만 찾아 내야 합니다.

 

총알을 쏘고 총알의 갯수가 변경되었으므로 Changed Value(바뀐값) 모드로 검색

 

다시 총알을 쏘고 총알의 갯수가 변경되었으므로 Changed Value(바뀐값) 모드로 검색

 

그리고 총알을 쏘지 않은 상태에서 , 총알의 갯수는 변경되지 않았으므로 Unchanged value(바뀌지 않은 값) 로 검색

저기서 Repeat 를 체크하면 Unchanged value 검색을 무한히 반복합니다.

 

화면이 깜빡거리면서 변경되지 않은 값만을 계속 검색합니다.

 

이 상태서 총알은 절대 쏘지 않고 캐릭터의 몸체만 방향키로 빙빙 돌리면서 계속 냅둡니다.

이런 행위를 하는 이유는 현재 찾아 놓은 값에서 캐릭터의 움직임에 따라 변화하는 값도 있을 것이기 때문입니다.

저희가 찾아야 하는건 오직 "총알을 쐈을때" 반응하는 값이므로 버려야 합니다.

그래서 Unchanged value(바뀌지 않은 값) 으로 검색하는 겁니다. 캐릭터가 몸통을 움직여도 애초에 총알을 쐈지 않기 때문에 총알에 관련된 값은 변하지 않기 때문이죠.

 

이렇게 해서 어느 정도 값이 줄어들고, 더 이상 줄어들지 않는 것 처럼 보이면 Repeat 를 눌러서 일단 Unchanged value 로 계속 검색하는걸 중단합니다.

 

다시 총알을 쏘고 Changed value 검색

 

위에서 설명했던 과정을 반복합니다.

총알을 쏘지 않은 상태선 Unchanged value로,

총알을 쐈다면 Changed value로.

 

여기서 Changed / Unchanged 대신에 발사한 총알 갯수가 늘어나거나 남은 총알 갯수가 감소했다고 가정해서 Increased / Decreased 로 검색을 할 수도 있지만요. 지금은 이 게임이 총알 관련 재장전을 처리할 때, 남은 총알 갯수를 기록하는지, 지금까지 발사한 횟수를 기록하는지 정확히 모르기 때문에 Increased 나 Decreased로는 함부로 검색을 할 수가 없습니다.

 

물론 Increased 나 Decreased 로 둘 다 검색을 해서 확인하는 방법도 있는데 일단은 한 번에 하려면 Changed 나 Unchanged 로 검색하는게 낫습니다.

 

값을 줄여 보았으나 30 개 미만으로는 줄이기가 어려웠습니다.

 

이 상황에서 이제 눈치껏 총알 처리와 관련된 변수를 잘 찾아내야 하는데요.

 

총알을 쏘면서 확인해본 결과 총알과 관련된 메모리 값은 0156CD2C 에 위치한 값으로 보입니다.

 

그 이유는 이 값은 총알을 쏠 때마다 1씩 증가하다가

 

재 장전을 할때가 되면 다시 0으로 초기화 되기 때문입니다.

 

결론적으로 해당 게임이 캐릭터 총알을 관리할 때, 발사 횟수를 기록하다가 5가 되면 재장전이 걸리면서 0으로 초기화 되는 거였네요. 남은 총알 횟수를 기록하고 있던 게 아니라요.

 

 

화면에 보였던 남은 총알 갯수는 사실 훼이크 였고, 원래는 캐릭터가 총알 갯수를 얼마나 발사했는지 기록하고 있었습니다. 5발째 쏘면 다시 0으로 초기화 해주고. 즉 오른쪽에 남은 총알 갯수는 캐릭터가 발사한 총알 횟수 + 5를 해서 화면에 표시 중인걸로 보입니다.

 

 

(스캔 해놨던 건 다 지웠습니다)

 

재장전이 걸리는 건 캐릭터 총알 발사 횟수 5부터니깐, 캐릭터의 총알 발사 횟수를 5까지 도달하지 않게 하면 될 거 같습니다. 캐릭터의 총알 발사 횟수를 0으로 고정해버립시다. 이러면 절대로 캐릭터의 총알 발사 횟수가 5회가 될 수 없겠죠.

 

재장전 없이 한꺼번에 총알 발사가 가능해집니다!! 클리어!!

 

 

Solution 2 - 과녁 체력 조정

위 Solution 1 과정에 이어 이번엔 다른 방법으로, 캐릭터 총알 발사를 조작하는게 아니라 과녁 체력을 조정해보겠습니다.

 

사실 과녁 체력이 정수인지, 실수(소수) 인진 잘 모르겠습니다만 일단 정수로 가정하고 모르는 초기 값 검색을 합니다.

 

 

과녁을 때려서 체력을 달게 한 후에 Changed 또는 Decreased Value

 

다만 일반적으로는 위에서 한 대로 Changed 를 추천합니다. 왜냐면 눈으로 보이는 과녁의 체력을 달게 만들었다고 해서 실제로 과녁에 반영하는 메모리값 또한 감소했다는 걸 확신할 수가 없습니다. 왜냐면 저런 과녁 체력값도 잘 암호화 하면 눈에 보이는 체력은 달았을 지 몰라도 실제로 암호화된 값을 보면 막 음수로 찍혀있는 경우도 있고, 맞았는데 체력이 증가하거나 랜덤하게 튈 수가 있습니다.

 

이렇게 암호화 되더라도 "변화한 사실" 자체는 변하지 않기 때문에 Changed 로 검색하는게 좋다는 겁니다.

아무리 암호화가 되었다 하더라도 그에 맞춰서 값이 변화하지 않게 되는 경우는 없었습니다.

 

다만 해당 튜토리얼에서 그 정도의 암호화가 되어 있을거라곤 생각하지 않으므로 저는 빠른 검색을 위해 Decreased Value로 검색하겠습니다.

 

 

과녁의 체력을 달 게 만들고 Decreased value... 반복합니다.

 

이렇게 검색하다가 체력이 다시차면 Increased value

 

반복하다보면 과녁의 체력으로 딱 추정되는 것이 있는데 저 정수값이네요.

 

과녁의 체력은 만피일때 100입니다. 지금까지 대부분의 설명이 암호화를 염두에 두고 했었지만 암호화는 되어 있지 않았네요. 

 

과녁의 체력을 1로 바꿔버리고 한 대 쏴주면 바로 클리어!! 참 쉽죠?

SNS 공유하기
💬 댓글 개
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.