1. Tutorial Games Level #1
1.1 게임 설명
Tutorial Games Level #1은 주어진 총알 5발을 가지고, 과녁을 파괴해야 하는 게임이다. 그림 1의 4번 항목과 같이 마지막 총알 (5 번째 총알)을 과녁에 적중시키려 할 때, 총알이 RELOADING 되면서 과녁의 체력이 다시 채워진다.
총알 발사: Space Bar
1.2 풀이 과정
과녁의 체력이 얼마나 선언되어 있는지, 또 그 체력이 어떤 데이터 타입으로 선언되어 있는지 모르기 때문에 Cheat Engine 프로그램에서 Scan Type을 "Unknown inital value", Value Type을 "All"로 설정하여 First Scan을 수행한다.
과녁의 체력을 찾기 위해서, Scan Type을 "Decreased value"로 설정하였다. 이후, 총알을 발사하여 과녁의 체력을 감소시킨 뒤 Next Scan을 수행한다.
Next Scan 결과, 그림 3과 같이 Scan 결과가 많이 출력되어 과녁의 체력이 어떤 메모리 주소에 저장되어 있는지 파악하기 어렵다. 따라서, 다시 과녁에 총알을 발사하여 체력을 감소시킨 뒤 Next Scan을 수행한다.
그 결과, 그림 4와 같이, Next Scan을 통해 얻은 값이 초기 Scan 결과에 비해 감소한 것을 확인할 수 있다.
조금 더 Scan 결과 값을 줄이기 위해, 이번에는 과녁을 맞히지 않고, 키보드 방향키를 움직여 총알을 아무 곳에 발사한다. 이후, Cheat Engine 프로그램에서 Scan Type을 "Unchanged value"로 설정하고 Next Scan을 수행한다. 그림 5를 살펴보면, Scan 결과가 훨씬 감소한 것을 볼 수 있다.
다시 Scan Type을 "Decreased value"로 재설정하고, 과녁을 총알로 맞혀 체력을 더 감소시킨 뒤 Next Scan을 수행한다.
Scan 결과, 그림 6과 같이 과녁의 체력이 감소될 때마다 빨간 박스로 체크된 부분의 값이 지속적으로 변화하였다. 따라서, 해당 두 부분 중 하나가 과녁의 체력이 저장되어 있는 메모리 주소라고 판단하였다.
또한, 남은 총알 한 발을 과녁에 발사한 뒤, 과녁의 체력이 채워질 때의 값을 살펴보면, 그림 7과 같이 해당 두 값이 모두 100으로 변화하는 것을 확인하였다.
게임을 해결하기 위해서는, 총알 5발이 모두 소진되기 전 과녁이 먼저 파괴되어야 한다. 따라서, 그림 8과 같이 016721A0에 저장된 값을 1로 바꾸어 본다. 이후 총알을 과녁에 발사한다.
총알이 과녁에 적중하면, 그림 9와 같이 게임이 클리어된다.
[참고]
Float형 Type의 값도 한 번 바꾸어보면, 그림 10과 같이 과녁의 체력 감소된 것을 확인할 수 있다. 이는 화면에 보이는 "체력바"만 감소된 것이며, 실제 체력은 감소되지 않았다. 따라서, 실제 체력이 저장된 메모리 주소는 4 Bytes Type이 저장된 메모리 주소로 판단된다.
그림 9와 그림 10에서 보이는 메모리 주소의 차이는 프로그램을 재시작하였기 때문에 발생한다. 이는 윈도우 ASLR(주소 공간 레이아웃 무작위화) 기술 때문에 메모리 주소가 각각 다르게 할당되었기 때문이다.
'3. Reversing & Cryptography > 3.1 CheatEngine' 카테고리의 다른 글
Cheat Engine Tutorial Games #2 (0) | 2024.02.17 |
---|---|
Cheat Engine Tutorial Games #3 (0) | 2024.01.23 |