게임해킹/ESP 핵

esp핵 만드는 방법 (과정, 필요한것) [게임해킹]

cp_good: 2022. 7. 19. 17:22
반응형

ps핵 만드는데 필요한 것, 과정 기록해놓은 겁니다.
보면 필요한 것들 링크 나옵니다.

필요한 것

월드 투 스크린 함수 (WorldToScreen Functions)
뷰 행렬 (View Matrix)
좌표 (적 좌표)
화면 크기 (해상도)

 

아래 설명은 3D 상에서 2D로 변환까지 설명입니다.

 

출처 : LearnOpenGL - Coordinate Systems (learnopengl.com)

 
3D 그래픽에선 동차 좌표(Homogeneous Coordinates)를 사용하고
행렬과 버텍스 곱하여 이동, 회전, 크기 등을 표현하는데 "변형"이라고도 함

추가 설명

    • 행렬에는 이동행렬, 회전 행렬, 크기 행렬 (The Identity matrices, Scaling matrices, Rotation matrices) 등이 있다.
    • 행렬 : 미리 정의된 수의 행과 열이 있는 숫자의 배열, 매트릭스라고도 함
    • 버텍스 : 점 or 좌표라고 생각하면 될 듯
    • 행렬 곱하기 순서는 정의돼 있음 (검색)
    • 동차 좌표(Homogeneous Coordinates)란, 3D 버텍스(x, y, z)에 w를 추가해 (x, y, z, w) 벡터로 사용하는 것
    • 3D 그래픽에선 4x4 행렬 사용합니다.

 

화면 좌표까지 가기 위한 과정 (사진 참조)

위 설명을 기억하고
1. 모델 행렬(Model Matrix) : 모델 공간에서(버텍스들이 모델 중심에서 상대적인 곳) 월드 공간(버텍스들이 월드의 중심에서 상대적인 곳)으로 변형시킨다.
(
월드 좌표를 얻기 위해 모델 행렬과 모델 좌표를 곱한다는 뜻

2. 뷰 행렬(View Matrix) : 월드 공간에서(버텍스들이 월드의 중심에 상대적인 곳) 카메라 공간(버텍스들이 카메라에 상대적으로 정의되는 곳)으로 이동시킨다.
(
카메라 관점 좌표를 얻기 위해 뷰 행렬과 월드 좌표를 곱한다는 뜻)

 


여기까지 봤으면

뷰 행렬과 캐릭터 좌표(월드 좌표)를 곱하면 (행렬 곱하는 방식으로 그냥 곱하는 거임)
카메라 관점으로 좌표가 나오는 걸 알았고

※ 저희는 뷰 행렬과 캐릭터 좌표를 게임에서 찾을 수 있으니, 뷰 행렬에 캐릭터 좌표만 곱하면 카메라 관점 좌표가 나옴
 

뷰 매트릭스 찾는 법(링크)
월드 좌표 = 캐릭터 좌표 찾기(링크)

 
뷰 매트릭스에 월드 좌표를 곱하면 카메라 관점 좌표가 나오는지 확인해 봅시다.
발바닥 기준으로 보세요.

 

X 좌표

 

Z좌표랑 W좌표는 비슷하네요?
Z좌표는 안 쓰지만 출력해 봤습니다

 

Z 좌표 ,W 좌표

 

확인 결과

일정하게 좌표가 나오는 거 보니 카메라 기준으로 캐릭터 좌표가 나오는 걸 볼 수 있습니다.
 
3. 프로젝션 (Projection) : 카메라 기준으로 본 캐릭터 좌표를 NDC(정규화된 장치 좌표)로 변환하는 과정
Perspective divide(원근 분할) 작업을 수행해 줍니다 (좌표를 NDC로 변환하는 과정입니다)
벡터 x, y, z, w 요소들을 벡터 w 요소로 나눕니다 (카메라 기준 좌표 x, y, w를 w로 나눠줍니다. z좌표는 안 씁니다)
이후 모니터 좌표에 매핑시킵니다.

 

추가 설명

  • 정규 좌표(NDC : Normalized Device Coordinate) 1을 기준으로 하는 2차원 좌표
  • 정규 좌표 기준 : 우상단 좌표(1.0, 1.0), 좌하단 좌표(-1.0, -1.0)
  • 정규 좌표를 거치는 이유는 정규 좌표를 사용하면 해상도에 따른 화면 좌표 계산이 단순화된다
  • 화면 좌표를 계산하는 과정은 "해상도 x ((정규 좌표) + 1.0) x 0.5", 예시) 1,280 x ((정규 좌표) + 1.0) x 0.5

