본문으로 바로가기

파일의 IT 블로그

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

[Cheat Engine] 치트엔진 튜토리얼 #4 풀이

· 댓글개 · KRFile

글을 읽기 전에 알고 있으면 좋은 지식

- C언어 지식 (자료형 까지)

- 컴퓨터 소수 표현 방식 (부동소수점)

- 진수 표현

4단계: 부동 소수점(PW=890124)
이전 튜토리얼에서는 bytes를 사용하여 스캔했지만 일부 게임은 소위 '부동 소수점' 표기법으로 정보를 저장합니다

(아마도 단순한 메모리 스캐너가 쉽게 찾는 것을 방지하기 위함일 것입니다)
부동 소수점은 소수점 뒤에 숫자가 있는 값입니다. (예: 5.12 또는 11321.1)

아래에서 체력과 총알을 볼 수 있습니다. 둘 다 부동 소수점 표기법으로 저장되지만 체력은 float로 저장되고 총알은 double로 저장됩니다.
체력을 줄이려면 hit me를 클릭하고 총알을 0.5로 줄이려면 Fire을 클릭하십시오.
 
진행하려면 둘 다 값을 5000 이상으로 설정해야 합니다.

Exact Value 스캔은 여기서 잘 작동하지만 다른 유형으로도 실험해 볼 수 있습니다.

 

반갑습니다. 저번 3번 풀이에 이어서 이번엔 치트엔진 튜토리얼 4번 문제 풀이입니다.

 

이론 설명

이번에도 값 찾기인데요. 메모리 상에서 어디에 체력과 총알이 저장 되어 있는지 찾아야 하는 문제입니다!

다만 이번 값들은 좀 독특한데, 체력과 총알이 정수(interger) 가 아니라 소수로 저장되어 있습니다.

 

컴퓨터는 실제로 실수(소수와 동일한 말) 를 표현할 때 정수와 다르게 표현합니다.

 

이미지 출처 : https://www.youtube.com/watch?v=_b3BlbSI8kM

일반적으로 알다 싶이 컴퓨터는 이진법(0과 1) 을 사용하며, 데이터 표현도 CPU 명령어도 전부 이진법을 사용합니다. 

이 이진법을 사용하면 자리 수만 늘리면 얼마든지 정수를 표현할 수 있습니다.

예를 들어서 1010은 우리가 사용하는 숫자(10진수) 로 10이고, 101010 은 42입니다.

 

이진수로 수 표현시 그냥 숫자만 계속해서 늘리면 정수는 얼마든지 정확히 표현할 수 있습니다.

 

그러나 실수(소수) 의 경우엔 이것이 다른데, 소수는 0~1 사이에 있는 숫자만 생각해도 0.1, 0.01, 0.001 등 무수히 많은 수많가지의 수가 존재합니다. 그리고 이진법을 사용해서는 이 수 많은 소수를 정확히 표현할 수 없어서,

부동 소수점을 사용하게 됩니다. 여기서 부는 한자로 뜰 부 자인데, 영어로는 떠있다, float를 써서 부동 소수점을 floating point 라고 합니다.

 

(아닐 부자를 써서 부동은 움직이지 않다는 뜻이 아닙니다)

 

부동 소수점은 여기선 자세히 설명하진 않겠지만 쉽게 이야기 해서 소수점을 둥 둥 떠다니게 해서, 소수점의 위치를 고정하지 않고 둥둥 바다에 띄어놓듯이 떠있으면서, 소수점의 위치를 움직이면서 소수를 표현한다는 것입니다.

 

당연하지만 소수점을 고정해놓지 않고 움직이면서 표현하기에 컴퓨터는 실제로 정확하게 소수를 표현할 수 없으며, 그 근사치로 표현하게 됩니다. 예를 들어서 0.1을 표현하는데 실제로는 0.1000001 처럼 소수점 몇째 자리부터 오차가 발생하는 것이죠.

 

어쨌던 간에.. 이해가 잘 안가시면 컴퓨터는 정수와 소수를 다르게 표현하고, 정수는 그냥 이진법으로 표현하면 되는데 소수는 부동 소수점이라고 해서 소수점을 움직이는 형태로, 소수점을 둥둥 띄어놓는 형태(float) 로 표현한다!

또한 컴퓨터는 완전 정확히 소수를 표현할 수 없고 오차가 존재한다! 정도만 이해하시면 되겠습니다.

 

앞에서 문제를 풀어보셨듯이 치트엔진에서 정수를 검색하는 옵션은 ~~ Bytes 였습니다. 

컴퓨터가 정수와 소수를 다루는 방식이 다르기 때문에 소수를 검색하는 옵션은 따로 있습니다.

치트엔진에서 소수를 검색하는 옵션(Value Type) 은 Float와 Double 입니다.

 

이 float와 double 역시 C언어에서 자료형(Data Type) 을 배우셨다면 익숙하실겁니다..

아까도 보셨다 싶이 컴퓨터는 소수점 특정 자리에서 오차가 존재하며, C언어를 기준으로 float는 소수점 7자리, double은 그 2배인 15~16자리 까지 정확히 표현 가능하며 그 소수점 이상 자리부턴 오차가 존재합니다.

* 말그대로 double(2배) 입니다!

 

어쨌던 간에 머리가 아프시면 그냥 치트엔진에서 소수점 검색할 땐 float나 double을 쓴다~

float는 4바이트 크기로 소수점을 표현하는거고, double은 그 2배 정밀도로 더 큰 범위의 소수를 표현할 수 있다!

정도만 이해해주시면 되겠습니다.

 

