https://www.veed.io/view/afdf352d-8272-4be3-9af1-3064b5d21d52?panel=share > 결과물
자 오토에임과 ESP를 구현하려면 우선 내 정보와 적의 정보가 있어야한다.
왜냐고? 내 좌표를 기준으로 적 좌표와 계산해서 거리나 각도를 계산 해야하기 때문이다.
그럼 우리는 이전 편에서 앵글을 찾았으니 내좌표와 적좌표만 가져온다면 오토에임은 만들 수가 있을 것이다.
자 그럼 내 좌표와 적 좌표를 어떻게 찾는지 한번 알아보자.
자 먼저 플레이어의 정보를 담은 리스트인 (Entity List)를 어떻게 찾냐하면 나의 체력을 통해 찾는다.
왜냐고? 게임을 개발할 때 플레이어의 정보를 예를들어 아래와 같은 코드로 구현하기 때문이다.
typedef struct CCPlayerInfo
{
bool IsAlive;
char Nickname[16]
BYTE IsGod;
...
int HP;
}TPlayerInfo;
그러면 체력을 찾으면 같은 구조체안에 여러 정보가 담겨있을 확률이 높겠지? 이건 당연하다. 개발할 때 취해서 하지 않는 이상 효율성이나 패킷통신 때문에 구조체를 쓸 수 밖에 없다. 자 그래서 우리는 내 체력부터 찾아볼거다.
먼저 초기 체력이 100이니 100을 스캔하고 낙뎀을 받아서 91인 상황이다. 따라서 91을 스캔했다.
초록값은 찾아볼 수 없다. 왜그럴까? 이유는 나도 모른다. 어찌됐든 해킹방지 목적이든 메모리 관리 목적이든 개발단에서 이렇게 개발한거다.
그럼 우리는 저 값에서 포인터를 딸 수 있는 값을 찾아야한다. (초록색 정적 베이스값)
자 실제 체력이 변경되는 부분은 저 값이지만 저 값은 우리가 원하는 값이 아니다. 이유는 다음에 나온다.
저기 나온 14개의 값에 하나하나씩 Ctrl + f5 일명 파앗을 걸어보면 어느 값에서 위와 같이 나오는 것을 볼 수 있다.
rcx 레지스터 + 344가 내 체력을 향하고 있다는 뜻이다.
그럼 rcx에 담긴 값이 초록색 정적 주소인 베이스값이 되겠고
344가 오프셋이 되겠다.
RCX에는 000002462CB509C0이 담겨있다. 이 값을 담고있는 녀석이 베이스 값이 되므로 16진수를 체크하고 RCX에 담긴 값을 스캔해보자.
자 그럼 client.dll을 베이스로한 정적 주소 두개가 나왔다. 왜 두개나 나왔을까?
생각해보면 RCX + 344가 체력이라고 했는데 체력을 가르키는 값이 두개??
고민을 해보면 하나는 내 플레이어정보, 다른하나는 모든 플레이어의 정보를 담고있는 놈이 될 것이다.
자 그럼 진짜인지 확인해보자.
첫번째 값의 주소를 복사하고 메모리뷰에 가서 도구 > 구조체 분석을 가보자.
주소를 붙여넣고 새로운 구조체를 정의하면 된다.
자 그러면 저 주소를 읽은 값에 CSPlayerPawn라는 놈이 담기는데 이게 뭘까? 궁금하면 들어가봐라
0에 들어가서 344번지를 가면(오프셋) 현재 내 체력이 담겨있는 것을 볼 수 있다.
자 그럼 똑같이 두번째 값도 해본다. 여기에도 내 체력이 담겨있다.
흐음.. 왜 둘다 나를 가리키는거지? 이유는 간단했다.
게임방에 나밖에 없었다. 그래서 봇을 추가해보았다.
봇을 하나 추가하니까 두번째 값의 10번째 자리수에 똑같은 객체가 하나 늘었다. 그럼 확인해봐야겠지?
일단 0번째부터 가서 체력을 본다. 현재 90인 내 체력을 가리키고 있다.
그럼 10에 들어가서 344번지를 보면? 체력이 100이다. 이건 봇의 체력이겠지
그럼 여기서 우리는 베이스 주소 + 0x344가 체력이라는걸 알게되었다.
그리고 첫번째 주소는 내 플레이어 베이스, 두번째 주소가 엔티티 리스트임을 확인했다.
그리고 그 엔티티 리스트는 10의 배수로 존재한다.
예를 들어 플레이어가 4명이면
플레이어 1 = 0
플레이어 2 = 10
플레이어 3 = 20
플레이어 4 = 30
이런 번지수로 가는거다.
그럼 플레이어 4의 체력을 가져오는건 어떻게할까?
(베이스주소 + 30) + 344가 되는거다.
그럼 이제 좌표를 찾아보자.
좌표는 일일이 멈췄다 움직였다 반복해서 감소 증가 언노운 스캔을 통해 찾아볼 수 있지만 콘솔 명령어를 통해 좌표 출력이 가능해서 간단하게 따보겠다.
원래는 이런기능이 없으니 움직여서 따야한다 참고만 해야한다.
자 아까 엔티티 리스트 구조체에서 현재 내 X좌표인 274를 찾아보니까 DB8번지에 존재한다. 그다음 번지에는 Y 그리고 Z가 존재한다.
그럼 좌표의 오프셋은 DB8이 된다.
마지막으로 정리해보면
베이스 주소 + 344는 체력
베이스 주소 + DB8은 좌표
이렇게 되는거다.
다음 강의는 실제로 코딩을 통해 구현해보겠다.
제목 | 작성자 | 작성일 | 조회 | |
---|---|---|---|---|
공지 | 01-29 | 529 |
댓글0