1. 전 글과 똑같이 엔진과 튜토리얼 프로그램 실행을 해둡시다.
이전 글대로 따라 하셔서 클리어를 하시고 프로그램을 껐다가 킨 경우라면
Level 1과 Level 2를 선택하라는 문구가 나옵니다. Level 2 에다가 조준해서 타깃을 부숴줍시다.
이번에도 요구하는 사항을 읽어봅시다.
이 두 개의 적은 나보다 체력이 많고 더 많은 피해를 준다고 합니다.
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을 해보죠.
우선 나의 체력인 96의 Value를 담은 주소가 바로 나왔습니다.
이를 내려서 100으로 고정을 해보고 적을 맞춰보도록 하죠.
스페이스바를 엄청나게 눌러서 1마리를 잡았더니, 어떤 이상한 문구가 뜹니다.
이 행위에 대한 대가를 지불한다고 하고 메가봄브를 활성화한다고 합니다.
그다음 남은 적에게 탄창을 쏘니 지는 강화된 탄창을 쏘는군요.
체력 고정도 소용없이 -1로 만들어버리고 시간 좀 지나면 원래대로 돌아갑니다.
즉 플레이어 체력을 건드리는 것으로는 해결할 수 없다는 뜻이겠네요.
3-2. 두 번째 시도
나의 체력이 아닌 상대 체력을 찾아봅시다.
Step 1 때처럼 둘 다 체력이 정상일 때 타입을 Unknown initial value로 스캔해 놓으시고
상대 타깃을 맞추고 타입을 Decreased value 교체 후 재스캔 , 1번 더 맞추고 재스캔 후
상대 타깃을 맞추지 말고 타입을 Unchanged value로 교체하여 재스캔 하시면 주소가 추려집니다.
체력이 100이 아닌 200이 기본 설정인가 봐요.
플레이어는 탄창 1개당 체력 2를 소모하는데 적은 체력 1을 소모하는 모양입니다.
그러면 적 체력을 바꿔보고 쏴볼게요.
해보셨으면 아시겠지면 결과는 1번과 같았습니다.
남은 1개의 적이 또 강화가 되어 못 깼습니다.
3-3. 세 번째 시도
1마리가 계속 남는다고 했으니 2마리의 체력을 한 번에 찾아보죠.
우선 1마리의 체력이 200인걸 위의 결과로 알아냈기 때문에 200을 스캔하시고
적에게 각각 1대씩 때리고 199로 Next Scan을 해보죠.
이렇게 보니까 저 2개의 주소가 각 적의 체력을 나타내는 걸로 보입니다.
그러면 둘 다 1로 설정하고 두 마리에게 한 발씩 쏴보죠.
그렇게 했을 경우 또 실패할 것입니다.
이러면 이제 단순 수치를 조절하는 것만으로는 해결이 힘든 상황이라는 것을 알 수 있습니다.
이제 Debugging이라는 스킬을 사용할 때가 되었습니다.
4. Debugging
Debug 라 함은 보통 De + Bug 라 해서 벌레 얘긴가 싶을 수도 있지만
컴퓨터 계열에서는 말 그대로 버그를 잡는다라고 보시면 됩니다.
그러면 이 기술을 어디에다 쓸 것이냐.. 맨 처음 시도했던 플레이어 체력 쪽에
써보도록 하죠.
아까처럼 플레이어 체력값을 찾으시고 저 주소에 좌클릭하고 Ctrl + B를 누르면 뭔가 하나 더 뜰 겁니다.
상단과 하단으로 나뉘어있는데 상단은 잠시 넘기시고 하단 쪽을 봐주세요.
58이라 써져 있는 수치는 16진수로 표기돼 있는 것이고 이는 우리가 잘 아는 10진수로는 88입니다.
고로 현 플레이어의 체력 수치이죠. 여기서 마우스 우클릭 하시면
Data Breakpoint -> Find out what accesses this address를 클릭해 주세요.
그러면 Find out 이 2개가 있는데 이 2개는 각각 무슨 차이인지 궁금할 수 있습니다.
accesses this address = 직접적으로 주소의 Value의 변경에는 영향 없지만 Read 하는 곳도 찾아낸다.
writes this address = 직접적으로 주소의 Value 변경에 관여하는 곳을 찾아낸다.
이게 차이인데, 어차피 체력 떨어지는 것에 관여하는 곳을 살펴보기 위함이니
어떤 것을 하셔도 상관은 없습니다. 누르셨으면 어떤 창이 또 뜰 것입니다.
뜨고 난 뒤에 플레이어의 체력을 깎아주세요.
깎고 나시면 밑에 이상한 2개가 떴을 것입니다.
sub [rax+60], edx라고 하는 곳을 누르신 후 우측에 Show disassembler를 눌러주세요.
그러면 다음과 같이 보이실 겁니다.
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를 눌러주시고 적을 쏴보죠.
이럴 수가..
내 체력도 늘어나지만 적의 체력도 덩달아 늘어나는 걸 볼 수 있습니다.
아 이러면 이제 이해가 되는군요.
맨 처음 '적과 나는 연관이 있다'라는 팁 기억이 나실까요?
그러니까 이 명령어는 나에게도 해당하지만 적에게도 해당한다.라는 말이 됩니다.
그러면 나에게는 적용이 되게끔 하면서 적에게는 적용이 안되게끔 하는 식으로
해결을 하면 이 튜토리얼을 클리어할 수 있을 것으로 보입니다.
이렇게 아까 그 명령어에 좌클릭 하신 후 F5를 눌러주시면 이렇게 초록색이 될 겁니다.
이 상태로 적을 맞추지 말고 허공에다가 발사를 해봅시다.
이런 식으로 프로그램이 멈추면서 우측 상하단에 이상한 것들이 쭈르륵 떴습니다.
이게 뭐냐면 이 명령어를 지나갈 때 Cheat Engine이 멈추게 한 후 그 상황에서의 상태를
보여주고 있는 거라고 이해하시면 될 것 같습니다.
sub [15E9890+60],2 // [ ]는 저 계산한 주소에 담겨있는 Value를 의미
sub [015E98F0],2 // 튜토리얼 2-8을 보시면 이 주소는 플레이어의 체력이 담겨있는 주소
아까 15E9890+60 은 플레이어의 체력이 담겨있는 주소라고 했습니다.
지금 튜토리얼 2-14에서 rax에 담겨있는 주소를 봐주세요. 015E9890 입니다.
그러면 지금 걸린 상태가 플레이어의 체력에 관여하기 위해서 명령어를 수행 중인 것으로
볼 수 있는 것입니다. 이때 Return Address에서 맨 위를 더블클릭 해주세요.
그러면 이렇게 그 주소로 이동을 한 모습을 볼 수 있습니다.
이 위의 call gtutorial-x86_64.exe+400E0라고 되어 있는 곳은 저희가 맨 처음 봤던 명령어가 있는 곳입니다.
call이라는 명령어는 안의 명령어가 담겨있는 함수 덩어리를 호출한다 라는 명령어입니다.
자주 쓰는 명령 어니까 기억해 두시면 좋습니다.
이제 이 부분을 기억해 두고 명령어가 있는 창을 누르시고 F9를 눌러주세요.
프로그램의 멈춤이 해제가 되었을 것입니다. 이번에는 F5 눌러져 있는 상태에서 적을 맞춰보죠.
Return Address 부분을 보면 아까와는 다른 주소가 적혀 있습니다.
이러면 이제 이게 적의 체력을 관여하는 부분이라는 것이겠죠. 더블클릭 해서 가봅시다.
생긴 건 비슷하지만 조금 다른 부분도 있어 보입니다.
그렇지만 call gtutorial-x86_64.exe+400E0이라는 명령어는 동일합니다.
체력 소모에 관해서는 적과 플레이어는 같은 구간을 사용한다는 뜻이죠.
그러면 이제 이곳을 플레이어와 적을 구분해서 플레이어 체력은 증가하도록
적의 체력은 그대로 감소하도록 하게끔 해야 끝날 것입니다.
이 화면대로 Auto Assemble이라는 곳을 열어줍니다.
이곳이 Script를 작성하는 곳인데, 첫 글에서 말했던 데로 내가 원하는 식으로 프로그램의 행동을
바꾸는 아주 중요한 역할을 하는 곳입니다.
일단 적과 플레이어의 차이는 edx에 담겨있는 값으로 구분을 할 수 있습니다.
플레이어는 1대 맞으면 체력이 2 깎여서 edx = 2였고 적은 1대 맞으면 체력이 1 깎여서 edx = 1 이니까요.
이 부분을 초점으로 두고 구분을 지어봅시다.
C나 C++ 등을 약간이라도 다뤄봤다면 바로 이해가 될 것이고 아니라면 이대로 타이핑을 쳐주세요.
옆에 주석으로 설명은 다 달아놨기 때문에 찬찬히 읽어보시면 됩니다.
이렇게 작성하시고 Execute를 눌러주세요.
누르면 이런 식으로 add [rax+60], edx 가 jmp health로 바뀌었습니다.
내가 원하는 식으로 바꿨다는 뜻이죠. 이제 이대로 적을 때려보시면
플레이어의 체력은 늘어나고 적의 체력은 떨어지는 것을 확인할 수 있습니다.
근데 때리는데 너무 오래 걸리잖아요.
위 스크립트에서 조금만 수정을 해서 다시 넣읍시다.
살짝 바꿨습니다.
mov라는 명령어는 mov A, B 라 할 때 B를 A로 복사하여 옮긴다 라는 뜻입니다.
이 명령어도 자주 사용하니 무조건 기억해 주세요.
Execute 눌러서 적용해 주시고요.
적일 경우 체력을 0으로 설정하게끔 했고 플레이어의 경우는 1,000,000 이 되게끔 해놨습니다.
이제 다시 진행해 보도록 합시다.
아마 잘 깨지는 것을 확인하셨을 겁니다.
초반에는 설명할 게 많아서 스샷도 많고 글도 엄청 기네요...
회차가 진행됨에 따라 안 해도 되는 과정은 생략해야겠습니다.
그래도 초반에는 필요한 과정이니 진득하게 읽어주시면 감사하겠습니다.
'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 |