프로그래밍/동방프로젝트 봇 만들기 8

7. 그리디 알고리즘 (1)

일단 인공지능에 대해 아는것이 잘 없고, 돌릴 환경이 못 되는 관계로 간단한 방식을 먼저 시도해보려고 한다.가장 단순한게 지금 상황에서 어디로 가는것이 가장 안전한가 를 판단해서 그 방향으로 이동하는 알고리즘을 생각하려고 한다.프레임 단위로 플레이어의 위치를 확인해본 결과 프레임당 $4$, 저속비행의 경우 $2$ 의 속력으로, 상하좌우 및 대각선 총 8가지 방향으로 움직일 수 있다. 따라서 현재 상황으로부터 어떤 위치에서의 가치를 측정한 다음 그리디 알고리즘을 이용해 가장 가치가 높은 곳으로 이동하는 알고리즘을 구현해보려고 한다. 그러면 '가치' 를 어떻게 파악하는데?일단 공격을 해야 하니 보스 바로 아래쪽의 특정 위치로부터 가까울수록 높은 가치를 주도록 하면 최대한 그곳으로 오려고 할 것이다. 이건 일..

6. 봇 구현을 위한 기본적인 플랫폼 만들기

지금까지의 정보들을 종합해서 깔끔하게 정리하면 다음과 같다. import ctypesimport psutilimport pymemimport timeimport numpy as npimport structimport threadingimport keyboardfrom reprint import outputfrom os import systemclass TouhouProcess: def __init__(self, game_name="th6.exe"): self.pid = self.get_process_by_name(game_name) self.process = pymem.Pymem(self.pid) if self.pid else None if not self.pr..

5. 탄막 위치 가져오기 (2)

진행상황 Step 1. 탄막 중 하나의 총알의 위치정보가 저장된 메모리의 주소를 찾기Step 2. 위에서 찾은 주소에 뭔가를 쓰는 함수를 찾기Step 3. 이 함수가 접근하는 구조체의 메모리 주소를 찾기Step 4. 함수의 동작으로부터 구조체의 구조를 역설계하기  이제 이 함수를 분석해보려고 한다. Step 3우선, 함수에서 가장 먼저 등장하는 변수 [ebp-40] 이 어떤 짓을 하는지 보면...th6.exe+135BB - mov [ebp-40],ecxth6.exe+135C5 - mov eax,[ebp-40]th6.exe+135C8 - mov ecx,[eax+000F5C00]......th6.exe+13A18 - mov eax,[ebp-40]th6.exe+13A1B - lea ecx,[eax+edx+00..

4. 탄막 위치 가져오기 (1)

정말 우연히도...내부적으로 위치 정보를 float로 저장한다는 것을 알게 되었다.알아낸 정보를 정리하면 다음과 같다.피탄 범위, 반지름 1.25x : [6caa80] ~ [6caa8c]y : [6caa84] ~ [6caa90] 플레이어 위치x: [6caa68]y: [6caa6c]그레이즈 범위 반지름 12x : [6caa98] ~ [6caaa4] y : [6caa9c] ~ [6caaa8] 우선.. 탄막 정보는 구조체의 배열로 저장되어 있을 가능성이 높다. 또한 게임 특성 상 많은 총알이 등장하므로 이전 탄막에서 사용한 메모리를 다시 사용할 가능성이 높았다. 따라서 배열의 시작 지점과 구조체의 크기 를 알아내는 것이 중요할 거라 생각하였다.  전략은 다음과 같다. Step 0. 일단 한판해서 리플레이 ..

3. 피탄봄 자동화 구현

내가 리버싱 ctf를 하는건지 거참 피탄봄을 구현하기 위해 다음과 같은 과정을 생각하였다.피탄 시 실행되어 잔기를 감소하도록 하는 함수를 찾는다.피탄 유예 시간동안 실행되는 함수를 찾는다.피탄 유예 시간을 저장하는 변수를 찾는다.해당 변수값의 변화를 이용해 피탄 여부 판단 후 봄을 사용하도록 구현한다.step 1앞에서 주솟값 0069d4b8(+29d4b8 ) 의 메모리에는 잔기값이 들어간다는 것을 확인하였다. 따라서, 이 값을 수정하는 함수를 먼저 찾아보자.친절하게도 치트엔진은 "여기 뭔가 쓰려고 오는 놈"들을 찾아주는 기능을 지원한다. 저걸 설정한 후 피탄당하면 다음과 같은 결과를 얻을 수 있다.step 2위의 결과에 따라, 00428DED 주소로 가면 아래 사진과 같이 00428DE6부터 살고있는 함..

2. 조작 기능 구현

저번과 마찬가지로, 노가다를 통해 플레이어와 보스의 가로축 위치를 저장하는 주소값을 찾았다. 플레이어 : +2CAA68(006CAA68)적기 (보스전에서는 보스 위치) : +2CB044(6CB044) 적기의 위치값의 경우, 아마 가장 앞에 있는 적의 위치를 말하는 것으로 추정된다.조작의 경우, 처음에는 메모리를 이용해 직접 조작을 하고싶었으나 일단은 키보드를 직접 조작하도록 하였다. 그 외의 데이터들은 다음과 같다. 아래는 단순히 적을 따라다니도록 구현한 코드이다.import timeimport keyboard # For sending keystrokesimport pymem # For reading memoryimport os# Define execution frequencyfreq = 1/60 ..

1. 변수 위치 찾기(1)

cheat engine을 사용해서 변수들의 위치 탐색.개쌉노가다중 점수 : +29bca0 (0069bca0 )  공격력 : +29d4b0 (0069d4b0 )(인게임에서는 128까지 가능.) graze : +29bcb4 (0069bcb4 ) 봄 & 목숨 개수 : +29d4b8 (0069d4b8)해당 주소의 값 = 2^32 * 점수에 의한 익스텐드(1UP)  횟수 + 2^24 *봄 개수+2^16 *목숨 + 리트횟수 (2^8 값 도대체 뭔지 모르겟다 죽을때마다 초기화되는데) 스테이지 : : +29d6d4 (0069d6d4)extra 스테이지는 7 시간 : +29d6d1 ~d2 (0069d6d1 ~d2) 패턴의 남은 시간 : +29bc48 (0069bc48) 플레이어 입력 : 0069d904 / 08 아무 입..