개요


Cheat Engine 사용법을 통해, 프로그램 클라이언트에 대한 분석하는 패턴들을 정리 합니다.

 

개념 정리


Cheat Engine 이란?

Cheat Engine은 게임 해킹 및 메모리 변조에 자주 사용되는 소프트웨어 도구입니다. 사용자가 게임 메모리 내의 변수 값을 조작할 수 있도록 설계되어 무한 체력, 무제한 탄약 또는 속도 증가와 같은 다양한 치트 기능이 발생할 수 있습니다.

Cheat Engine은 특정 값이나 변수에 대한 게임 메모리를 스캔하여 작동하며, 그런 다음 원하는 효과를 생성하기 위해 변경하거나 동결할 수 있습니다. 또한 치트 기능을 자동화하고 사용자가 쉽게 액세스할 수 있도록 하는 프로그램인 트레이너를 만드는 데 사용할 수 있습니다.

 

Memory Scan을 통한 원하는 주소값 찾는 패턴

서버가 없이 클라이언트만 있는 프로그램일 경우, 아래의 방법을 통해 원하는 값들을 비교적 쉽게 찾아낼 수 있다.

 

(Case 1) 숫자로 표시되는 정수 메모리값 검색하기

  • 'Scan Type' 에서 'Exact Type'(정확한 수치 찾기) 선택
  • 적절한 'Value Type'을 예상에서 설정
  • First Scan & 값 변경 & Next Scan
  • 적절한 후보 Address 선택 후, 테스트
'Value Type' 이 뭐냐면, 컴퓨터에는 비트, 바이트, 실수, 정수 등 여러 가지 종류가 있습니다. 
숫자를 찾는 것은 대부분 정수입니다. 
정수는 Byte/2Bytes/4Bytes/8Bytes 등으로 대부분이 표현됩니다. 
컴퓨터에서 1바이트를 8비트라고 하는데, 여기서 2의 비트승만큼 곱합니다.
1바이트는 8비트니까 2의 8승이네요. 그럼 256입니다.
2바이트는 16비트니까 2의 16승은 65536 입니다.
게임을 만들건 프로그램을 만들건 모두 메모리가 소모됩니다.
이 메모리를 최대한 줄이기 위해서 모든 숫자 하나하나에 제약이 있다는 거죠.
최대 체력 HP가 100이 최대라면 게임 제작자들은 HP 라는 수치를 얼마만큼 메모리 할당을 하냐면 이 정도 수치는 1바이트만으로 충분하다고 판단할 것입니다.
1바이트로 0-255 까지 표현이 가능하니까요. 2바이트라면 0-65535 까지 표현이 가능하고요.
메모리가 소요될수록 수치 표현이 커지고, 작을수록 수치 표현을 적게 합니다.

'Value Type' 이 달라도 찾을 수는 있지만, 찾는 시간과 찾을 확률이 확실히 달라집니다.

검색하는 수치는 게임에서 찾아야할 내용의 수치는 변경이 되지 않도록 주의합니다.

주소값만 보시면 2개는 주소값이 비슷하고, 1개는 떨어져 있습니다.
게임의 경우 보통 2개의 주소값이 붙어 있는 값이 유력한 편입니다.
경험상으로 하나는 게임에 표시되는 수치이고, 하나는 실제로 게임에서 기억하고 있는 수치입니다.

 

(Case 2) 서버 없이 클라이언트만 있는 프로그램일 경우, 게이지로 표시되는 정수 메모리값 검색하기

  • 'Scan Type' 에서 'Unknown initial value'(모르는 수치 찾기) 선택
  • 적절한 'Value Type'을 예상에서 설정
  • 'Scan Type' 을 'Decreased Value' 를 선택
    (일단 일반적으로 생각해서 값이 줄어드는 것처럼 보이면, Decreased Value로 선택)

* Scan type 종류

  • Exact value = 현재 기억하고 있는 값중에서 Value 에 적힌 값을 찾는다.
  • Bigger than.. = 현재 기억하고 있는 값중에서 Value 값보다 큰 값을 찾는다.
  • Smaller than.. = 현재 기억하고 있는 값중에서 Value 값보다 작은 값을 찾는다.
  • Increased value = 현재 기억하고 있는 값중에서 높아진 값만 찾는다.
  • Increased value by.. = 현재 기억하고 있는 값중에서 Value 값만큼 높아진 것만 찾는다.
  • Decreased value  = 현재 기억하고 있는 값중에서 낮아진 값만 찾는다.
  • Decreased value by.. = 현재 기억하고 있는 값중에서 Value 값만큼 낮아진 것만 찾는다.
  • Change value = 현재 기억하고 있는 값중에서 변한 값만 찾는다.
  • Unchange value = 현재 기억하고 있는 값중에서 변하지 않은 값만 찾는다.
  • Value between.. = 현재 기억하고 있는 값중에서 두 Value 사이의 값만 찾는다.
  • Same as first scan = ?

 

'Unknown initial value' 방식은 현재 게임내 모든 메모리에 데이터를 찾고 기억합니다. 
게임내 모든 메모리 내에서 이므로 자신의 컴퓨터 사양에 따라 찾는 시간이 매우 달라집니다. 
저사양이신 분은 다른 작업은 자제(?)좀 하셔야 합니다.

'Scan Type' 을 'Decreased Value' 를 선택합니다. 
'Decreased Value'는 기존에 기억하고 있는 수치보다 더 값이 낮아진 것만 찾는 것입니다. 
이렇게 수치가 안 보일 때는 게임내에서 최저한 여러 가지 값이 변하지 않도록 해야 찾기가 수월해집니다. 
게임을 잠깐한 것과, 게임을 한참하고 찾는 것과 어느 것이 게임내 메모리 값들의 변동이 적을까요? 
당연히 잠깐 하는 경우가 더 적습니다. 
에너지만 줄이고 잽싸게 찾으면 나머지 값은 변하지 않거나 올라간 값을 제외하고 찾기 때문에 그 양이 줄어듭니다.

 

* Cheat Engine Scan Option

  • Memory Scan Option 은 웬만해선 쓸 일이 없습니다. 내가 알기로는.. 특수한 경우만 씁니다.
  • Value 옆에 Hex 는 16진수로 입력시 체크해주면 됩니다.
  • Add address manually 는 자신이 직접 주소와 값을 입력하는 버튼입니다.
  • Undo Scan 은 기존 상태로 한번 되돌립니다(스캔을 잘못한 경우 유용)

 

(Case 3) 서버 없이 클라이언트만 있는 프로그램일 경우, 숫자가 아닌 메모리값 검색하기

  • 먼저 눈에 보이는 (체력, 마력) 정수값들을 찾는다.
  • 'Memory Scan Options'에서 이미 알고 있는 정수값 주소를 기준으로, 메모리 스캔 범위를 지정한다.
  • 'Scan Type' 에서 'Unknown initial value'(모르는 수치 찾기) 선택
  • 적절한 'Value Type'을 예상에서 설정(boolean 값일 경우로 예상되면 1Byte)
  • boolean에 해당하는 Action(먹는다/안먹는다) 후 'Scan Type' 을 'Changed Value' 를 선택
  • 클라이언트 리셋 후 다시 처음 시작해서 게임 정지 후 다시 검색
에디트를 쓰다 보면서 느끼는 거지만, 화면상에 있는 숫자들은 하나같이 거의 붙어 있다고 볼 수 있습니다.
보이는 체력 / 마력 수치도 그렇죠. 일정하게 4 단위로 있다고 보시면 됩니다.

이런 전제 하에, 숫자로 스킬도 찾아낸 주소 근처 쯤에 있을 것입니다.'Memory Scan Options' 부분에 검색 범위를 바꾸었습니다.
밑의 체력 마력 외에는 사실 많이 가지고 있지도 않으니 저 부근에서 검색하기로 하고, 02031C00 부터 02033000 까지 검색을 설정하였습니다.
1P 와 2P 검색된 아이템 값 전제 하에 어느 정도 두고 검색을 하는 것입니다.
일단은 눈에 보이는 것이 아니기 때문에 'Scan Type' 은 'Unknown initial value' 을 선택하고, 'Value Type' 은 어차피 먹었다/안먹었다 둘 중 하나만 표현할 거라 생각해서 1바이트로 선택했습니다.
바이트가 차지하는 숫자 범위를 모르시면 포스트 강좌 처음에 적어놨습니다(2를 바이트x8 의 수만큼 제곱하시면 됩니다).

찾는 방법은 말씀드리지만 여러가지를 응용하셔야 빨리 찾을 수 있습니다. 한가지 더 설명드리자면, 자신이 찾은 HP 나 MP는 02031xxx 주소로 시작합니다. 그럼 그 주소대가 몇개나 있을까요? 위의 화면을 보니 찾은 결과에는 6개가 보입니다

원하는 주소값을 찾았을 경우, 관련된 인접 주소를 찾기 위해 + 4 / -4 씩 더해가면서 테스트해본다.

 

출처


1. https://blog.naver.com/saipe/50040942439

2. https://blog.naver.com/saipe/50040949197

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기