정말 우연히도...내부적으로 위치 정보를 float로 저장한다는 것을 알게 되었다.
알아낸 정보를 정리하면 다음과 같다.
피탄 범위, 반지름 1.25
x : [6caa80] ~ [6caa8c]
y : [6caa84] ~ [6caa90]
플레이어 위치
x: [6caa68]
y: [6caa6c]
그레이즈 범위 반지름 12
x : [6caa98] ~ [6caaa4]
y : [6caa9c] ~ [6caaa8]
우선.. 탄막 정보는 구조체의 배열로 저장되어 있을 가능성이 높다. 또한 게임 특성 상 많은 총알이 등장하므로 이전 탄막에서 사용한 메모리를 다시 사용할 가능성이 높았다. 따라서 배열의 시작 지점과 구조체의 크기 를 알아내는 것이 중요할 거라 생각하였다.
전략은 다음과 같다.
Step 0. 일단 한판해서 리플레이 파일 하나 만들고 그거 계속 돌리기
Step 1. 탄막 중 하나의 총알의 위치정보가 저장된 메모리의 주소를 찾기
Step 2. 위에서 찾은 주소에 뭔가를 쓰는 함수를 찾기
Step 3. 이 함수가 접근하는 구조체의 메모리 주소를 찾기
Step 4. 함수의 동작으로부터 구조체의 구조를 역설계하기
Step1
총알 하나의 위치를 찾기 위해 다음과 같은 과정을 수행하였다.
-1. 직접 조작하는 것을 통해 위치값의 범위를 알아내었다.
x범위는 [6caa68] 기준 8에서 376
y범위는 [6caa6c] 기준 16에서 432
현재 화면에 등장한 총알의 y값을 저장하는 메모리를 찾아주려면 float형으로 432보다 작은 값을 우선 검색해주면 된다.
-2. 플레이어 위치를 기준으로 필터링
graze메모리 [69bcb4] 에 write breakpoint를 걸어주면 graze가 올라가기 직전, 이렇게 퍼즈가 걸린다.
그러면 플레이어 y좌표 428 근처의 값을 가지는 float변수를 스캔하면 다음과 같다.
3만개 정도가 뜨지만, 02a3a534부터는 우리가 관심있는 영역이 아니다. 따라서 사실 후보가 몇개 남지 않았다는 것을 알 수 있다. 화면에서 총알이 사라졌으므로 0이 된 값을 가지는 메모리만 필터링하면 다음과 같다.
그러면 th6.exe+1DA9D8 는 어떤 총알의 y좌표를 저장한다는 것을 알 수 있다.
Step2
이제 이 주소에 다시 write breakpoint를 걸면 탄막을 생성할 때 실행되는 함수가 걸려들거라고 기대할 수 있다.
기다린 결과, th6.exe+139E1 에서 접근해오는 것을 확인하였다. 아마 이 함수가 탄막을 생성하는 함수일 것이라 추정할 수 있다. 우클릭 > Select current function 을 해서 이 함수를 따로 빼주도록 하자.
대략 800줄 짜리 함수를 얻을 수 있다. 이제 이 함수를 분석하면 탄막 구조체 위치를 찾을 수 있다.
'프로그래밍 > 동방프로젝트 봇 만들기' 카테고리의 다른 글
6. 봇 구현을 위한 기본적인 플랫폼 만들기 (0) | 2025.02.23 |
---|---|
5. 탄막 위치 가져오기 (2) (0) | 2025.02.20 |
3. 피탄봄 자동화 구현 (0) | 2025.02.16 |
2. 조작 기능 구현 (0) | 2025.02.16 |
1. 변수 위치 찾기(1) (0) | 2025.01.22 |