Reversing/GameHacking

GameHacking 4. 에임봇 핵의 동작원리에 대해

string_ 2023. 8. 17. 21:15

Aimbot ?

앞에서 FPS 게임의 월핵에 대해서 알아보았다면 이번에는 에임핵에 대한 글을 다뤄 보자 한다.

흔히 에임핵으로 불리는 에임봇은 사용자가 적을 직접 조준하지 않아도 자동으로 에임을 적에게 조준해 주는 핵을 말한다.

 

내가 직접 Target을 조준하지 않아도 자동으로 Target을 조준하는 작업을 해주는

프로그램이 있다면 이 얼마나 편할 것인가?

게임 플레이에 있어 월핵만큼 영향을 많이 줄 수 있는 핵이라 볼 수 있다.

 

 

 

에임봇핵의 구현방식은 어떻게 될까?

에임(커서)를 적에게 자동으로 조준시킬 수 있는 방법은 꽤나 몇 가지가 존재한다.

 

각도를 계산하여 내 Camera를 회전시킨다.

ㄴ회전할 각도를 계산하여 내 Camera를 회전시켜 적을 조준하는 일반적인 에임봇 방식.

 

화면좌표로 계산하여 마우스 좌표를 이동시킨다.

ㄴ ESP 월핵처럼 화면 좌표로 변환 후 계산하여 Win32Api()를 통해 마우스 좌표를 이동시키는 방법

 

화면의 이미지나 픽셀을 서치하여 해당 좌표로 마우스 좌표를 이동시킨다.

ㄴ 캐릭터 텍스처나 특정 이미지를 서치하여 해당 좌표로 마우스 좌표를 이동

 

Character에 색상을 입혀 조준하는 Color Aimbot의 한 장면

 

물리적인 방식으로 구현한 하드웨어 에임봇(?)도 존재한다..

https://www.ciokorea.com/news/234979

 

마우스 실제 이동시켜 적 겨냥··· 한 유튜버의 하드웨어 에임봇 ‘눈길’

배틀 그라운드, 오버워치와 같은 슈팅 게임을 즐긴다면 아마 ‘에임봇’을 알고 있을 터다. 적을 자동으로 겨누는 이 치팅 소프트웨어는 오늘날 온라

www.ciokorea.com

 

 

또한 콘솔 게임에서(PS4 , XBOX)의 에임봇도 구현 한 사례도 보인다.

캡처된 화면을 PC로 전송하여 머신러닝을 적용하여 각 물체를 인식 후 입력신호를 줘서

적을 조준하는 방식의 에임봇이라 한다.

다만 물체만 인식하는 에임봇 구조상 세부적인 구분이 힘들어

가끔 엉뚱한 물체를 조준하는 버그가 존재하거나

(팀 구분, 생사 구분 , 일부 적) 등 세부적인 인식이 불가능하므로

한계점이 명확하여 주로 사용되는 사례는 많이 나오지 않는 것 같다.

https://youtu.be/C09eTyYOfwM

 

 

 

에임봇 구현을 위해 필요한 데이터

여러가지 방법으로 에임봇을 구현할 수 있지만

카메라를 회전하는 방식의 에임봇에 대해 실습을 해보려 한다.

 

해당 방식의 에임봇을 구현하기 위해 필요한 데이터는

내 좌표 xyz와 적 좌표 xyz가 필요하고 세부적인 구분을 위해 

팀 구분, 생사 구분에 대한 값이 필요하므로 Entity List를 구한다.

또한 게임에서 카메라를 회전하기 위해 카메라의 방향을 제어하는 값이 필요하겠다.

 

 

FPS 게임에선 카메라가 물체를 바라보는 방향을 3차원 공간에서 표현할 수 있고

yaw , pitch , roll이라는 축이 존재한다.

 

해당 축을 카메라 방향으로 표현하면

Roll 은 X축을 기준으로 회전반경을 나타내고

Pitch는 Y축을 기준으로 회전반경을 나타낸다.

Yaw는 Z축을 기준으로 회전반경을 나타낸다.

 

Yaw / Pitch / Roll

 

해당 축을 비유하여 나타내기 위해 비행기의 움직임을 예로 설명한다.

 

https://howthingsfly.si.edu/flight-dynamics/roll-pitch-and-yaw

 

비행기의 움직임이 중심으로 돌게 될 시 Roll

위아래로 움직임을  Pitch , 좌우로 움직임을 Yaw라고 할 수 있다.

 

