미친해커

[Cheat Engine] Cheat Engine Tutorial Step 9 본문

Cheat Engine Tutorial

[Cheat Engine] Cheat Engine Tutorial Step 9

미친해커 2021. 9. 20. 16:54
반응형

Step 9의 주제는 Shared Code이다. Shared Code란 코드를 공유하는 것을 말한다. 예를 들어 캐릭터가 존재하고 대미지를 받는 함수가 존재한다고 했을 때 대미지를 받는 함수를 캐릭터마다 만든다면 메모리 낭비가 심할 수 있다. 이런 경우 대미지를 받는 함수를 하나만 만들고 모든 캐릭터가 그 함수를 사용한다면 메모리를 최소화하여 사용할 수 있다. 그리고 이번 Step의 클리어 조건은 Restart game and autoplay 버튼을 눌렀을 때 Dave팀이 승리하면 된다. 우선 Restart game and autoplay 버튼을 눌러보자

우리팀이 모두 죽었다고 나오는 것을 확인할 수 있다. 그렇다면 일단 Dave의 체력을 검색해보자 (Restart game 버튼을 누르면 체력이 모두 초기화된다)

100을 검색하고 HP를 Hit 한 뒤 다시 검색해보면 아무런 값도 뜨지 않는 것을 볼 수 있다. 이유를 설명하자면 HP의 타입이 4 Bytes 즉 int 자료형이 아니기 때문이다. 이러한 경우에는 우리가 전에 배웠던 방법을 사용해 검색할 수 있다.

Scan Type을 Unknown initial value로 설정해주고 First Scan 버튼을 눌러준다, 그 후에 Attack 버튼을 눌러 Hit 해주고 이번에는 Scan Type을 Decreased value (감소된 값)으로 설정해준 후 Next Scan 버튼을 누르면 기존에 값에서 감소된 값들을 보여주게 된다. 위 방법을 반복해 플레이어들의 체력을 찾을 수 있다.

더보기

순서는 Attack -> Decreased value 설정 -> Next Scan을 반복해 검색되는 값이 하나가 될 때까지 반복한다.

위 작업을 반복하다보면 값이 하나만 검색되게 된다. 그런데 검색된 값을 확인해보면 Value가 83과는 현저히 동떨어진 값이라는 것을 확인할 수 있다. 이럴 때에는 Type을 변경해보면 된다.

리스트에 저장되어 있는 값의 Type을 더블클릭하면 타입을 지정할 수 있는 창이 뜨게 된다. 여기서 Float으로 변경해보면 값이 정상적으로 표시되는 것을 확인할 수 있다. 이제 저 값을 어디서 쓰는지 확인할 차례이다.

이번에도 Instruction이 하나 기록됐다. 

Show disassembler를 눌러 현재 어셈블리가 존재하는 주소로 이동한다. 여기서부터는 새로운 기능을 사용할 것이다. 문제 제목이 Shared Code인 만큼 모든 체력 감소 이벤트가 저 어셈블리를 지나간다는 의미가 된다. 그렇다면 저 어셈블리를 지나가는 모든 값을 잡아내면 다른 캐릭터들의 정보도 찾지 않고 잡아낼 수 있게 된다. 여기서 그냥 Code Injection을 사용하면 되지 않냐는 의문이 생길 수 있는데 문제는 Dave팀의 체력은 유지 상대팀의 체력은 감소해야 하기 때문에 단순히 저 부분만을 Code Injection 해서는 클리어할 수 없다.

Find out shat addresses this instruction accesses 기능을 사용하면 이 인스트력션을 액세스 하는 모든 주소를 잡아낼 수 있게 된다. 이 상태에서 모든 캐릭터의 Attack 버튼을 눌러준다.

그럼 위 그림과 같이 주소와 Value를 모두 확인할 수 있게된다. 이제 저 주소들을 그룹별로 묶을 수 있다. Dave팀과 적팀 이렇게 2개의 팀(그룹)이 존재하고 각각 2명이니 주소를 2개씩 묶어 그룹으로 구성해준다.

주소를 2개씩 잡아서 각각 그룹으로 묶어준다. 그렇다면 같은 그룹끼리 색깔이 지정된 것을 확인할 수 있다.

위 그림과 같이 Open dissect data with selected addresses 버튼을 눌러준다. 그리고 new window를 더블클릭, 그리고 모두 OK 해주면 Structure dissect 창이 나오게 된다. 이 기능은 선택한 주소들을 기준으로 분석해 주소와의 구조를 보여준다. 

위 그림을 보면 Offset 0x0008 부분에 모든 캐릭터의 체력이 존재하는 것을 확인할 수 있다. 0x0019에는 캐릭터의 닉네임이 존재한다. 이렇게 선택한 주소들을 분석해 서로의 관계를 보고 연관되는 부분을 찾아서 구조체로 보여주게 된다. 0x0014을 확인해보면 Dave팀은 1, 적팀은 2로 되어있는 것을 확 이할 수 있다. 이제 Code Injection을 사용하여 이 부분의 값을 보고 1이면 무시하고 2이면 체력을 감소하는 코드는 작성하면 된다.

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048,"Tutorial-x86_64.exe"+2EB6D) 
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
cmp [rbx+14], 1 // 1인지 아닌지 확인
je exit //1 이라면 체력을 감소하지 않고 넘어감
jmp originalcode //1이 아니라면 체력을 감소하는 코드로 넘어감

originalcode:
movss [rbx+08],xmm0
jmp exit

exit:
jmp returnhere

"Tutorial-x86_64.exe"+2EB6D:
jmp newmem
returnhere:


 
 
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"Tutorial-x86_64.exe"+2EB6D:
movss [rbx+08],xmm0
//Alt: db F3 0F 11 43 08

이렇게 Code Injection을 끝낸 후 Restart game and autoplay 버튼을 누르면 Dave팀의 체력을 감소하지 않고 적팀의 체력만 감소하는 것을 확인할 수 있다.

그러면 이렇게 Next 버튼이 활성화 되어 클리어할 수 있게 된다

반응형
Comments