Esta pregunta ha estado en mi mente por un tiempo ... principalmente porque veo bots para todo tipo de juegos como WoW y otros. Mi pregunta es; ¿Cómo saben los bots lo que aparece en la pantalla? No juego WoW, así que mi ejemplo puede estar equivocado, pero si, por ejemplo, hay un monstruo, ¿cómo sabe el robot dónde está ese monstruo en la pantalla y cómo sabe cómo interactuar con él?
¿Puedes aplicar esto a cualquier juego o es específico para cada juego? Lo siento si la pregunta no está clara ... y no estoy preguntando cómo hacer un bot, ¡más preguntando cómo detectan cosas en la pantalla, ya que es bastante fascinante para mí!
Gracias por adelantado :)
Respuestas:
Hay muchos puntos donde un bot puede inyectarse en el juego.
La pantalla es una de ellas, pero de lejos no es la más útil. Sin embargo, una vez he visto un aimbot muy temprano para Counter Strike que usaba códigos de colores. Llegó con modelos de personajes alternativos con texturas de un solo color (el juego era lo suficientemente fácil de modificar para permitir esto) y luego solo detectó píxeles de esos colores. Sin embargo, no es un método muy efectivo. Ya era bastante torpe en ese entonces, y se vuelve cada vez menos viable porque los motores gráficos se vuelven cada vez más potentes, lo que significa más y más detalles para confundir cualquier algoritmo de reconocimiento óptico.
Otro punto es leer la memoria directamente [1] . Es posible que un programa en su computadora lea la memoria de otro. Por lo tanto, el desarrollador solo necesita averiguar en qué dirección de memoria está guardando el juego la información relevante para el bot. Existen herramientas que ayudan al desarrollador a encontrar lo que desean al crear una imagen de memoria y proporcionar varias herramientas de búsqueda. Una contramedida es utilizar la aleatorización del diseño de la dirección, pero un robot inteligente aún puede encontrar lo que está buscando automáticamente.
Es posible modificar el ejecutable del juego en sí. Para hacer esto, los desarrolladores de bot deben poder leer y programar en ensamblador, lo cual no es tan difícil con algo de práctica. Luego buscan el código que maneja la información que les interesa y lo reescriben para pasarlo a su bot. Una posible contramedida desde la perspectiva del desarrollador del juego es usar un ofuscador para hacer que el código de ensamblador del juego sea menos legible, pero estos generalmente no son buenos para el rendimiento y existen herramientas para muchos ofuscadores que invierten su trabajo.
Y luego está el netcode. En un juego en línea, el servidor envía las propiedades y posiciones de todos los objetos en el juego a través de la red. El flujo de datos de red entre el servidor y el cliente puede ser interceptado y analizado. Una herramienta popular para hacer esto es wireshark. Cuando el desarrollador realiza ingeniería inversa del código de red, puede escribir un bot que intercepte el tráfico de la red al igual que Wireshark y utiliza la información para tomar su decisión. Cuando el desarrollador está más motivado, incluso puede desarrollar un cliente de juego completo desde cero que implemente el protocolo de red y juegue el juego sin tener siquiera ningún resultado gráfico. Tales bots son muy populares entre los productores de oro porque sin la salida de gráficos, el cliente suele ser mucho más amigable con los recursos, lo que significa que pueden ejecutar muchos de ellos a la vez en un servidor pequeño.
1: Ya que mencionas WoW, vale la pena señalar que el programa de botteo WoWGlider temprano y notorio utilizó el acceso directo a la memoria. Blizzard tenía un subprograma llamado Warden que fue diseñado para detectar y bloquear el acceso de los programas externos al estado interno del juego de WoW. Dado que el programa de bots eludió esta protección y leyó la memoria sin permiso, la demanda de 2006 MDY v Blizzard se decidió a favor de Blizzard con el argumento de que el fabricante del bot alentaba y permitía a sus usuarios cometer una infracción de derechos de autor y violar la DMCA .
fuente
Los bots son jugadores. Simplemente leen las posiciones del jugador / monstruo del servidor al igual que cualquier otro jugador y usan esos valores combinados con un simple script AI para realizar acciones en el juego mediante la simulación de golpes de teclado y clics del mouse mediante programación. Si los bots realmente tuvieran un algoritmo para detectar qué monstruo está en la pantalla e interactuar con él, sería un software bastante impresionante que valdría millones. Eso es básicamente IA para robots.
fuente
Phillip ya dio una gran visión general de cómo funcionan la mayoría de los bots, pero solo quería cubrir las cosas con un poco más de detalle, ya que tengo un poco de experiencia personal desarrollando en o para todos los tipos de bots que cubrió.
En Runescape, había un gran proyecto (RSBot) que copiaba el contenido de la memoria del cliente Runescape en su memoria local, donde luego podía ver todo el estado del juego sin riesgo de que el cliente se pusiera al día. Se requirió un poco de ingeniería inversa para determinar dónde buscar en la memoria para encontrar los punteros a los datos, pero una vez que lo hicieron, expusieron una API para aprovechar la información. Sabría exactamente en qué lugar del mundo obtendría las coordenadas de un objeto y luego las transformaría con la matriz de transformación de la cámara para obtener la posición en pantalla. Las máscaras de impacto también eran legibles, por lo que era trivial determinar exactamente en qué rango mover el mouse para obtener el resultado deseado.
El bot proporcionó un montón de información de depuración, como anotaciones que le indicaron al desarrollador qué coordenadas de mosaico están dónde, qué ID tiene este objeto, qué ID pertenece a un elemento determinado, etc. Esta información podría usarse para hacer bots. El proceso real de hacer los guiones de bot fue realmente bastante simple. El marco proporcionó muchas funciones de utilidad, como
move_to(world_coordinates)
omouse_move(x,y)
que realizarían las acciones especificadas de una manera algo creíble (moviendo el mouse a lo largo de una spline aleatoria, moviéndose repetidamente a través del minimapa y la pantalla, y así sucesivamente)También en Runescape, tiene la opción de reducir drásticamente la calidad de los gráficos. En realidad, fue bastante fácil hacer ciertos tipos de bots filmando la pantalla y aplicando algunos conceptos básicos de visión por computadora para construir un modelo del mundo. Hice un bot de maldición y un robot de fundición usando esta técnica, los cuales funcionaron bastante bien. Simplemente tomaría el marco, aumentaría la saturación tanto como pudiera y luego trataría de extraer patrones de él, lo que podría generar un mapa de probabilidad para las zonas de clic.
En el caso del bot maldito, el objetivo era un demonio menor, que es solo una cosa roja enorme, que es trivial de encontrar. En el caso del robot de fundición, buscaría un pequeño trapecio naranja rodeado de gris, y ese sería el horno. También trataría de encontrar una gran forma de "L" gris claro, que sería el escritorio del banco. Eso solo se hizo con reducción de escala y heurística básica. También podría orientarse con la práctica brújula al lado del minimapa, por lo que podría orientar la cámara en una posición más confiable para encontrar los objetos objetivo.
En varios juegos de Nexon, los servidores confían mucho en los clientes. Abusé de esto una tonelada en Maplestory modificando mapas para eliminar peligros o agregar deformaciones para que un bot no tenga que ser tan sofisticado. También monitorearía el tráfico hacia y desde el servidor para construir un modelo del mundo que luego podría usarse para encontrar y matar monstruos rápidamente.
Una vez que me di cuenta de que ya no jugaba MMO y simplemente los automaticé, decidí dejar de jugar por completo. Si no estuviera tan preocupado por exponerme legalmente, probablemente podría haber matado vendiendo bots MMO, pero realmente no quería ser demandado. ¡Es por eso que paso mi tiempo haciendo programación real en estos días!
fuente
La respuesta de Phillip es excelente, pero solo una nota rápida sobre el patrón Modelo / Vista / Controlador , o MVC para abreviar.
Su pantalla es parte de la "vista", que presenta datos del "modelo", que es el estado real del juego si lo desea. Los bots y tu personaje, todos 'existen' (en cierto sentido) dentro del modelo. Imagínese si desconectara la pantalla: el juego continuaría aunque la vista se haya ido.
En un juego en red, el concepto de "modelo" es un poco complicado, ya que en realidad tienes muchos modelos. Tiene el modelo en el servidor y luego un modelo en cada cliente, que se actualiza en parte debido a los datos que recibe del servidor. Podría pensar que el "modelo" abarca el modelo del servidor y el modelo de su cliente, o podría pensar que es solo el modelo de su propio cliente. De cualquier manera, aquí es donde viven los bots. Por lo tanto, sus "percepciones", que podríamos usar como una forma abreviada de su entrada de datos y estado, se basan en el estado del modelo en ese momento y la interacción entre las diferentes entidades / objetos dentro de ese modelo. En la práctica, cada bot puede tener una función llamada "refreshState" que se ejecuta una vez por cuadro o algo, y que hace que se actualice "
fuente
Pueden leer las coordenadas de un archivo o un servidor, pero también con un sistema de detección de colisión de rayos. Es común usar rayos que van desde el bot (en ese caso) hasta fuera de él. Si el rayo choca con algo, entonces devuelve información al bot, como si lo que el rayo encontró fuera un jugador, un bot, un animal o una pared simple. Eso es porque en el caso del jugador y el bot, por ejemplo, tienen una cápsula invisible que los involucra completamente con información sobre su tipo, por ejemplo (humano, bot, ...). Con eso, pueden evitar chocar con paredes y otros elementos si te siguen, por ejemplo.
Puede ver la parte Detección de colisión de esta página
fuente