사진출처 : [[CSCI 5563] 1. 3D Point Projection (jakdam.tistory.com/2)

 

월드투스크린 함수

NDC변환과 모니터 좌표에 매핑을 월드투스크린 함수에서 합니다.

// pos : 캐릭터 좌표
// viewmatrix : 구한 뷰매트릭스
// SWidth : 게임 가로 창크기
// SHeight : 게임 세로 창크기
void WorldToScreen(Vector3 pos, Matrix viewmatrix, int SWidth, int SHeight) {
	// 행렬 곱하기 공식대로 곱해준다(카메라 관점의 좌표를 얻기위함)
	float x_value = viewmatrix.matrix[0] * pos.x + viewmatrix.matrix[4] * pos.y + viewmatrix.matrix[8] * pos.z + viewmatrix.matrix[12];
	float y_value = viewmatrix.matrix[1] * pos.x + viewmatrix.matrix[5] * pos.y + viewmatrix.matrix[9] * pos.z + viewmatrix.matrix[13];
	// z좌표가 없는데 z좌표는 필요없습니다
	float w_value = matrix.matrix[3] * pos.x + matrix.matrix[7] * pos.y + matrix.matrix[11] * pos.z + matrix.matrix[15];
	
	// 정규화된 장치 좌표(NDC)를 얻기 위해 w좌표를 나눠줍니다(모니터화면 좌표로 변환하기 위한 과정)
	x_value /= w_value;
	y_value /= w_value;
    
	// y좌표에 -1을 곱하는 이유는 모니터 y좌표는 아래로 내려갈수록 높아져야 하는데
	// 계산 결과에서 y좌표는 아래로 갈수록 낮아지기 때문에 여기서 보정해주는 겁니다
	y_value *= -1;

	// 나중에 계산하기 위해 NDC를 저장해줍니다
	auto ndc_x = x_value;
	auto ndc_y = y_value;

	// 아래쪽은 모니터 좌표로 변환 공식입니다
	x_value /= 2;
	y_value /= 2;

	x_value *= SWidth;
	y_value *= SHeight;

	x_value += (ndc_x + SWidth / 2);
	y_value += (ndc_y + SHeight / 2);
    
	return;
}

 
함수 리턴값을 보면 모니터 기준 캐릭터 좌표가 잘 나오는 걸 볼 수 있습니다.

 

함수 결괏값

 
게임창이 1280x720
캐릭터 위치는 우측 하단 (발바닥 기준입니다)
결괏값은 x = 1229,  y = 730 잘 나오네요.
이제 이 위치기준으로 박스만 그려주면 esp가 됩니다.
그리는 방법은 GDI나 그래픽 라이브러리를 사용하면 됩니다.
엔디비아 오버레이 + D2D를 이용한 그리기

 

월드투스크린 함수의 인자로 캐릭터의 좌표를 넘겨주기 전에
엔티티 리스트를 찾아 캐릭터좌표를 뽑아네
Vector3 구조체 배열에 저장하는 작업이 필요합니다.
 

추가설명

엔티티 리스트는 캐릭터베이스포인터를 모아놓은 곳이라고 보면 됩니다.
Vector3는 그냥 x, y, z 멤버가 있는 구조체입니다.

struct Vector3 {
	float x, y, z;
}

 


제대로 정리한 건진 모르겠는데
esp핵 기준으론 이 정도만 이해해도 될듯합니다.

 

메일 : qmffhrm@protonmail.com
 
참조
Tutorial 3 : 행렬(매트릭스) (opengl-tutorial.org)
[Learn OpenGL 번역] 2-8. 시작하기 - 좌표 시스템 (tistory.com)
학습 OpenGL - 좌표계 (learnopengl.com)
컴퓨터 그래픽스 이론 정리 - 정규좌표와 화면좌표 (tistory.com)
 
게임해킹 더 보기

 

기본적인 게임해킹 방법과 최근 게임해킹 방법 (안티치트 우회, 드라이버 해킹)

게임 해킹이 어떻게 이루어지는지 과정입니다. 내용 없이 설명만 하지 않고 직접 해볼 수 있게 작성할 예정입니다. 게임 해킹 처음 접할 때 보시면 좋습니다. 게임 해킹 순서 메모리 스캔으로 원

cpgood.tistory.com

치트엔진 우회하러 가기

 

[cheat engine]우회 치트엔진 만드는 방법 1편 (치트엔진 감지 우회)

치트엔진 우회하는 방법입니다 1. 치트엔진 소스코드를 다운로드하고 압축을 풀어줍니다. 바로다운 2. 그리고 라자루스를 다운로드합니다. 바로다운 3. 소스코드 폴더에서 DBK32functions.pas를 메

cpgood.tistory.com

반응형