반응형

치트 엔진으로 게임에서 수정하고 싶은 값의 주소를 찾아도 게임을 다시 실행시키면 그 주소가 변경되어 처음부터 다시 진행해야만 하는 경우가 있다.(포인터 등으로 해결 불가) 예를 들어 도스박스로 고전 게임을 실행시키는 경우 값의 주소가 변경될 뿐만 아니라 그 값을 기록하는 명령이 다른 여러 주소에 접근하기 때문에 쉽게 에디터를 만들 수가 없다.

 

※ 참고:

2023.01.01 - [Reverse Engineering] - Cheat Engine AOB Injection with DosBox - 치트 엔진 코드 인젝션 도스박스

 

Rick Dangerous 2 게임을 실행하고 번개를 사용해 수치를 변화 시킨다.

 

번개 수치가 저장된 주소를 파악한다.

 

어떤 명령이 번개 수치를 변화 시키는지 확인한다.

 

번개 수치를 변경하는 명령이 접근하는 다른 주소들을 확인한다. 도스박스에서는 굉장히 많은 주소에 접근한다. 그래서 그 명령을 함부로 수정할 수 없다.

 

 

번개 수치 변경 명령을 메모리 뷰어에서 확인하고 AOB Injection을 준비한다.

 

어셈블리 코드를 작성하고 주소 리스트 창에 저장한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[ENABLE]
 
aobscanmodule(INJECT,DOSBox.exe,66 89 34 18 8B 5C 24 14) // should be unique
alloc(newmem,$1000)
globalalloc(editor, 4) // Thunder 주소 저장을 위한 4 바이트 메모리 할당
 
label(code)
label(return)
 
newmem:
  cmp [eax+ebx+61], 'JOHN' // [Thunder 주소+61]에 'JOHN' 문자열이 있다
  jne code          // Thunder 값이 저장된 장소가 아니면 원래 코드 실행
  push edx          // eax+ebx 값을 저장하기 위해 edx 사용
  xor edx, edx      // edx 초기화
  mov edx, eax
  add edx, ebx
  mov [editor], edx // editor 심볼에 Thunder 주소 저장
  mov [eax+ebx], si // 원래 코드 실행
  mov ebx, [esp+14]
  pop edx           // 원래 edx 값 복구
  jmp return
 
code: // 원래 코드
  mov [eax+ebx],si
  mov ebx,[esp+14]
  jmp return
 
INJECT:
  jmp newmem
  nop 3
return:
registersymbol(INJECT)
 
[DISABLE]
 
INJECT:
  db 66 89 34 18 8B 5C 24 14
 
unregistersymbol(INJECT)
dealloc(newmem)
dealloc(editor)         // 6바이트 메모리 해제
 

 

 

번개 수치 주소를 생성한다.

주소 리스트 창에서 위와 같이 번개 수치가 저장된 주소를 스크립트의 [심볼(editor)+offset] 방식으로 생성한다. 아래 폭탄과 생명도 동일한 방법으로 진행한다.

 

 

폭탄 수치 주소를 생성한다.

 

생명 수치 주소를 생성한다.

 

위에서 작업한 내용이 주소 리스트 창에 저장되었다. 스크립트를 실행하고 번개를 한 번 사용하면 각각의 수치들이 정확히 반영된다.

 

도스박스와 게임을 다시 실행하면 모든 주소가 변경되어 엉뚱한 값이 대입 된다.

 

 

다시 스크립트를 실행하고 번개를 한 번 사용하면 모든 값들이 제대로 반영된다.

 

치트 테이블을 저장하면 언제든 다시 스크립트와 모든 수치를 간단히 수정할 수 있다.

 

반응형
Posted by J-sean
: