4. 치엔 게임 튜토리얼 Step 2
본문 바로가기
Reversing & Cheat Engine

4. 치엔 게임 튜토리얼 Step 2

by boosting 2024. 2. 19.
728x90

[이전글] - 3. 치엔 튜토리얼 Step 1

1. 전 글과 똑같이 엔진과 튜토리얼 프로그램 실행을 해둡시다.

이전 글대로 따라 하셔서 클리어를 하시고 프로그램을 껐다가 킨 경우라면
 Level 1과 Level 2를 선택하라는 문구가 나옵니다. Level 2 에다가 조준해서 타깃을 부숴줍시다.
 

튜토리얼 2-1

 
이번에도 요구하는 사항을 읽어봅시다.
이 두 개의 적은 나보다 체력이 많고 더 많은 피해를 준다고 합니다.
Step 1과 마찬가지로 부수라는 말이네요.
그리고 Tip이라고 되어있는 곳엔 적과 나는 연관이 있다고 합니다.
 
우선 Step 1 때처럼 기본적인 동작을 해봅시다.
제가 상대방 타깃을 향해 총 1발을 쏘면 상대는 나에게 2발을 쏘는 그런 구조인 거네요.
맞으면 체력이 4씩 떨어지는 것을 확인할 수 있었습니다.
그럼 적의 탄 1대를 맞았을 때 2씩인 것도 자연스레 확인이 됩니다.
 

2. 어떤 해결 방안이 있는지 생각해 봅시다.

우선 프로그램 동작할 때 보이는 현상을 봅시다.
 

1. 플레이어가 탄창 1발을 쏘면 2개의 적은 나에게 탄창 1발씩을 쏜다.
2. 적에게 탄창 발사 후 플레이어는 움직일 수 있다.
3. 적은 움직이지 않는다.
4. 플레이어는 한 탄창 맞았을 때 체력이 2가 소모가 된다. (2개 = 4)
5. 플레이어가 적을 맞추면 적 체력 소모는 된다.

 
대충 보이는 현상은 이 정도로 보입니다.
그러면 이것들을 토대로 해결할만한 방안이 있는지 봅시다.
 
1. 플레이어가 탄창을 쏠 때 적은 나를 향해 탄창을 쏘지 않게 한다.
2,3 번은 해결 방안이랑 크게 연관고리가 없는 듯합니다.
4. 플레이어가 탄창 맞았을 때 체력이 소모가 안 되게끔 한다.
5. 적 체력 소모 관련으로 건드려본다.
 
당장 생각나는 방법은 이 3가지입니다만 바로 시도해 볼 수 있는 것은 4번인 거 같습니다.
4번으로 우선 시도를 해보겠습니다.
 

3-1. 첫 번째 시도

이전 영상때 해보셨으리라 생각하고 일일이 스샷은 안 넣겠습니다.
우선 처음 체력인 100에서 First Scan 하시고 1발 쏘고 체력이 96 된 이후 Next Scan을 해보죠.
 

튜토리얼 2-2

 
우선 나의 체력인 96의 Value를 담은 주소가 바로 나왔습니다.
이를 내려서 100으로 고정을 해보고 적을 맞춰보도록 하죠.
 

튜토리얼 2-3

 
스페이스바를 엄청나게 눌러서 1마리를 잡았더니, 어떤 이상한 문구가 뜹니다.
 

튜토리얼 2-4

 
이 행위에 대한 대가를 지불한다고 하고 메가봄브를 활성화한다고 합니다.
그다음 남은 적에게 탄창을 쏘니 지는 강화된 탄창을 쏘는군요.
체력 고정도 소용없이 -1로 만들어버리고 시간 좀 지나면 원래대로 돌아갑니다.
즉 플레이어 체력을 건드리는 것으로는 해결할 수 없다는 뜻이겠네요.
 

3-2. 두 번째 시도

나의 체력이 아닌 상대 체력을 찾아봅시다.
Step 1 때처럼 둘 다 체력이 정상일 때 타입을 Unknown initial value로 스캔해 놓으시고
상대 타깃을 맞추고 타입을 Decreased value 교체 후 재스캔 , 1번 더 맞추고 재스캔 후
상대 타깃을 맞추지 말고 타입을 Unchanged value로 교체하여 재스캔 하시면 주소가 추려집니다.
 

튜토리얼 2-5

 
체력이 100이 아닌 200이 기본 설정인가 봐요.
플레이어는 탄창 1개당 체력 2를 소모하는데 적은 체력 1을 소모하는 모양입니다.
그러면 적 체력을 바꿔보고 쏴볼게요.
 
해보셨으면 아시겠지면 결과는 1번과 같았습니다.
남은 1개의 적이 또 강화가 되어 못 깼습니다.
 

3-3. 세 번째 시도

1마리가 계속 남는다고 했으니 2마리의 체력을 한 번에 찾아보죠.
우선 1마리의 체력이 200인걸 위의 결과로 알아냈기 때문에 200을 스캔하시고
적에게 각각 1대씩 때리고 199로 Next Scan을 해보죠.
 

튜토리얼 2-6

 
이렇게 보니까 저 2개의 주소가 각 적의 체력을 나타내는 걸로 보입니다.
그러면 둘 다 1로 설정하고 두 마리에게 한 발씩 쏴보죠.
그렇게 했을 경우 또 실패할 것입니다.
 
이러면 이제 단순 수치를 조절하는 것만으로는 해결이 힘든 상황이라는 것을 알 수 있습니다.
이제 Debugging이라는 스킬을 사용할 때가 되었습니다.
 

4. Debugging

Debug 라 함은 보통 De + Bug 라 해서 벌레 얘긴가 싶을 수도 있지만
컴퓨터 계열에서는 말 그대로 버그를 잡는다라고 보시면 됩니다.
그러면 이 기술을 어디에다 쓸 것이냐.. 맨 처음 시도했던 플레이어 체력 쪽에
써보도록 하죠.
 

튜토리얼 2-7

 
아까처럼 플레이어 체력값을 찾으시고 저 주소에 좌클릭하고 Ctrl + B를 누르면 뭔가 하나 더 뜰 겁니다.
상단과 하단으로 나뉘어있는데 상단은 잠시 넘기시고 하단 쪽을 봐주세요.
 

튜토리얼 2-8

 
58이라 써져 있는 수치는 16진수로 표기돼 있는 것이고 이는 우리가 잘 아는 10진수로는 88입니다.
고로 현 플레이어의 체력 수치이죠. 여기서 마우스 우클릭 하시면
 

튜토리얼 2-9

 
Data Breakpoint -> Find out what accesses this address를 클릭해 주세요.
그러면 Find out 이 2개가 있는데 이 2개는 각각 무슨 차이인지 궁금할 수 있습니다.
 

accesses this address = 직접적으로 주소의 Value의 변경에는 영향 없지만 Read 하는 곳도 찾아낸다.
writes this address = 직접적으로 주소의 Value 변경에 관여하는 곳을 찾아낸다.

 
이게 차이인데, 어차피 체력 떨어지는 것에 관여하는 곳을 살펴보기 위함이니
어떤 것을 하셔도 상관은 없습니다. 누르셨으면 어떤 창이 또 뜰 것입니다.
뜨고 난 뒤에 플레이어의 체력을 깎아주세요.
 

튜토리얼 2-10

 
깎고 나시면 밑에 이상한 2개가 떴을 것입니다.
sub [rax+60], edx라고 하는 곳을 누르신 후 우측에 Show disassembler를 눌러주세요.
그러면 다음과 같이 보이실 겁니다.
 

튜토리얼 2-11

 
sub [rax+60], edx
무슨 이상한 영어와 숫자가 섞인 게 떴습니다. 이를 어셈블리 명령어라고 보시면 되고
명령어가 하도 많아서 다음 편에 간단하게 자주 쓰는 명령어는 다뤄볼 텐데
이 외 궁금한 명령어들은 구글링으로 직접 찾아보시고 아 이런 게 있구나라고 넘어가시면 됩니다.
 
우선 저 명령어를 해석해 보자면 sub => subtract에서 유래
즉, sub라는 명령어는 빼기를 의미한다고 보면 됩니다.
그럼 뭐와 뭐를 빼는 거냐면 sub A, B라고 할 때 A에서 B를 뺀다고 보시면 됩니다.
즉 sub [rax+60], edx 라 함은 [rax+60]에서 edx를 빼라 라는 의미로 이해를 하시면 되죠.
그러면 [ ]는 뭔데 라는 궁금증이 생깁니다.
 
