Автоматизация рыбной ловли для World of Warcraft

Познакомился с World of Warcraft очень давно и люблю его весь, но одна вещь больше всего не давала мне покоя — рыбная ловля. Это нудное повторяющееся действие, где ты просто нажимаешь на кнопку рыбной ловли и тыкаешь на поплавок раз в 5-15 секунд. Мой навык разработки рос, а ситуация с рыбной ловле так и не улучшалась с каждым годом что я играл, поэтому я решил убить двух зайцев сразу — начать осваивать python и всё же сделать бота для себя.

Я уже видел ботов, которые умеют ловить рыбу, работающие в свернутом режиме не перехватывая управления над компьютером. Также я знаю насколько беспощадны близард по вопросам банов читеров. Изменение данных в оперативной памяти легко определяется встроенным античитом. Ну и последнее — на мак я не нашёл ни одного бота.

Поэтому я решил закрыть все эти вопросы разом и сделать бота, который будет перехватывать управление мыши, кидать поплавок, и тыкать на него на экране когда нужно. Как я полагал python располагает широким выбором инструментов для автоматизации таких штук, и не ошибся.

Немножечко погуглив, я нашёл OpenCV, в котором есть поиск шаблону с не сложным гайдом. С помощью него мы и будем искать наш поплавок на экране.

Сперва мы должны получить саму картинку с поплавком. Ищем и находим библиотеку pyscreenshot с гайдом как делать скриншоты, немножечко редактируем:

import pyscreenshot as ImageGrab

screen_size = None
screen_start_point = None
screen_end_point = None

# Сперва мы проверяем размер экрана и берём начальную и конечную точку для будущих скриншотов
def check_screen_size():
	print "Checking screen size"
	img = ImageGrab.grab()
	# img.save('temp.png')
	global screen_size
	global screen_start_point
	global screen_end_point

	# я так и не смог найти упоминания о коэффициенте в методе grab с параметром bbox, но на моем макбуке коэффициент составляет 2. то есть при создании скриншота с координатами x1=100, y1=100, x2=200, y2=200), размер картинки будет 200х200 (sic!), поэтому делим на 2
	coefficient = 2
	screen_size = (img.size[0] / coefficient, img.size[1] / coefficient) 

	# берем примерно девятую часть экрана примерно посередине.
	screen_start_point = (screen_size[0] * 0.35, screen_size[1] * 0.35)
	screen_end_point = (screen_size[0] * 0.65, screen_size[1] * 0.65)
	print ("Screen size is " + str(screen_size))

def make_screenshot():
	print 'Capturing screen'
	screenshot = ImageGrab.grab(bbox=(screen_start_point[0], screen_start_point[1], screen_end_point[0], screen_end_point[1]))
	# сохраняем скриншот, чтобы потом скормить его в OpenCV
	screenshot_name = 'var/fishing_session_' + str(int(time.time())) + '.png'
	screenshot.save(screenshot_name)
	return screenshot_name

def main():
	check_screensize()
	make_screenshot()


Получаем примерно следующую картинку:



Далее — найти поплавок. Для этого у нас должен быть сам шаблон поплавка, который мы ищем. После сотни попыток я всё таки подобрал те, которые OpenCV определяет лучше всего. Вот они:



Берём код из ссылки выше, добавляем цикл и наши шаблоны:

import cv2
import numpy as np
from matplotlib import pyplot as plt

