<보안 study>/리버싱

[게임핵개발연습#3] 게임에선 좌표계산이 어떻게 될까? - 1. viewMatrix 찾기

gosoeungduk 2022. 1. 3. 03:14
반응형

#AssaultCube #게임핵 #ESP #OpenGL


여태까지는 나 자신, 개인 플레이어에 대한 핵을 알아보고 만들어봤다.

사실 이 방법들은 온라인 상에서하는 MultiPlay 방식에선 1도 먹히지 않는다.(단, 수류탄 개수, 총알 개수 같은 일부 기능은 먹힌다)

아마 추정컨데, 체력이나 여러 정보를 여타 FPS 들 처럼 서버를 통해 관리하기 때문이 아닐까 생각한다.

그러나 우리의 최초 목표와 같이 다른 적들과 같은 팀원들의 정보는 서버에서 결국 내 PC 로 받아오는 구조가 될 수 밖에 없기에 메모리 어디엔가는 적들과 팀원들의 정보가 저장되어있을 것이다.

그러면 이 정보를 이용해서 적들의 현재 위치, 체력은 얼마인지, 총알은 얼마나 남아있는지 정도는 알 수 있지 않을까?

그것이 바로 ESP 핵 이다.

)

최근까지도 서든어택 부터 오버워치까지 월핵이 암암리에 성행하고 있다고 하는데 실시간 반응이 중요한 FPS 특성상 어쩔 수 없긴한가보다...

아무튼 이런 핵을 만들기 위해 우선 각 Player Entity 좌표가 어떻게 메모리에 저장되고 어떻게 이용할 수 있을지 알아보자.

Assault Cube 같은 경우는 그래픽 라이브러리로 OpenGL 을 사용하는데(보통은 DirectX 시리즈 아니면 OpenGL이다), 이 OpenGL 에서 Player Entity 에 대한 좌표를 실시간으로 관리한다.

정확히는 Entity 좌표 와 나한테 보여지는 시야? 시점? 에 대한 4x4 Matrix(행렬) 값 을 관리하는데, 이 Matrix 값을 알아야한다.

모든 3D 게임에는 Matrix 라는 개념이 존재하고, 이 Matrix 는 역할에 따라 여러 Matrix 가 존재할 수도 있다.

상세 종류는 Model/Design Matrix, World Matrix, View/Camera Matrix, Projection(투시) Matrix 등이 있다. 이 중에서 우리는 Model, View, Projection Matrix 를 이용할 예정이다.

View/Camera Matrix 란?

View Matrix 는 간략히 말해서 우리가 보는 시점에 대한 행렬 값이다. 즉, 3D 사물을 2D 스크린에 표시/변환 하는데 필요한 행렬 값이다.

Assault Cube 로 치면 적이나 사물들을 내 screen 상에 온전하게 원근감까지 살려서 표현하는데 필요한 값인 것이다.

View Matrix 를 비롯한 여러 Matrix 들의 위와 같은 형태를 띈다. 각 column 들이 x ,y ,z ,translation 에 관한 값을 의미한다.

그리고 이 View Matirx 는 메모리 안에 Model Matrix , Projection Matrix 와 곱해져서 메모리에 저장되어있다. 그리고 OpenGL 엔진은 이 속칭 MVP Matrix 로 3D 와 2D 변환을 진행한다.

MVP Matrix 어떻게 찾을건데?

단순하다. Assault Cube 상에서 고개를 위, 아래로 왔다갔다 할 것이다.

ViewMatrix 상에서 위아래 수직 회전을 pitch 라고 하는데, 위로 90도에서 z 값은 1 을, 아래로 90도에서 z 값은 -1 을 갖게 된다.

이 점을 이용하여 cheat Engine 으로 값을 탐색하면 아래와 같이 15개 정도? 로 범위를 추릴 수 있다.

이 중 위 3개의 주소는 Assault Cube Base 주소로 부터 고정적인 값이고, 여러 번 껐다 켰다 하면서 테스트해도 항상 같은 값이 나오게 된다.

즉, view matrix 관련 데이터가 고정적인 주소 값에 위치하는데 저 셋 중 하나가 우리가 찾는 MVP matrix 일 것이다.

여기서 마우스를 좀만 돌려보면, 하나의 선택지는 제외되고 둘 중 하나가 남는데 memory map 을 통해 전체적인 변화를 살펴보면 4x4 MVP matrix 의 16개 값(한 개의 값은 4바이트) 이 동시에 자연스럽게 변하는 곳은 0x501B14 부분이다.

이 때, 이 viewMatrix 가 어디서 시작되는지를 판단해야한다. 다시 이 부분에서 memory map 을 켜고 보면, 마우스를 돌려봤을 때 0x501B14 주변으로 값들이 슈욱슈욱 변하는게 보일 것이다.

그러나 변하는 부분이 행렬의 값 1개당 4바이트라고 쳐도 굉장히 많은데, 앞에서 말했듯이 3D 게임 상에는 여러 Matrix 들이 존재하고 다른 Matrix 가 같이 있을 확률이 높다.

그러면 일단 동적으로 변하는 시작 부분이 0x501AA8 이므로 거기서 부터 16개 값을 책정해봤을 때 우리가 찾은 값이 있는 범위는 0x501AE8 ~ 0x501B40 이다.

data structure 기능으로 살펴보면 더 보기 편하다.

아무튼 결론적으로 0x501AE8 이 우리가 찾던 viewMatrix 로 결론지을 수 있다,

이 다음 부턴 약간의 수학(?) 을 통해 실제 적의 좌표를 계산해보기로 하고 이번 글은 여기까지.


자료 참고 및 출처

OpenGL_transformation

반응형