1. 질문
이 두 적은 나보다 더 많은 체력과 데미지를 주는데, 이를 고려하여 타겟을 파괴해야 한다.
팁 : 적과 플레이어는 연관되어 있다.
스페이스바로 탄을 발사하고 좌우 방향키로 우주선을 움직일 수 있다.
Step 9 와 비슷하면서도 다른 점이 있는 step2이다.
타겟과 싸워 모든 타겟을 파괴한다면 단계를 통과할 수 있다.
그러나 타겟의 체력이 내 우주선보다 많아 이기는 것이 불가능하다. 그렇다고 단순히 타겟의 체력 변수를 1로 만든다고 해서 이 단계를 통과할 수는 없다.
왜냐하면 이번 단계는 타겟을 동시에 파괴할 수 없고, 하나를 먼저 처리했을 경우 필살기가 발사되어 내 우주선이 한방에 파괴되도록 설정되어있기 때문이다.
그렇다면 어떻게 해야 할까?
Step 1 과 다르게 공격을 맞아도 내 체력이 감소되지 않도록 방법을 찾는다.
2. 문제 풀이
우선 step2 프로세스를 연다.
타겟의 체력 변수를 찾는다.
Step 1에서 했던 것처럼 알 수 없는 값에서 감소하는 값을 스캔으로 찾는다.
new scan -scan type (unknown initial value) – first scan – 타겟 공격 후 – scan type(decreased value) – next scan
세 체력변수를 찾아 주소목록에 추가한다. 보기 편하게 설명도 적어 놓자.
그리고 Find out what accesses this address 메뉴를 클릭하여 접근 목록을 찾는다.
세 변수 모두 접근 목록을 확인해 보니 특이한 점이 있었다.
바로 체력을 감소시키는 코드가 모두 동일한 것이다.
이 부분이 바로 팁의 '타깃과 플레이어는 연관되어 있다'가 의미하는 바 일 것이다.
이 점은 “Find out what addresses this code accesses” 메뉴를 통해서도 확인할 수 있다.
공격을 한 번씩 하면 해당 코드에 접근하는 주소들을 확인할 수 있다.
한 코드에 내 우주선 체력변수, 두 타겟의 체력변수가 접근한 것을 나타내고 있다.
이와 같이 체력을 감소시키는 코드가 같기 때문에 타겟 체력을 200씩 깎도록 변경하더라도 내 우주선 또한 탄에 맞을 경우 체력이 200이 감소하여 파괴되기 때문에 이길 수가 없다.
그렇다면 내 체력만 감소하지 않도록 코드를 수정하기 위해서는 어떤 요소가 필요할까?
바로 조건문이다. 타겟과 달리 나를 유일하게 구분하는 요소를 조건으로 삼아 해당하면 피격당해도 체력이 감소하지 않도록 코드를 삽입한다.
이 세 변수의 메모리 영역을 비교해 볼 수 있는 기능이 있다.
모든 목록을 드래그하고 오른쪽 버튼을 눌러 “Open dissect data with selected” 메뉴를 클릭한다.
New window를 선택한다
아래의 창이 뜬다.
왼쪽의 offset과 데이터 내용을 보니 rax값을 기준으로 상대적 위치를 표시해 놓음을 추측할 수 있다. (rax+60) = 체력 값을 저장한 주소
스크롤을 내리면서 (1) 변하지 않고, (2) 타깃과타겟과 구별되는 값을 찾는다.
나는 체력 절댓값 (rax+64)를 이용하기로 했다.
내 우주선의 체력은 타겟과 달리 100이므로 구분되며, 변하지 않는 값이다.
체력 감소 코드를 클릭하고 Show disassembler -> tools -> Auto Assemble
Template – Code Injection
다음과 같이 수정한다.
originalcode:
cmp [rax+64],64 // 100을 16진수로 변환하면 64이다. Rax+64 = 100인지 비교한다.
je me // 맞다면 me 로 점프한다
jne target // 아니라면 target으로 점프한다
me: //체력 감소코드를 삭제해서 체력이 줄어들지 않도록 한다
ret
add [rax],al
target: //타겟은 그대로 체력 감소하도록 한다.
sub [rax+60],edx
ret
add [rax],al
excute로 수정을 완료한다.
이제 게임 화면으로 돌아와서 공격을 했을 때 체력이 어떻게 변화하는지 확인한다.
이제 필살기를 사용해도 체력이 줄어들지 않는다.
Step 2를 클리어했다.
2. 절대 체력 값 수정하기
Step2를 풀이하는 중 절대 체력 값을 1로 바꾸어 주면 단계를 통과할 수 있다는 사실을 알게 되었다.
Offset 60에서는에서는 현재 체력 값을 나타내고, offset 64는 절대 체력 값이 저장되어 있었다.
타겟의 절대체력과 현재 체력 변수 값을 모두 1로 바꾸어 준다.
타겟 하나가 파괴된 후 바로 나머지 타겟을 3초 안에 파괴시키면 step2를 통과할 수 있었다.