def find_float(screenshot_name):
	print 'Looking for a float'
	for x in range(0, 7):
		# загружаем шаблон
		template = cv2.imread('var/fishing_float_' + str(x) + '.png', 0)
		# загружаем скриншот и изменяем его на чернобелый
		src_rgb = cv2.imread(screenshot_name)
		src_gray = cv2.cvtColor(src_rgb, cv2.COLOR_BGR2GRAY)
		# берем ширину и высоту шаблона
		w, h = template.shape[::-1]
		# магия OpenCV, которая и находит наш темплейт на картинке
		res = cv2.matchTemplate(src_gray, template, cv2.TM_CCOEFF_NORMED)
		# понижаем порог соответствия нашего шаблона с 0.8 до 0.6, ибо поплавок шатается и освещение в локациях иногда изменяет его цвета, но не советую ставить ниже, а то и рыба будет похожа на поплавок
		threshold = 0.6
		# numpy фильтрует наши результаты по порогу
		loc = np.where( res >= threshold)
		# выводим результаты на картинку
		for pt in zip(*loc[::-1]):
		    cv2.rectangle(src_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
		# и если результаты всё же есть, то возвращаем координаты и сохраняем картинку
		if loc[0].any():
			print 'Found float at ' + str(x) 
			cv2.imwrite('var/fishing_session_' + str(int(time.time())) + '_success.png', src_rgb)
			return (loc[1][0] + w / 2) / 2, (loc[0][0] + h / 2) / 2 # опять мы ведь помним, что макбук играется с разрешениями? поэтому снова приходится делить на 2

def main():
	check_screensize()
	img_name = make_screenshot()
	find_float(img_name)
	

Итак, у нас есть координаты поплавка, двигать курсор мыши умеет autopy буквально с помощью одной строки, подставляем свои координаты:

import autopy

def move_mouse(place):
	x,y = place[0], place[1]
	print("Moving cursor to " + str(place))
	autopy.mouse.smooth_move(int(screen_start_point[0]) + x , int(screen_start_point[1]) + y)

def main():
	check_screensize()
	img_name = make_screenshot()
	cords = find_float(img_name)
	move_mouse(cords)


Курсор на поплавке и теперь самое интересное — как же узнать когда нужно нажать? Ведь в самой игре поплавок подпрыгивает и издает звук будто что-то плюхается в воду. После тестов с поиском картинки я заметил, что OpenCV приходится подумать пол секунды прежде чем он возвращает результат, а поплавок прыгает даже быстрее и изменение картинки мы врядли сможем определить с помощью OpenCV, значит будем слушать звук. Для этой задачки мне пришлось поковырять разные решения и остановился вот над этим — пример использования гугл апи для распознавания голоса, оттуда мы возьмём код, который считывает звук.

import pyaudio
import wave
import audioop
from collections import deque
import time
import math

def listen():
	print 'Listening for loud sounds...'
	CHUNK = 1024
	FORMAT = pyaudio.paInt16
	CHANNELS = 2
	RATE = 18000 # битрейт звука, который мы хотим слушать
	THRESHOLD = 1200  # порог интенсивности звука, если интенсивность ниже, значит звук по нашим меркам слишком тихий
	SILENCE_LIMIT = 1  # длительность тишины, если мы не слышим ничего это время, то начинаем слушать заново

	# открываем стрим
	p = pyaudio.PyAudio()

	stream = p.open(format=FORMAT,
	                channels=CHANNELS,
	                rate=RATE,
	                # output=True, # на мак ос нет возможности слушать output, поэтому мне пришлось прибегнуть к использованию <a href="https://github.com/RogueAmoeba/Soundflower-Original">Soundflower</a>, который умеет перенаправлять канал output в input, таким образом мы перехватываем звук игры будто это микрофон 
	                input=True,
	                frames_per_buffer=CHUNK) 
	cur_data = ''
	rel = RATE/CHUNK
	slid_win = deque(maxlen=SILENCE_LIMIT * rel)
	
	# начинаем слушать и по истечении 20 секунд (столько максимум длится каждый заброс поплавка), отменяем нашу слушалку.
	success = False
	listening_start_time = time.time()
	while True:
		try:
			cur_data = stream.read(CHUNK)
			slid_win.append(math.sqrt(abs(audioop.avg(cur_data, 4))))
			if(sum([x > THRESHOLD for x in slid_win]) > 0):    
				print 'I heart something!'
				success = True
				break
			if time.time() - listening_start_time > 20:
				print 'I don\'t hear anything during 20 seconds!'
				break
		except IOError:
			break
	# обязательно закрываем стрим
	stream.close()
	p.terminate()
	return success

def main():
	check_screensize()
	img_name = make_screenshot()
	cords = find_float(img_name)
	move_mouse(cords)
	listen()

Последнее, что осталось — споймать саму рыбку, когда мы услышим звук, снова используем autopy:

def snatch():
	print('Snatching!')
	autopy.mouse.click(autopy.mouse.RIGHT_BUTTON)

def main():
	check_screensize()
	img_name = make_screenshot()
	cords = find_float(img_name)
	move_mouse(cords)
	if listen():
		snatch()

По моим тестам, что я оставлял бота рыбачить по ночам, за неделю такого абуза он сделал около 7000 бросков и словил поймал около 5000 рыб. Погрешность 30% вызвана тем, что иногда не получается отловить звук или найти поплавок из-за освещения или поворотов поплавка. Но результатом я доволен — впервые попробовал python, сделал бота и сэкономил себе кучу времени.

Полный код можно посмотреть тут, но очень советую не использовать для абуза фишинга, ибо автоматизация процессов игры нарушает пользовательское соглашение и можно получить бан.

Буду рад любым комментариям.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 78

    +2
    После прочтения вспоминается старый-добрый UOpilot. Интересно, он есть на Маке?
      0

      Он умел распознавать картинку?

        0
        Цвет пикселя под курсором. Или в заданных координатах тоже — уже не помню.
          0

          Ну вот как-то сложновато выходит, ведь освещение меняется и поплавок качается, и свой алгоритм по вычислению поплавка — немножко другая задача.
          Я думал что проще вычислять изменения курсора, ибо когда наводишь на поплавок, он меняется иконку на крючок, но не нашел апи курсора и не курсор сам в скриншот не попадает.

            0
            Ну для работы с цветом там довольно хорошие функции:
              0
              Можно было вебкамерой курсор снимать, а мышку механически двигать — только хардкор, заодно и от античитов должно помочь.

              Ещё периодически «ходить покурить», сворачивать игру, переключаться на фэйсбучег и т.п — когда-то давно, уже не помню, для какой игры, я так записывал макросы родной майкрософтской программулиной.
                +1
                Для этого нужно будет ставить зеркало перед маком, чтобы он смог видеть своей встроенной вебкамерой что происходит на экране. Да и в электронике я слаб, так что механическое изменение положения мышки для меня сложнее, хотя идея механически использовать трекпад несколько проще, вам не кажется?
                  0
                  Все же проще купить USB Web-камеру с драйверами под мак, чем ставить зеркало. Насчет трекпада не уверен, с шариковой мышкой может быть тогда еще проще. Можно кстати взять ездящую платформу как у многих 3D принтеров, установить вместо сопла сенсор мыши (лазерный/оптический) и двигать платформу относительно сенсора.
                    +1
                    Хардкор хардкором, но проще взять какой-нибудь микроконтроллер с поддержкой USB и симулировать обычную HID мышку
                      0
                      ¯\_(ツ)_/¯ Ну мы не ищем легких путей и любим создавать себе проблемы с заделом на будущее
                0

                Сразу вспомнил была статья про то, как сделали бота для аукциона и почты в WoW используя AutoIT и внутриигровой аддон: https://habrahabr.ru/post/113258/

              0

              AutoIT умеет распозновать разницу. Я использовал его в Линейке, находил статическую позицию и использовал как торгового бота с автоматизацией ответа. Вещи за ночь продавал :)

            +3
            Хорошая идея, но Вам прилетит бан в следующем «бан-вейве». Вы действительно думаете, что до того, как лезть в память, никто не искал поплавок на экране? :)
            Я уверен Вы попались сразу же по движению курсора, которое не характерно реальному человеку, а идёт ровно от Х1, Y1 до X2, Y2.
              0

              Конечно искали, но статьи такой я не нашел и подумал было бы интересно написать — мало ли в каких других ситуациях или играх понадобится такая штука.
              Можно про «бан-вейв» подробнее? Уже прошло пару месяцев как я последний раз его запускал и пока ничего страшного не произошло.

                +2

                Да множество случаев. Устраивают не часто, может и полгода полет будет успешный, как повезет

                  +2

                  Тогда это будет наконец достойный повод завязать. Но пока бана нет — это того стоило

                    +1
                    Сделайте второй аккаунт, создайте гильдию и прячьте деньги в гильд-банк. Аккаунт с ботом, скорее всего, забанят, а вот деньги из ГБ не забирают :)
                      0
                      Если речь о деньгах, то заработал всего тысячу-полтора за эту неделю ночных абузов, так что не очень выгодно, но ведь маунта, ачивки и игрушки не скинешь… (Только не смейтесь)
                        +2
                        Второй аккаунт на это же имя и слёзно просить саппорт объеденить их
                      0

                      Не надо завязывать! Надо усовершенствовать AI, делать его ближе к реальному человеку, чтоб было сложно отличить. В этом же самый смак.

                      0
                      Последние новости о «волнах», кстати, это не боты, это живые игроки, продававшие всякие внутриигровые услуги за реальные деньги. Но по ботам раз-другой за год тоже проходятся. Другое дело, что баны ботов, в основном, направлены на конкретных ботов. Например, сегодня банят тех, кто использовался определённого популярного бота, прожимающего оптимальную ротацию, завтра банят платного популярного рыболовного бота.

                      Как разбираются с такими вот «уникальными» и мелкими ботами я не знаю. Возможно, индивидуально, по жалобам игроков.
                        0
                        > Как разбираются с такими вот «уникальными» и мелкими ботами я не знаю. Возможно, индивидуально, по жалобам игроков.

                        Я уверен, что именно так и делается. Просто производится ручная проверка. А автоматический банхаммер неэффективен по причине большого количества ложных срабатываний.
                    0
                    Добавить немного шума в итоговые координаты + сделать шанс на «случайный» промах по поплавку. Чем это будет отличаться от реального человека? Разумеется, за 20 часов мимо может много раз кто-то пробежать, заговорить, не получиться ответ и кинуть репорт, но это уже вообще другой разговор)
                      0
                      Еще можно двигать курсор с ускорение. И добавить редкие рандомные движения курсора по экрану в случайные отрезки времени. И время от времени открывать инвентори, или статы какие-то.
                        +3
                        И переписку с другим ботом, которого нужно будет сделать специально чтобы поддерживать «жизнь» нашего рыболова. Благо достаточно всяких апи с говорящими ботами.
                        +3
                        заказать внутриигровую майку:
                        «1. Только пришел
                        2. Не клюёт
                        3. На червя
                        4. Водку буду»
                      0
                      Недавно была статья про openai играет в доту, тоже на питоне. Но там задача значительно сложнее, как они решают эту проблему определения где что на экране? мб есть идеи?
                        0

                        Я знаю, что Source 2 довольно не новый движок, и его уже перековыряли со всех сторон. Есть боты же и для CS:GO и для той же доты, которые взрывают бомбы минеров по нужному количеству хп у противников в любой части карты.
                        Так что вполне возможно и внедрение. То, что было на The international, я думаю это обычное подключение бота через апи самого Source 2 — есть же обычные боты и в доте и в CS:GO.


                        Кроме того — я же не претендую на статью об искусственном интеллекте. Возможно их бот работает на очень мощном железе и его писали ребята, которые делают очень большие проекты на openai. Тогда они вполне могли бы и картинку обрабатывать на уровне повыше обычного метчинга темплейтов. Как раз совсем недавно общался на эту тему со знакомым, который предлагал мне сделать на python искусственный интеллект, который смог бы играть в Gravity Defied используя только картинку, но я пока не решаюсь переписывать Gravity Defied на python.

                          0
                          Кстати вот и пост самих разработчиков.
                          0
                          Чтобы уменьшилась вероятность бана, я бы добавила рандомные перерывы в рыбалке. Не может обычный человек играть без перерыва на пару минут всю ночь.
                            0
                            Тогда уже и рандомные перемещения курсора и паузы между кликами.
                            Ну и по поводу «всей ночи» — Вы сильно недооцениваете школьников или корейских игроков)
                              0
                              Уже не школьники были и не корейцы, но так с братом и играли, с вечера я (мне утром нужно было на работу вставать), часа в два ночи будил брата, он потом играл до утра. Не в WoW, правда.
                              0
                              Да ну? Не может обычный человек в РЕАЛЕ ловить рыбу по 10 часов каждую ночь, в течении последних 10 лет, включая снег и дождь(у нас так пенсионеры делают).
                              0
                              В свое время делал очень странного бота для Rift.
                              У рыбалки там несколько стадий. На тот момент был готовый бот, который использовал лог-файл игры для определения этих стадий, но, насколько помню, самая важная стадия(поклевка) в логе не отображалась и бот использовал какое-то решение, которое по какой-то причине меня не устроило(а может, просто захотелось написать свой собственный, не помню).
                              В итоге получилось забавно — я в силу своих скромных способностей в реверсе приложений умудрился найти только функцию, отвечающую за воспроизведение звуковых файлов. В итоге перехватывал эту функцию и, в случае воспроизведения соотв. поклевке файла, производил необходимые действия.
                              В итоге получилось что-то средней монструозности, но, на удивление, более-менее эффективное: за относительно короткий срок вкачал рыбалку на максималку и еще какое-то время неплохо зарабатывал на рыбе.

                              Но вообще лучший бот, который я когда-либо использовал — https://www.solarstrike.net/ для Runes of Magic. Логика на xml+lua шикарна, бот предоставляет базовый набор функций+куча функционала и готовых waypoint'ов от других пользователей + никто не мешает писать свою логику. Чего там только народ не ваял)
                                +1
                                Воспользуйтесь опытом поколений! Добавьте случайные (именно случайные, а не луповые) вариации в движении курсора, в скорости реакции, во всех возможных действиях. А то ведь отловят.
                                  –2
                                  Мне тут товарищ подкинул идею попроще: труд детей. Своих, разумеется.
                                  В армии с детьми проще (для командиров).
                                    +1

                                    Неспортивно предлагать такое на ресурсе программистов.

                                    0
                                    Статья интересная, но думаю лучше добавить предупреждение в начале (или в конце) что эти действия нарушают пользовательское соглашение.
                                    PS интересно есть ли смысл делать полностью внешнего бота (с веб-камерой и аппаратным эмулятором мыши) для того что бы затруднить его обнаружение?
                                      +1
                                      Done.

                                      У нас есть соседняя компания, которая занимается электроникой. Они думают, что мы занимаемся фигнёй, программируя всякие штуки, ведь все это можно сделать с помощью микросхем, механики и физики. Мы думаем то же самое о них, ведь зачем брать в руки паяльник, если клавиатуры достаточно. Так что может и есть смысл, если так проще для конкретного разработчика

                                      На самом деле у меня не было задачи полностью скрыть использование бота, но избежать автоматического бана античита, у которого неопровержимые доказательства изменения памяти игры. Конечно запись координат курсора — тоже неопровержимое доказательство, но мне кажется это уже дикость следить за таким.
                                        0
                                        Я просто думал на тему более хитрого бота — что бы ротацию крутить (последовательность способностей), распознавая иконки статуса персонажа, но опасения бана и лень оказались сильнее.
                                          0
                                          В WoW настолько суровый античит? Я просто играл в Lineage 2 на офсервере — там использовался GameGuard, но исключительно как пассивное средство, мешающее работать ботам (на самом деле нет), но не стучащее о подозрительном софте и изменении памяти процесса на сервер.

                                          Ну а что касается от отслеживании координат и их рандомизации — мне кажется, это бесполезная затея. Игровые клиенты — толстые клиенты, они отправляют на сервер действия, а не движения мышки и клики. Возможно, античит логирует локально все движения мышки, но крайне маловероятно, что делает на их основе вердикт.

                                          Чисто теоретически, бота от человека можно отличить по паттернам действий, но простыми наборами правил здесь не отделаться из-за огромных объёмов данных и высокой сложности. Тут уже начинают работать методы BigData. Но вот использует ли Blizzard AI для обнаружения ботов — большой вопрос.
                                            0
                                            В пользовательском соглашении есть пункт об наказании за автоматизации, а также пункт о разрешении сканирование компьютера и памяти на наличие всяких читерских штук. Насколько я знаю, делает это даже не сам клиент игры, а клиент батлнет, ибо он как раз и предлагает это соглашение, когда ставится. Хотя пруфов его деятельности у меня нет.
                                          0
                                          Рыбачил с год, (ботом) каждую ночь, по 5-10 часов, без всяких предосторожностей (ибо на акк было пофиг), прошло три года — бан не прилетел.
                                          +1

                                          Делал ради интереса подобного бота на Sikuli (программа для автоматизации, с питоновским синтаксисом скриптов). На самом деле, все было очень похоже как в вашем примере, но с парой отличий:


                                          • Определение момента для подсекания реализовал через отслеживание изменения области кадра с найденным поплавком.
                                          • Строк кода вышло <100. Экономия, в основном, за счет уже готовых инструментов для поиска нужной части кадра и отказа от слежения за аудио.
                                            +2
                                            Но ведь поплавок и так качается — вы смотрели по сильному смещению поплавка? Значит у вас очень хорошо работала обработка кадра. Как я уже писал, на моем Intel Iris анализ каждого кадра в OpenCV с включенной игрой занимает 300-500мс (включая сам скриншот через ImageGrab), я посчитал это несколько неразумным в моем случае, поэтому взялся за звук.
                                              +1

                                              Да, отслеживал именно по длительному (>0,3 секунды) выходу поплавка из узкой зоны, где он обычно находится.


                                              Сейчас проверил быстродействие визуального поиска. На ноуте с Core i7 и мобильным Radeon HD 8530M на поиск элемента по всему экрану 1366x768 уходит около 0,03 секунды. Если сократить область поиска в 5-6 раз, т.е. до примерной области рыбалки в WoW, то время на поиск уменьшается вдвое.

                                                0

                                                Как ниже верно сказали, можно же было изначально определить положение поплавка на экране и потом искать только на нем. Ведь экран наверное вы не вращаете во время работы бота? А это сильно влияет на скорость поиска.

                                                  0
                                                  Поплавок в рандомные места падает.
                                                    0
                                                    Так ведь речь о том, что он качается в том месте. Если мы отловили координату поплавка, то нам не нужно обрабатывать какую-то конкретную часть экрана, а только какиех-то пару десятков пикселей на наличие изменения поплавка. Если поплавок вдруг резко изменился и вернулся на место — значит он прыгнул.
                                              0
                                              Как альтернативный метод, еще можно по звуку поклева, он там один всего лишь и слышен четко.
                                                0
                                                Вы точно дочитали статью?
                                                  0
                                                  Каюсь
                                              • UFO just landed and posted this here
                                                  0
                                                  все логично, ботаем вовку и диаблу, а в освободившееся время лабаем ИскИн'а на StarCraft II API
                                                    0
                                                    А в диабле что ботать?
                                                      0
                                                      фарм редких предметов я думаю… Хотя аукцион убрали, но и без него… неужели бегать по стотыщпятисотому разу по одним и тем же локациям раскидывая монстров направо и налево?
                                                    –1
                                                    Пробовал запустить скрипт Ваш, куча проблем с библиотеками питоновскими на Маке. Есть какой-то может магический девелопмент пакет для питона, о котором я не знаю? :)
                                                      0
                                                      Году эдак в 2007 с одногрупниками писали бота для ловли рыбы в Lineage и по-моему это был как раз UOpilot.
                                                        +3
                                                        Делал бота, тоже для мака, правда на ObjC. Делал по-другому: после забрасывания водил мышкой по экрану и отслеживал изображение курсора. Как только курсор менялся: опять водил по экрану очерчивая границы курсора. Курсор на самом деле это ромб, как только чётко определял его координаты, ставил курсор на 1 пиксель выше верхней точки этого ромба и ждал. Когда курсор прыгает, этот ромб немного сдвигается вверх и курсор на небольшой момент меняется. В этот момент нажимал на поплавок. Работало на 100%. Самое сложное было быстро найти поплавок: если двигать мышку слишком быстро, то курсор мог не успеть измениться и можно было её «пролететь», если двигать слишком медленно, то не успевал найти прежде, чем начинает клевать. Распознавание изображений пытался сделать, но не осилил, к сожалению.

                                                        Кстати ваш способ будет плохо работать, когда в одном месте рыбачат несколько человек. В идеале надо комбинировать ваш подход для определения вероятных точек нахождения поплавка и потом проверять курсором, где он находится на самом деле.
                                                          0
                                                          Вы правы, что плохо работает когда есть соседки поплавок.
                                                          А как считывали данные о курсоре? Я думал об этом решении, но не нашёл на пайтоне никакого способа вытащить иконку курсора, а на скриншотах нет курсора, как я уже писал.
                                                            0
                                                            Честно говоря не помню, исходники не сохранились. Скорее всего через NSCursor.image. Про пайтон не подскажу.
                                                              0
                                                              И скорее всего вы использовали NSCursor.currentSystem.
                                                              Из документации
                                                              Return Value
                                                              A cursor whose image and hot spot match those of the currently-displayed cursor on the system
                                                              Discussion
                                                              This method returns the current system cursor regardless of which application set the cursor, and whether Cocoa or Carbon APIs were used to set it.
                                                          0

                                                          Если питон позволяет (не знаю ибо не знаком) картинку поплавка можно перевести в grayscale с последующим уменьшением разрядности цвета после чего будет проще отыскивать границы поплавка.

                                                            0
                                                            Забанят, этот аккаунт уже можете удалять, смысла качать нет. Банят даже навороченные системы, которые работают с оперативкой.

                                                            Близзард воюют с ботами больше десяти лет, полагаю у них там нереально крутые движки умеют ловить. Хотелось бы на самом деле поработать над чем-то таким.

                                                              0
                                                              Зависит от «наглости». Я рыбачил подобным ботом годами. До тех пор, пока вы не начинаете оставлять его на день и ночь (сон/работа — бот ловит) — вы никому не интересны.
                                                                0
                                                                Удалил, спасибо, полегчало. (нет).
                                                                Навороченный системы, которые работают с памятью, как раз и легче отследить, от этого я отталкивался.
                                                                0
                                                                Несложно отличить виртуальные нажатия мышью от настоящих. Уже за это наверное могут забанить.
                                                                  0
                                                                  > Несложно отличить виртуальные нажатия мышью от настоящих.

                                                                  Если это несложно, тогда поясните, как.
                                                                    0
                                                                    Например, поставить хук на WH_MOUSE_LL и проверять LLMHF_INJECTED. Можно поставить хуки во всех процессах на mouse_event и SendInput. Можно на уровне драйвера перехватывать необходимые события и блокировать их, если они идут к защищаемой программе от посторонней программы. Это всё тоже можно обойти, но вызова autopy.mouse.click (использует mouse_event) явно недостаточно.
                                                                      0
                                                                      Я ничего не могу скачать про WoW, но у меня есть опыт обхода системы защиты для L2.
                                                                      Если коротко, то я вгрызался в DirectInput8Create, чтобы получить полный доступ к управлению мышью.

                                                                      > Например, поставить хук на WH_MOUSE_LL и проверять LLMHF_INJECTED. Можно поставить хуки во всех процессах на mouse_event и SendInput. Можно на уровне драйвера перехватывать необходимые события и блокировать их, если они идут к защищаемой программе от посторонней программы.

                                                                      Отлично, но тогда под раздачу попадут пользователи программируемых клавиатур/мышей или пользователи AutoHotKey. Это я уже наблюдал.

                                                                      Какие ещё есть варианты? Только учтите, что нормальные пользователи не будут играть в игру, где система защиты настолько зверская, что серьёзно ограничивает использование компьютера.
                                                                        0
                                                                        Можно не блокировать, а логировать, а потом использовать как один из факторов. Никто же не говорит, что нужно сразу банить. Речь изначально шла о том, что за эмуляцией можно следить.
                                                                        События можно посылать и свернутым окнам, которых может быть запущено больше десятка. Это тоже игнорировать?
                                                                        Например, у 4game (локализатор многих игр) драйвер защиты блокирует взаимодействие с окном игры. Многое не работает (через тот же TeamViewer нельзя взаимодействовать с игрой) и ничего, люди играют. Программируемые клавиатуры и мыши можно вносить в белые списки.
                                                                          0
                                                                          > Можно не блокировать, а логировать, а потом использовать как один из факторов.

                                                                          Ну отлогировали. Дальше-то что? Какой алгоритм анализа использовать?

                                                                          > События можно посылать и свернутым окнам, которых может быть запущено больше десятка. Это тоже игнорировать?

                                                                          По-моему, нельзя. Это приведёт либо к активации окна, либо просто проигнорируется.

                                                                          > Например, у 4game (локализатор многих игр) драйвер защиты блокирует взаимодействие с окном игры. Многое не работает (через тот же TeamViewer нельзя взаимодействовать с игрой) и ничего, люди играют. Программируемые клавиатуры и мыши можно вносить в белые списки.

                                                                          Как и в случае GameGuard на евросерверах L2. И да, белые списки. А если железка не из белого списка, то что делать? Страдать? В случае с GameGuard, например, решение было простое: можно было просто переименовать файл в разрешённый, и всё работало.

                                                                          А вообще, пользователи 4game раньше плакались, что их банили просто за сам факт присутствия на жёстком диске определённых программ.
                                                                            0
                                                                            Ну отлогировали. Дальше-то что? Какой алгоритм анализа использовать?

                                                                            Большой простор для творчества. Сейчас, думаете, они мгновенно банят, если что не так? Метрик может быть очень много. В крайнем случае, GM могут вручную проверять тех, кого выделило ПО.


                                                                            По-моему, нельзя. Это приведёт либо к активации окна, либо просто проигнорируется.

                                                                            Можно. Та же L2 спокойно всё воспринимает, даже если окно полностью свёрнуто. Для PostMessage нужно только HWND знать. Тот же L2on обходил торговцев в нескольких свернутых окнах, а пользователи при этом смотрели видео на YouTube.


                                                                            В случае с GameGuard, например, решение было простое: можно было просто переименовать файл в разрешённый, и всё работало.

                                                                            У Frost белые списки на десятки тысяч файлов привязаны к md5 (по крайней мере раньше так было). И эти списки формировались автоматически путем сбора информации с компьютеров пользователей.

                                                                              0
                                                                              > Метрик может быть очень много.

                                                                              Вот я к этому и клоню. Метрик можно придумать много, но будут ли они эффективны для поимки ботов — большой вопрос.

                                                                              > Можно. Та же L2 спокойно всё воспринимает, даже если окно полностью свёрнуто. Для PostMessage нужно только HWND знать. Тот же L2on обходил торговцев в нескольких свернутых окнах, а пользователи при этом смотрели видео на YouTube.

                                                                              В случае LineageII через PostMessage нельзя было отправить клик мышки, только текст, да и с большими ограничениями. Для торгового бота сгодился, но действия особо не автоматизировать.

                                                                              > У Frost белые списки на десятки тысяч файлов привязаны к md5 (по крайней мере раньше так было). И эти списки формировались автоматически путем сбора информации с компьютеров пользователей.

                                                                              Ну если простое переименование не работает, тогда просто загружаем свою библиотеку в доверенный файл, и уже из него совершаем злодеяния.
                                                                              0

                                                                              В WoW сами ботоводы — не самая большая проблема. То с чем они борятся — торговля золотом.
                                                                              Можно логировать подозрительных персонажей и потом следить при "превышении торговли", т.к. понятно что это твинк, который просто занимается золотодобычей.


                                                                              По-моему, нельзя. Это приведёт либо к активации окна, либо просто проигнорируется.
                                                                              Некоторые боты специально "как бы сворачивают игру" (на самом деле говорят игре что она не в фокусе), т.к. тогда DirectX не перерисовывает кадры -> экономия памяти/видюхи, и можно запускать в большем количестве окон.
                                                                              Правда такие боты работают на "инъекциях" (или пакетах) — т.е. не имитацией клавиш, а имитацией действий, которые эти клавиши вызывают.
                                                                              Таким образом некоторые боты умеют использовать предметы из инвентаря, даже не открывая его.

                                                                              • геймгвард очень агрессивный. если я не ошибаюсь, то он банил игроков с Win7, как только она появилась(но это не точно). + сканировал оперативку процессов на названия известных ботов в итоге были вайпы серверов при рассылке сообщения с названием чита.
                                                                                В добавок ко всему геймгвард очень агрессивен к драйверам устройств. Из-за чего игра с геймпада в некоторые игры невозможна.

                                                                              P.s. была инфа что создатель геймгварда бывалый читер. поэтому это "война читеров". Её не раз обходили, но этот тип сидел на закрытых форумах и первым узнавал об обходах и достаточно быстро их фиксил.

                                                                                0
                                                                                > P.s. была инфа что создатель геймгварда бывалый читер. поэтому это «война читеров». Её не раз обходили, но этот тип сидел на закрытых форумах и первым узнавал об обходах и достаточно быстро их фиксил.

                                                                                Не совсем так. На официальных европейских серверах использовался GameGuard — поделка корейцев. Так себе защита: обойти его было довольно просто (если интересно — могу написать, как). И политика на европейских серверах была очень лояльной к ботам. Пользователей с Win7 не банили. Наоборот, был момент, когда из-за отсутствия x64 версии GameGuard пользователям разрешили временно играть с отключенным GameGuard на соответствующих системах.

                                                                                А вот на русских серверах работал Frost. И вот это уже ядрёная штука, реально война читеров.
                                                                                  0

                                                                                  Возможно, мы говорим про разные версии, т.к. у меня ммо с GG не запускались когда в системе было установлено любое средство для дебаггинга.
                                                                                  драйвера для геймпадов воспринимались как читы.
                                                                                  порой он просто крашил игру просто потому что подумал что война ты пытаешься его взломать и т.д.

                                                                                    0
                                                                                    > У меня ммо с GG не запускались когда в системе было установлено любое средство для дебаггинга

                                                                                    И именно поэтому я писал свой чит-софт на C#, а не C++, т.к. GG блокировал нативный отладчик, а вот отладчик .NET — нет.

                                                                                    P.S. Вспомнить, что ли, молодость — попробовать сейчас обойти GG.

                                                                  Only users with full accounts can post comments. Log in, please.