게임에선 이렇게 카메라를 회전하여 화면 방향을 바꾼다.

이 앵글을 표현한 Pitch , Yaw 값을 담당하는 메모리 주소를 찾아 

두 벡터가 이루는 각도를 계산하기 위하여 삼각 함수를 이용하여 계산 후

적을 조준하기 위한 카메라의 회전할 각도를 구할 수 있다.

 

atan2

 

나와 상대의 x , y 좌표상 거리는 알고 있으니 세타값을 구해야 한다.

Player 좌표를 (0,0,0)으로 Enemy 좌표를 (x, y, z)라고 가정하고

두 플레이어 사이간 이루는 각도 Yaw를 구하는 것이 계산의 목표이다.

 

해당 계산은 역탄젠트 함수를 이용하면 값을 구할 수 있다.

Win32Api에서 tan 역함수인 atan2()를 이용한다.

tan역함수를 이용하여 각도를 구하는 코드는 다음과 같다.

 

Atan2

Atan2()는 점의 x , y 좌표를 인수로 받아 각도를 반환해 주는 함수이다.

 

angles.x = -atan2f(dst.x - src.x, dst.y - src.y) / PI * 180.0f + 180.0f;

높이(y) , 밑변(x) 값으로 각도(Yaw)를 구한다.

Yaw 각도를 구했으면 Pitch 각도를 구하여야 한다.

 

asin

아크사인을 계산하는 함수인 asin()을 이용하여 Pitch 각도를 구해주었다.

 

angles.y = asinf((dst.z - src.z) / GetDistance(src, dst)) * 180.0f / PI;
float GetDistance(D3DXVECTOR3 src, D3DXVECTOR3 dst)
{
    return sqrtf(
        powf(dst.x - src.x, 2.0f) +
        powf(dst.y - src.y, 2.0f) +
        powf(dst.z - src.z, 2.0f)
    );
}

 

 

회전할 각도를 구했다면 거의 완성되었다 보면 된다.

 

더 디테일하게 작동시키기 위해

EntityList에서 생사체크를 담고 있는 데이터와 , 아군인지 식별하기 위해 Team Number

가져와서 구분해주는 코드를 작성해 주었다.

 

해당 에임봇은 Visible(벽구분)을 체크하지 않는 에임봇이기 때문에

장애물 뒤의 적을 조준하게 되면 벽을 계속해서 바라보는 현상이 발생 할 수 있다.

이는 플레이를 하는데 방해요소가 될 수 있기떄문에

 

GetAsyncKeyState()를 이용하여

마우스 오른쪽버튼을 눌렀을떄를 감지하여

마우스 오른쪽버튼을 눌렀을떄만 작동하게끔 작성하였다.

 

※ 마우스 오른쪽 버튼을 눌러도 장애물 뒤의 적을 조준하는 현상은 해결되지 않는다.

이를 완벽히 해결하기 위해선 게임 엔진 내에서 구현되있는 장애물검사를 하는 함수를 찾거나

플레이어 구조체 내에서 적이 보여지는 상태인지 아닌지 담당하는 데이터를 저장하는 경우가 있기떄문에

해당 데이터를 가져와서 장애물 구분을 하여야 한다.

 

계산한 각도로 Camera 회전하여 적을 조준하는 전체 코드는 다음과 같다.

	if (*(BYTE*)DeadCheck == 0) {
            for (i = 0; i < *(BYTE*)PlayerCount - 1; i++) {

                GetEnemyPos(i);
                EnemyTeam = *(BYTE*)(EntityBase + Team);
                DeathCheck = *(BYTE*)(EntityBase + Death);
                WriteConsoleLog(i);

                if (*(BYTE*)MyTeam == EnemyTeam)
                    continue;
                if (DeathCheck == 1)
                    continue;

                if (GetAsyncKeyState(VK_RBUTTON) & 0x8000) {
                    D3DXVECTOR3 Angle = CalcAngles(MyCoord, EnemyCoord);
                    *(float*)CalcYaw = Angle.x;
                    *(float*)CalcPitch = Angle.y;
                }
                break;

            }
        }

 

Aimbot 작동 영상

 

 

마치며

에임봇의 동작 원리의 대해서 알아보았다.

여러 방식의 에임봇 구현이 가능한 사례를 알아보았고

그중 Camera를 회전하여 적을 조준하는 에임봇은

적과 나 사이 간의 벡터 계산, 역삼각함수를 통하여 계산하는 과정이

필요하다는 것을 알 수 있었다.