https://theori.io/ko/blog/game-hacking-3
게임핵의 원리 (3) - Aimbot - Theori 블로그
국내에서 ‘에임핵’, ‘오토에임’으로 알려진 에임봇(Aimbot)은 플레이어가 조준점을 움직이지 않아도 자동으로 적을 조준시키는 핵입니다. 각도 기반 화면 회전, 화면 좌표 변환, Visible Check,
theori.io
Aimbot
== 에임핵, 오토에임
구현 방식
게임 내 메모리를 읽어서 필요한 정보를 계산한 후 조준하는 방식
게임 화면의 이미지를 활용해서 타겟을 찾는 이미지를 서치하는 방식 (이 글에서 다루는 내용은 아님)
첫번째 방식에서도 적 위치 계산 방법에 따라 조준 방식이 나뉜다
- 각도 계산 → 화면 회전
- 화면 좌표 계산 → 마우스 이동
초록색에다가 맞출거다 치면 카메라를 파란 화살표처럼 회전하는 방식
→게임 메모리 내에 화면 방향을 제어하는 값을 변조해서 화면을 회전하는 것..
화면 회전 방식
게임 내 물체의 방향 표현
게임 맵 상에서 물체가 바라보는 방향 → 오일러 앵글로 표현
https://en.wikipedia.org/wiki/Euler_angles
Euler angles - Wikipedia
From Wikipedia, the free encyclopedia Description of the orientation of a rigid body Classic Euler angles geometrical definition. Fixed coordinate system (x, y, z) Rotated coordinate system (X, Y, Z) The Euler angles are three angles introduced by
en.wikipedia.org
이 글 참고 하면 좋을 듯
오일러 앵글은 물체가 놓인 방향을 3차원 공간에서 표현할 수 있는 각도로서 yaw, pitch, roll 축을 사용
이런 축 느낌
도는 방향도 위에 방향대로..
아무튼 회전하려면 각도를 계산해야함.
회전할 각도 계산
이건 삼각함수로 구한다.
파란점을 player, 빨간점을 enemy라하면 yaw를 알면 적을 향하게 회전이 가능함. 삼각함수 씌우면 되니가
그래서 아무튼 yaw를 알아야하는데 삼각함수는 삼각형의 길이를 알면 각도를 계산하는게 가능하다. 그래서 길이만 알면 탄젠트 씌워서 삼각비 알아내서 각도까지 알수 있다.(역삼각함수 사용..)
위 그림으로 따졌을 때 yaw를 알고싶다?
tan(yaw) = 1/루트3
yaw = ㅠ/6
일케 구하는 것
yaw만 알면 되는건 아니고 pitch 각도도 계산해야됨.
위에 시점이 xz평면인데 이거 그냥 xy평면으로 보면 아래처럼 된다.
pitch를 알아야되는데 x도 1일까? 당연히 그럴리가 없음
3차원으로 보면 쉬운데 3차원은 이렇게 생김
기하학적으로 봤을 때 그냥 2인걸 바로 계산할 수 있음 따라서 피치도 당연히 ㅠ/3일거고 수식으로 하려면 atan2()로 계산하면 됨.
위의 과정을 구현한 코드는 아래와 같다.
계산한 각도로 화면 방향 값 변형해서 적을 조준하는 코드임
구현 코드
// 오일러 앵글 구조체
struct Angle
{
float yaw, pitch;
};
// 적과 자신이 이루는 각도를 계산하는 함수, enemy벡터랑 my벡터 빼서 delta 벡터를 만듦
// 왜빼냐면 적이랑 플레이어랑 이루는 삼각형 벡터로 만들어야해서..
void CalcAngle(D3DXVECTOR3 *enemy, Angle *angle)
{
GetMyPos(&my); // 자신의 좌표를 구하는 의사 함수
D3DXVECTOR3 delta = *enemy - my; //회전시킬 각도 적이랑 내 위치 따라서 달라지니까 빼서 벡터로 각도 계산
float x, y, z, d;
x = delta.x;
y = delta.y;
z = delta.z;
d = sqrt(x*x + z*z); // 삼각형의 빗변 길이 (피타고라스의 정리)
angle->yaw = atan2(x, z);
angle->pitch = atan2(y, d);
}
// 적 좌표를 받아 적을 향해 조준점을 변경하는 함수
void SetAim(D3DXVECTOR3 *enemy)
{
Angle angle;
CalcAngle(enemy, &angle); //enemy 좌표 벡터를 인자로 받아서 계산한 각도를 angle 구조체에 저장
SetYaw(angle.yaw); // 자신의 yaw 값을 변경하는 의사 함수
SetPitch(angle.pitch); // 자신의 pitch 값을 변경하는 의사 함수, 이 셋함수 두개로 게임 내에서 내 yaw, pitch 메모리 변조 -> 화면 회전 및 에임변조
}
마우스 이동 방식
이번에는 이렇게 화살표 방향으로 마우스를 대상에 직선 이동해서 조준하는 방식이다
적 좌표 → 화면 좌표 → 거기로 마우스 이동해서 조준
이렇게 되는데 ESP를 사용하는 방식이라 ESP를 구현했으면 상대적으로 간단하다.
좌표 변환하고 나서 마우스 이동해야되는데 이거는 윈도우에서 입력 제어 API로 제공하는 함수가 있다 (SendInpt())
https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput
SendInput function (winuser.h) - Win32 apps
Synthesizes keystrokes, mouse motions, and button clicks.
learn.microsoft.com
인자로는 입력 보낼 개수, 입력 정보 포함한 버퍼, 버퍼의 개수를 사용한다.
구현 코드는 원문에서 확인하는게 낫구.. 마우스 제어 API를 사용하니까 아무튼 메모리 수정을 안해도 되긴한다.
이런 면에서 보면 간단할 수는 있는데 첫번째 단계인 적 좌표를 화면 좌표로 변환하는 과정이 필요한 데이터가 많아서 오히려 각도 계산보다는 계산이 복잡하다.
방식 비교
각도 계산해서 회전 | 화면 좌표 계산해서 마우스 이동 |
- 화면을 회전하여 조준 - 삼각함수 사용해서 회전 각도 계산 - 메모리 변조 필요 - 적이랑 본인 위치만 알면 계산 가능 |
- 마우스 이동해서 조준 - 적 좌표를 화면 좌표로 변환해야 됨 - 메모리 변조가 불필요하다. 마우스 제어 API 쓰니까 - 적, 본인 위치, 화면 좌표 변환시 사용 데이터로 계산해야돼서 복잡하다 |
'학회_공부해요 > 기술_스터디' 카테고리의 다른 글
[Theori] 게임핵의 원리(2) - ESP (0) | 2025.05.11 |
---|---|
[S2W] Detailed Analysis of DocSwap Malware Disguised as Security Document Viewer (0) | 2025.04.06 |
[ESTsecurity] Security Report 2025.03 보안동향보고서 (0) | 2025.04.01 |
[IGLOO] 공격 표면 관리(ASM)란 무엇인가요? (0) | 2025.03.23 |
[Theori] 게임핵의 원리(1) - Wall Hack (0) | 2025.02.19 |