아까 튜토리얼 2-10에서 sub [rax+6], edx에 좌클릭을 해두시면 밑에 빈칸에 
 

gtutorial-x86_64.exe+400E3:
1000400 DE - 00 00  - add [rax], al
1000400 E0 - 48 89 C8  - mov rax, rcx
1000400 E3 - 29 50 60  - sub [rax+60], edx <<
1000400 E6 - C3 - ret 
 

라고 써져 있는 걸 보실 수 있을 텐데 밑으로 좀 내리면 보이실 겁니다.
 

RAX=00000000015E9890
RBX=0000000001624820
RCX=00000000015E9890
RDX=0000000000000002

 
이렇게 되어있습니다. 아마 보시는 분들마다 주소는 다르실 거예요.
그러면 이것을 참고해서 해석을 하게 되면
 

sub [15E9890+60],2 // [ ]는 저 계산한 주소에 담겨있는 Value를 의미
sub [015E98F0],2 // 튜토리얼 2-8을 보시면 이 주소는 플레이어의 체력이 담겨있는 주소

 
그러니까 쉽게 말하면 현 플레이어의 체력에서 2를 빼라는 의미가 됩니다.
탄창 맞았을 때 발생하는 현상이었죠.
 
그러면 이 sub를 더한다는 명령어인 add로 바꿔볼까요?
적을 때리든 내 체력은 계속 늘어날 것이고 죽지 않겠죠.
튜토리얼 2-11에서 저 명령어에 더블클릭을 하면 수정을 할 수 있습니다.
sub를 add로 바꿔주시고 Ok를 눌러주시고 적을 쏴보죠.
 
 

튜토리얼 2-12

 
이럴 수가..
내 체력도 늘어나지만 적의 체력도 덩달아 늘어나는 걸 볼 수 있습니다.
아 이러면 이제 이해가 되는군요.
 
맨 처음 '적과 나는 연관이 있다'라는 팁 기억이 나실까요?
그러니까 이 명령어는 나에게도 해당하지만 적에게도 해당한다.라는 말이 됩니다.
그러면 나에게는 적용이 되게끔 하면서 적에게는 적용이 안되게끔 하는 식으로
해결을 하면 이 튜토리얼을 클리어할 수 있을 것으로 보입니다.
 

튜토리얼 2-13

 
이렇게 아까 그 명령어에 좌클릭 하신 후 F5를 눌러주시면 이렇게 초록색이 될 겁니다.
이 상태로 적을 맞추지 말고 허공에다가 발사를 해봅시다.
 

튜토리얼 2-14

 
이런 식으로 프로그램이 멈추면서 우측 상하단에 이상한 것들이 쭈르륵 떴습니다.
이게 뭐냐면 이 명령어를 지나갈 때 Cheat Engine이 멈추게 한 후 그 상황에서의 상태를
보여주고 있는 거라고 이해하시면 될 것 같습니다.
 

sub [15E9890+60],2 // [ ]는 저 계산한 주소에 담겨있는 Value를 의미
sub [015E98F0],2 // 튜토리얼 2-8을 보시면 이 주소는 플레이어의 체력이 담겨있는 주소
 

아까 15E9890+60 은 플레이어의 체력이 담겨있는 주소라고 했습니다.
지금 튜토리얼 2-14에서 rax에 담겨있는 주소를 봐주세요. 015E9890 입니다.
그러면 지금 걸린 상태가 플레이어의 체력에 관여하기 위해서 명령어를 수행 중인 것으로
볼 수 있는 것입니다. 이때 Return Address에서 맨 위를 더블클릭 해주세요.
 

튜토리얼 2-15

 
그러면 이렇게 그 주소로 이동을 한 모습을 볼 수 있습니다.
이 위의 call gtutorial-x86_64.exe+400E0라고 되어 있는 곳은 저희가 맨 처음 봤던 명령어가 있는 곳입니다.
call이라는 명령어는 안의 명령어가 담겨있는 함수 덩어리를 호출한다 라는 명령어입니다.
자주 쓰는 명령 어니까 기억해 두시면 좋습니다.
 
