naroSEC
article thumbnail

개요

 

치트 엔진을 이용한 정적 메모리 값을 변조하는 방법

개요 치트 엔진을 이용한 동적 메모리 값을 변조하는 방법 개요 게임 관련 애플리케이션을 대상으로 코드 분석 및 변조 시 가장 많이 활용되는 도구를 뽑으라고 한다면 치트 엔진(Cheat Engine)이

naro-security.tistory.com

이전 "치트 엔진을 이용한 정적 메모리 값을 변조하는 방법" 포스팅에 이어서 이번 포스팅에서는 "어썰트 큐브" 게임을 대상으로 내부 동작의 로직을 변조하고 코드를 삽입하는 방법에 대해서 다뤄보도록 하겠다.


실습 준비

[ 치트 엔진 다운로드 ]

 

Cheat Engine

Cheat Engine Trouble installing/running Cheat Engine? Check out the known github issue here on how to solve it, or join the cheat engine patreon Read before download: You must be 18 years or older, or deemed an adult, to install Cheat Engine. Cheat engine

www.cheatengine.org

[ 어썰트 큐브 다운로드 ]

 

AssaultCube

What is AssaultCube? AssaultCube is a FREE, multiplayer, first-person shooter game, based on the CUBE engine. Taking place in realistic environments, with fast, arcade gameplay, it's addictive and fun! With efficient bandwidth usage, it's low-latency and c

assault.cubers.net


실습

실습 진행을 위해 어썰트 큐브를 실행하고 봇전으로 진입해준다.

[그림 1]

치트 엔진을 실행한 다음 [그림 2]와 같이 "어썰트 큐브" 프로세스에 치트 엔진을 어태치 해준다.

[그림 2]

이전 포스팅에서는 캐릭터 HP를 타겟으로 값을 변조했다면 이번 포스팅에서는 [그림 3]과 같이 총알을 대상으로 값을 변조해줬다. 동적 메모리 값 변조 방법은 이전 포스팅을 참고하자.

[그림 3]

찾은 총알의 메모리 주소에 마우스 오른 쪽 버튼을 클릭 시 [그림 4]와 같이 팝업 메뉴가 표시되며, "Find out what accesses this address" 버튼을 클릭하면 디버깅 기능을 사용할 수 있게 된다. 해당 기능의 경우 대상의 메모리 주소에 액세스하는 명령어 또는 코드를 찾을 때 사용한다.

[그림 4]

[그림 5]와 같이 디버깅 관련 팝업이 출력되면 "Yes" 버튼을 클릭해준다.

[그림 5]

디버깅이 되고 있는 상태에서 총알 소진 시 [그림 6]과 같이 "dec" 명령어가 해당 주소로 액세스 된다. 어셈블리 언어에서 dec 명령어는 "decrement"의 약어로, 특정 레지스터나 메모리 위치에 저장된 값을 1만큼 감소시키는 명령어이다. 즉, 해당 명령어는 총알 소비 시 캐릭터의 총알 갯수를 하나씩 줄이기 위해 사용된 것이다.

[그림 6]

액세스된 dec 명령어 주소가 선택된 상태에서 "Show disassembler" 버튼을 클릭해준다.

[그림 7]

출력되는 Memory Viewer 팝업에서 [그림 8]과 같이 dec 명령어 주소가 선택된 상태에서 상단의 "Tools" -> "Auto Assemble" 버튼을 클릭한다.

[그림 8]

Auto assemble 팝업에서 상단의 "Template" -> "AOB Injection" 버튼을 클릭해준다.

[그림 9]

그러면 변조하고자 하는 코드가 위치한 메모리 상의 주소를 입력해줘야 하는데 이 경우 [그림 8]에서 따로 지정을 해줬기 때문에 자동으로 주소가 삽입된다. 따라서, [그림 10]과 같이 OK 버튼을 클릭해준다.

[그림 10]

여기서도 마찬가지로 따로 값 변경할 필요 없이 "OK" 버튼을 클릭해준다.

[그림 11]

[그림 10]에서 지정해준 주소의 어셈블리 코드가 출력되며, 여기서 기존 코드를 변조하거나 새로운 코드를 삽입해주면 된다. 다만, 해당 코드는 메모리에 위치한 실제 코드로 이 곳에서 값을 변경하면 게임이 종료되기 전까지 영구적으로 반영되기 때문에 원본 코드에서 작업 하는 것은 좋지 않다. 따라서, 사용자가 필요 시 로드할 수 있도록 [그림 12] 처럼 상단의 "File" -> "Assign to current cheat table" 버튼을 클릭한다.

[그림 12]

그러면 [그림 13]과 같이 메모리 테이블 패널에 "Auto Assemble script"라는 이름의 스크립트가 저장되며, 어셈블리 코드를 변경하여도 원본 코드는 수정되지 않고 변경 이력이 스크립트 파일에 저장되어 필요 시 사용자에 의해 스크립트를 로드하여 사용할 수 있게 된다.

[그림 13]

이제 코드 에디터로 돌아와서 코드를 변경하기 전에 [그림 14]를 보면 "newmem", "code", "INJECT" 세 가지 레이블이 있는 것을 볼 수 있다. 각 레이블에는 특정 역할이 할당되어 있는데 "newmem" 레이블은 삽입할 새로운 코드가 위치한 곳이고 "code" 레이블은 기존 코드 영역을 표시하며, "INJECT" 레이블은  registersymbol() 함수에 의해 실행되어 "newmem" 레이블로 점프되어 삽입한 코드가 실행될 수 있도록 한다.

[그림 14]

[그림 15]는 총을 쏘면 총알 수가 특정 개수에 고정되도록 수정한 스크립트로, 기존 코드에서 "dec" 명령어를 주석처리하고 "newmem" 레이블에 총알 갯수가 12345개로 고정될 수 있도록 새로운 코드를 추가했다. 참고로 #은 10진수의 상수 값 입력 시 사용된다.

[그림 15]

변경한 코드를 저장한 다음 [그림 16]과 같이 메모리 테이블 패널에 추가된 스크립트를 활성화 하고 총을 쏘면 총알이 지정한 갯수로 고정될 것이다.

[그림 16]


마무리

이번 포스팅에서는 메모리에 로드된 기존 어셈블리 코드를 수정하거나 새로운 코드를 삽입하는 방법에 대해서 다뤄봤다. 해당 방법의 경우 게임 내부에서 특정 로직을 우회하거나 코드가 실행되지 않도록 할 때 사용되는 방법이며, 실제 게임 핵 제작 시에도 많이 사용되는 방법 중 하나이다. 다음 포스팅에서는 캐릭터의 좌표 값을 추출하는 방법과 이를 변조하여 ESP와 같은 핵을 만드는 방법을 살펴보도록 하겠다.

profile

naroSEC

@naroSEC

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...