24. 간단한 게임 치트 도전 - 호출
본문 바로가기
Reversing & Cheat Engine

24. 간단한 게임 치트 도전 - 호출

by boosting 2024. 3. 9.
728x90

 

후킹 외에도 존재하는 기술

여태껏 글들을 쭈욱 살펴보시면 후킹을 안 쓴 곳이 거의 없을 정도로 엄청나게 많은 곳에

사용을 했습니다. 하지만 직접 Thread를 호출해야 할 때가 있는데 이는 후킹으로 하기에는

좀 힘든 감이 없지 않아 있습니다.

 

이 경우엔 말 그대로 함수 호출이라는 방식을 사용할건데 어려운 편은 아닙니다.

그 호출하는 함수 개형에 맞게 Parameters 등을 넣어주고 그대로 호출을 해주면 돼서

익히고 나면 또 다른 강력한 무기가 될 것입니다.

이 호출이라는 기술도 필요한 이유가 메모리 CRC 등으로 인하여 메모리를 직접적으로

건드릴 수 없을 때 사용할 수 있는 방법이기에 그렇습니다.

 

개념만 익히는 거라 그냥 쉬운 걸로 선택하겠습니다.

 

만드는 과정

지난 시간에 봤었던 화면 밝기 조절을 이용하여 해 볼 건데요.

못 보셨다면 밑의 링크를 타고 가셔서 간단하게 읽어봐 주세요.

 

 

22. 간단한 게임 치트 도전 - 밝기 조절

어두워서 잘 안 보이는 경우 글에선 스테이지 1만 다뤘지만 스테이지 2로 갈 경우 어두운 밤을 배경으로 게임이 진행이 됩니다. 이런 식으로 스테이지 2로 넘어오게 되면 화면이 매우 어둡습니다

poppintip.co.kr

 

이 글에서 사용한 방법은 말 그대로 밝기 부분을 정의하는 실수형인 25.00을 직접 건드려서 했었습니다.

그렇지만 이 25.00 부분에 CRC가 돌아서 변조를 직접 할 수 없을 경우엔 건드릴 수가 없을 겁니다.

물론 CRC 우회하는 게 제일 베스트 판단이지만 그 과정은 매우 험난할 거기에... 

 

 

그럴 때 사용하는 게 바로 이 호출이라는 개념입니다.

 

SCMarine

 

우선 보시면 FPU 레지스터에 25.00이라는 실수를 넣고 밑에 바로 call 하는 함수가 있습니다.

이 call 하는 함수를 통해서 밝기 조절이 켜진다고 볼 수 있어요. 그렇다면 말 그대로 이 함수에

맞게끔 인자들을 끼워 맞춰주고 호출을 하면 켜질 거라고 볼 수 있습니다.

 

우선 이 부분에 디버깅을 걸어줍니다.

 

SCMarine

 

이런 식으로 디버깅이 걸렸을 때 이 모든 레지스터들을 다 끼워줘야 되느냐 하면 그건 아닙니다.

밑의 call 함수에서 어떤 레지스터들을 사용하는지를 보고 필요한 것들만 끼워주면 됩니다.

 

SCMarine

 

자 보아하니 사용되는 레지스터는 rbx와 rcx 2가지가 되겠네요.

스택 부분도 맞춰야 되는 게 아니냐 할 수 있는데 저희가 직접 호출하는 거라 스택은 크게 상관없습니다.

강제로 호출하고 리턴으로 빠져나가게끔 스택의 크기 할당만 해주면 문제가 전혀 없다는 거죠.

 

rbx = 15FD03C5D40

rcx = 15FFCE58040

 

이렇게 2가지를 확인했습니다. 물론 이 레지스터 2개가 어디 포인터에서 담기는지까지 파악해서

포인터식으로 짜면 매번 디버깅을 해서 레지스터에 들어가는 값을 구할 필요는 없는데 그 부분은

여기서는 생략하겠습니다. 다른 부분에서 해볼 수 있으면 진행을 해볼게요.

우선 스크립을 대충 짜주면 다음과 같습니다.

 

SCMarine

 

CreateThread(내가 만든 공간)으로 내가 만든 공간을 임의로 호출할 수 있습니다.

기억해 두시면 좋습니다. Cheat Engine을 다루시다 보면 한 번은 무조건 쓸 일이 있을 거예요.

그러면 이렇게 짠 게 잘 되는지를 한 번 확인해야겠죠?

 

 

SCMarine

 

영상을 확인해 보시면 밝기 조절인 25.00 이 부분은 그대로 내버려두었습니다.

즉, 메모리 변조를 전혀 하지 않은 상태에서 내가 원하는 방향으로 만들어낸 것입니다.

메모리 변조나 후킹을 꼭 하지 않아도 이렇게 적용을 할 수 있는 방법이 있다는 것은 참 좋은 방법이죠.

함수 호출을 하기 위해서는 꼭 그 함수에 맞는 Parameters 들을 넣어줘야 문제없이 작동이 됩니다.

잘못 끼워 넣으면 Crash 나서 클라이언트가 꺼질 거예요.

 

아이템을 먹는다던가 이런 부분들도 함수 호출 형식으로 진행할 수 있습니다.

나머지 부분들은 한 번 직접 도전하시는 것도 괜찮을 것 같습니다~

728x90