이제 이 부분을 기억해 두고 명령어가 있는 창을 누르시고 F9를 눌러주세요.
프로그램의 멈춤이 해제가 되었을 것입니다. 이번에는 F5 눌러져 있는 상태에서 적을 맞춰보죠.
 

튜토리얼 2-16

Return Address 부분을 보면 아까와는 다른 주소가 적혀 있습니다.
이러면 이제 이게 적의 체력을 관여하는 부분이라는 것이겠죠. 더블클릭 해서 가봅시다.
 

튜토리얼 2-17

 
생긴 건 비슷하지만 조금 다른 부분도 있어 보입니다.
그렇지만 call gtutorial-x86_64.exe+400E0이라는 명령어는 동일합니다.
체력 소모에 관해서는 적과 플레이어는 같은 구간을 사용한다는 뜻이죠.
그러면 이제 이곳을 플레이어와 적을 구분해서 플레이어 체력은 증가하도록
적의 체력은 그대로 감소하도록 하게끔 해야 끝날 것입니다.
 

튜토리얼 2-18

 
이 화면대로 Auto Assemble이라는 곳을 열어줍니다.
이곳이 Script를 작성하는 곳인데, 첫 글에서 말했던 데로 내가 원하는 식으로 프로그램의 행동을
바꾸는 아주 중요한 역할을 하는 곳입니다.
 
일단 적과 플레이어의 차이는 edx에 담겨있는 값으로 구분을 할 수 있습니다.
플레이어는 1대 맞으면 체력이 2 깎여서 edx = 2였고 적은 1대 맞으면 체력이 1 깎여서 edx = 1 이니까요.
이 부분을 초점으로 두고 구분을 지어봅시다.
 

튜토리얼 2-19

 
C나 C++ 등을 약간이라도 다뤄봤다면 바로 이해가 될 것이고 아니라면 이대로 타이핑을 쳐주세요.
옆에 주석으로 설명은 다 달아놨기 때문에 찬찬히 읽어보시면 됩니다.
이렇게 작성하시고 Execute를 눌러주세요.
 

튜토리얼 2-20

 
누르면 이런 식으로 add [rax+60], edx 가 jmp health로 바뀌었습니다.
내가 원하는 식으로 바꿨다는 뜻이죠. 이제 이대로 적을 때려보시면
플레이어의 체력은 늘어나고 적의 체력은 떨어지는 것을 확인할 수 있습니다.
근데 때리는데 너무 오래 걸리잖아요.
 
위 스크립트에서 조금만 수정을 해서 다시 넣읍시다.

튜토리얼 2-21

 
살짝 바꿨습니다.
mov라는 명령어는 mov A, B 라 할 때 B를 A로 복사하여 옮긴다 라는 뜻입니다.
이 명령어도 자주 사용하니 무조건 기억해 주세요.
Execute 눌러서 적용해 주시고요.
적일 경우 체력을 0으로 설정하게끔 했고 플레이어의 경우는 1,000,000 이 되게끔 해놨습니다.
이제 다시 진행해 보도록 합시다.
 
아마 잘 깨지는 것을 확인하셨을 겁니다.
초반에는 설명할 게 많아서 스샷도 많고 글도 엄청 기네요...
회차가 진행됨에 따라 안 해도 되는 과정은 생략해야겠습니다.
그래도 초반에는 필요한 과정이니 진득하게 읽어주시면 감사하겠습니다.

 

 

5. 어셈블리어

[이전글] - 4. 치엔 튜토리얼 Step 2 1. 어셈블리어 컴퓨터 내부에 있는 CPU라는 장치가 있습니다. 이 CPU에서는 각 프로세스들에게 명령을 내리기 위한 고유의 명령어 세트가 있는데 이를 기계어라고

poppinss.tistory.com

 

728x90

'Reversing & Cheat Engine' 카테고리의 다른 글

6. 어셈 명령어  (0) 2024.02.19
5. 어셈블리어  (0) 2024.02.19
3. 치엔 게임 튜토리얼 Step 1  (0) 2024.02.17
2. Cheat Engine 설치 및 세팅  (2) 2024.02.17
1. Cheat Engine & Reversing  (1) 2024.02.17