개요
이전 "치트 엔진을 이용한 정적 메모리 값을 변조하는 방법" 포스팅에 이어서 이번 포스팅에서는 "어썰트 큐브" 게임을 대상으로 내부 동작의 로직을 변조하고 코드를 삽입하는 방법에 대해서 다뤄보도록 하겠다.
실습 준비
[ 치트 엔진 다운로드 ]
[ 어썰트 큐브 다운로드 ]
실습
실습 진행을 위해 어썰트 큐브를 실행하고 봇전으로 진입해준다.
치트 엔진을 실행한 다음 [그림 2]와 같이 "어썰트 큐브" 프로세스에 치트 엔진을 어태치 해준다.
이전 포스팅에서는 캐릭터 HP를 타겟으로 값을 변조했다면 이번 포스팅에서는 [그림 3]과 같이 총알을 대상으로 값을 변조해줬다. 동적 메모리 값 변조 방법은 이전 포스팅을 참고하자.
찾은 총알의 메모리 주소에 마우스 오른 쪽 버튼을 클릭 시 [그림 4]와 같이 팝업 메뉴가 표시되며, "Find out what accesses this address" 버튼을 클릭하면 디버깅 기능을 사용할 수 있게 된다. 해당 기능의 경우 대상의 메모리 주소에 액세스하는 명령어 또는 코드를 찾을 때 사용한다.
[그림 5]와 같이 디버깅 관련 팝업이 출력되면 "Yes" 버튼을 클릭해준다.
디버깅이 되고 있는 상태에서 총알 소진 시 [그림 6]과 같이 "dec" 명령어가 해당 주소로 액세스 된다. 어셈블리 언어에서 dec 명령어는 "decrement"의 약어로, 특정 레지스터나 메모리 위치에 저장된 값을 1만큼 감소시키는 명령어이다. 즉, 해당 명령어는 총알 소비 시 캐릭터의 총알 갯수를 하나씩 줄이기 위해 사용된 것이다.
액세스된 dec 명령어 주소가 선택된 상태에서 "Show disassembler" 버튼을 클릭해준다.
출력되는 Memory Viewer 팝업에서 [그림 8]과 같이 dec 명령어 주소가 선택된 상태에서 상단의 "Tools" -> "Auto Assemble" 버튼을 클릭한다.
Auto assemble 팝업에서 상단의 "Template" -> "AOB Injection" 버튼을 클릭해준다.
그러면 변조하고자 하는 코드가 위치한 메모리 상의 주소를 입력해줘야 하는데 이 경우 [그림 8]에서 따로 지정을 해줬기 때문에 자동으로 주소가 삽입된다. 따라서, [그림 10]과 같이 OK 버튼을 클릭해준다.
여기서도 마찬가지로 따로 값 변경할 필요 없이 "OK" 버튼을 클릭해준다.
[그림 10]에서 지정해준 주소의 어셈블리 코드가 출력되며, 여기서 기존 코드를 변조하거나 새로운 코드를 삽입해주면 된다. 다만, 해당 코드는 메모리에 위치한 실제 코드로 이 곳에서 값을 변경하면 게임이 종료되기 전까지 영구적으로 반영되기 때문에 원본 코드에서 작업 하는 것은 좋지 않다. 따라서, 사용자가 필요 시 로드할 수 있도록 [그림 12] 처럼 상단의 "File" -> "Assign to current cheat table" 버튼을 클릭한다.
그러면 [그림 13]과 같이 메모리 테이블 패널에 "Auto Assemble script"라는 이름의 스크립트가 저장되며, 어셈블리 코드를 변경하여도 원본 코드는 수정되지 않고 변경 이력이 스크립트 파일에 저장되어 필요 시 사용자에 의해 스크립트를 로드하여 사용할 수 있게 된다.
이제 코드 에디터로 돌아와서 코드를 변경하기 전에 [그림 14]를 보면 "newmem", "code", "INJECT" 세 가지 레이블이 있는 것을 볼 수 있다. 각 레이블에는 특정 역할이 할당되어 있는데 "newmem" 레이블은 삽입할 새로운 코드가 위치한 곳이고 "code" 레이블은 기존 코드 영역을 표시하며, "INJECT" 레이블은 registersymbol() 함수에 의해 실행되어 "newmem" 레이블로 점프되어 삽입한 코드가 실행될 수 있도록 한다.
[그림 15]는 총을 쏘면 총알 수가 특정 개수에 고정되도록 수정한 스크립트로, 기존 코드에서 "dec" 명령어를 주석처리하고 "newmem" 레이블에 총알 갯수가 12345개로 고정될 수 있도록 새로운 코드를 추가했다. 참고로 #은 10진수의 상수 값 입력 시 사용된다.
변경한 코드를 저장한 다음 [그림 16]과 같이 메모리 테이블 패널에 추가된 스크립트를 활성화 하고 총을 쏘면 총알이 지정한 갯수로 고정될 것이다.
마무리
이번 포스팅에서는 메모리에 로드된 기존 어셈블리 코드를 수정하거나 새로운 코드를 삽입하는 방법에 대해서 다뤄봤다. 해당 방법의 경우 게임 내부에서 특정 로직을 우회하거나 코드가 실행되지 않도록 할 때 사용되는 방법이며, 실제 게임 핵 제작 시에도 많이 사용되는 방법 중 하나이다. 다음 포스팅에서는 캐릭터의 좌표 값을 추출하는 방법과 이를 변조하여 ESP와 같은 핵을 만드는 방법을 살펴보도록 하겠다.
'안드로이드 기타 > 게임 분석' 카테고리의 다른 글
치트엔진을 안드로이드 디바이스에 연결시키는 방법 (1) | 2023.08.21 |
---|---|
치트 엔진을 이용한 정적 메모리 값을 변조하는 방법 (0) | 2023.08.07 |
치트 엔진을 이용한 동적 메모리 값을 변조하는 방법 (0) | 2023.08.01 |
안드로이드 Assembly-CSharp.dll 덤프 모듈 frida-il2cpp-bridge (0) | 2023.07.18 |