일반적으로 컴퓨터 프로그래밍을 할 땐 float보다는 double을 많이 쓰게 됩니다. double이 float보다 메모리 크기를 많이 잡아먹으나 정밀도도 float의 2배고 표현 범위도 훨씬 넓기 때문에 double을 사용하는게 권장 사항입니다. 적어도 C언어 프로그래밍 할때는요. 물론 메모리 공간이 부족한 곳에선 float를 사용하기도 합니다.

 

일단은 튜토리얼에선 친절하게 이 값이 float인지 double인지 고민할 필요 없이 Health는 float고 Ammo는 double이라고 알려주었습니다. 다만 실전에서 값을 찾아보기 위해선 내가 찾는 값이 소수인지 의심되면 float도 해보고 안나오면 double도 해봐야 합니다.. 

 

이전 튜토리얼에선 정수값은 일반적으로 윈도우 프로그램 기준으로 4바이트 검색을 권장해줬지만 소수는 어떤 값이 권장인지 알려주지 않고 있네요. 이건 아마 많이 해봐야 알 거 같습니다.

 

Solution

위에서 배운 이론을 기반으로 문제 풀이를 진행해봅시다.

사실 부동소수점이건~ 표현 범위건 이해 못하고 그냥 소수는 float나 double로 검색한다 정도만 이해해도 값을 찾는데 문제 없습니다.

 

일단 이번엔 체력값(Health)과 총알값(Ammo)이 눈에 보이고 있어서 정확한 값 모드인 Exact Value로 검색하면 되겠고, Health는 float로 Ammo는 double 타입으로 검색하면 되겠네요.

 

먼저 float 타입인 체력을 먼저 찾겠습니다. Exact Value 로 100을 입력하고 검색해봅시다.

물론 우리가 눈에 보이긴 100이여도 실제로 컴퓨터가 저장하기론 100.00000xx 와 같은 형태로 저장되고 있을겁니다.

 

float니깐 7번째부터 오차가 발생하고 있겠죠. 그래서 당연하지만 100과 100.00000xx는 다르니깐 정수 100을 검색하면 값을 찾을 수 없을겁니다. 치트엔진 개발자도 당연히 이를 알고 있는지 오른쪽에 Rounded(반올림) 옵션이 보이는데 아마 값을 찾아줄때 적당한 자리에서 반올림을 해주는걸로 보입니다.

extreme 과 default 가 있는데 이 2개의 차이는 저도 잘 모르겠습니다 ㅠㅠ. 여기까지 파본적은 없어서요. 어쨌던 그냥 기본값으로 맞추고 검색하면 웬만해선 잘 찾았던 거 같습니다.

 

검색을 해보면 이번엔 4개밖에 뜨지 않습니다.

 

다시 Hit me를 눌러서 값을 변화시키고 치트엔진을 살펴보면 빨간색으로 변화한 값이 딱 하나 보이는데 019C1640 입니다. 저게 Health 값이군요. 일단은 찾았습니다.

 

밑 Table에 주소를 등록해 두고 Description 바로 아랫부분을 더블클릭해서 찾아놓은 메모리 주소와 값에 대해 이름을 매길 수 있습니다. Health라고 바꿔주었습니다.

 

다시 새로운 총알값(Ammo) 을 찾기 위해 New Scan을 눌러서 초기화 해주고 Double 타입으로 맞춘 뒤 Exact value로 100을 검색합니다.

 

이번에도 값이 3개 보이네요. 아마 실행중이신 환경에 따라 저 갯수는 다르게 나타날겁니다. 저 RTSS란건 제가 Riva Tuner라는 프로그램을 사용중이라 나오는 거 같구요..

어쨌던 간에 저 초록색값이 아니라 019.. 어쩌고가 아무래도 Ammo 값인 거 같습니다.

 

일반 주소와 다르게 초록색으로 나타나는 주소가 궁금하신 분들이 많을탠데, 초록색으로 나타나는 주소값들은 바뀌지 않는다는 뜻입니다. 프로그램을 실행시 매번 RAM위에 올려서 새로 실행하게 되어 대부분의 값들은 주소값이 변경되서 저장되는데, 저렇게 초록색으로 보이는 것들은 프로그램을 재실행해도 매번 저 주소 위치에 올라옵니다.
Tutorial-i386.exe+1E5380 의 경우 치트엔진이 분석해낸 것인데 튜토리얼 프로그램의 실행 위치 + 1E5380 주소 위치는 고정이라는 겁니다. 치트엔진 튜토리얼 실행시 언제나 정적으로 Tutorial-i386.exe+1E5380 라는 주소 위치의 값은 항상 100입니다. 물론 여기서 Ammo 값이 저 초록색 값은 아니라서 무시해도 됩니다.

 

바꿔보니깐 맞네요.

 

등록하고 이름은 Ammo 로 바꿔줍니다.

문제에서 요구한 것이 둘다 값을 5000 이상으로 바꾸는 겁니다. Value쪽 부분을 더블클릭 해서 각각 5000으로 수정해줍시다.

 

Good 해결되었습니다. Health 값이 깎여있는건 값이 바뀌는걸 보여드리도록 한번 Hit me를 클릭해서 그렇습니다.

 

출처

https://ahnjg.tistory.com/16

컴퓨터는 실수를 정확히 표현할 수 없다.

https://devlog-wjdrbs96.tistory.com/254

유효자릿수가 뜻하는 것은 정밀도를 뜻합니다. 즉, 몇자리 까지 오차없이 표현할 수 있는가입니다. float은 7자리, double은 15~16자리 까지 표현할 수 있습니다.

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

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