En los juegos de red multijugador, ¿qué técnicas existen para tratar de garantizar que los usuarios se conecten con la aplicación cliente oficial y no con alguna aplicación hackeada?
Me doy cuenta de que probablemente no haya una forma segura de hacer esto, sino que me interesan las técnicas que pueden emplearse para mitigar el problema.
Estoy especialmente interesado en cualquier técnica que pueda usarse para juegos basados en la web, pero imagino que la mayoría se puede aplicar en general.
¡Gracias!
networking
multiplayer
security
Hasta el arroyo
fuente
fuente
Respuestas:
Ese es un problema interesante, pero creo que estás haciendo la pregunta incorrecta aquí. Permítanme comenzar por detectar el enfoque de cliente pirateado:
Si su cliente es ejecutado del lado del usuario, puede hacer lo que quiera con su código (hasta que sea demasiado complicado para él, pero siempre habrá alguien más listo en la línea). Todo lo que pueda hacer, como cifrar los mensajes entre el cliente y el servidor, crear certificados de cliente o incluso hacer que el cliente calcule su suma de verificación, puede descomponerse y descifrarse con suficiente tiempo. He visto un software que viene con un dongle, este dongle tenía parte del código de la aplicación, pero para poder ejecutarlo, dongle primero verificó el crc de la aplicación si no estaba templado ... por supuesto, después de algún tiempo el dongle fue pirateado también ... además, si realiza una actualización de software, debe volver a enviar el dongle ...
Además de eso, el usuario puede usar su propio cliente para hacer trampa, simulando el movimiento del mouse y los clics, por ejemplo.
Entonces la pregunta debería ser: ¿cómo detectar un jugador bot?
Aquí tiene algunas opciones: medir el tiempo entre clics, medir la velocidad de los movimientos del mouse: ¿se mueve el mouse exactamente del punto A al punto B varias veces y golpea exactamente las mismas coordenadas? ¿El movimiento del usuario es repetible? Si cuando el recurso que el usuario estaba reuniendo se agotó, ¿el usuario pasa a otra acción o espera en el lugar durante horas? Al final del día, terminas escribiendo códigos de reconocimiento de patrones.
fuente
No creo que esta sea la forma correcta de abordar esto o al menos no lo único que debería preocuparte.
Asegúrese de enviar solo información específica del cliente a cada cliente (por ejemplo, un cliente no necesita saber qué puede arrojar un monstruo, por ejemplo, simplemente envíe la información después de matarla y solo a los clientes especificados)
Realice la mayoría de los cálculos en el lado del servidor (posicionamiento, etc.). El cliente está haciendo sus propios cálculos, PERO nunca puede enviar sus propios valores solo sus acciones. El servidor tiene que verificar si esta acción es válida y cómo afectará el juego.
1 y 2 generalmente se combinan con predicciones. El cliente y el servidor intentan predecir ciertos comportamientos. El cliente, por ejemplo, mueve al jugador pero cada x segundos o ms. recibe una corrección por parte del servidor
Cobrar a los usuarios por sus cuentas, no por el cliente, de esta manera un usuario puede obtener una versión descifrada pero no puede jugar sin una cuenta.
Con 2 puedes asegurarte de que no haya hacks de dinero, hacks de posición o hacks de pared, etc. pero los bots siempre han sido un problema para muchas empresas. Incluso los nombres de grandes empresas como ventisca tienen problemas con eso. Lo que podría hacer es limitar el tiempo de reproducción por cuenta, de modo que alguien no pueda estar en línea durante más de 540 horas por mes. Recuerdo un bot que usaba valores de color de monstruos + entrada de mouse para cultivar XP. Otra forma sería proporcionar un programa adicional que verifique otras aplicaciones en ejecución y acceso a la memoria, pero esto trae algunos problemas nuevos.
Editar:
Artículos muy bien escritos para principiantes: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/
fuente
No existe una manera infalible de garantizar que el "cliente oficial" se esté ejecutando; cualquier mecanismo de este tipo dependerá de que el código de validación comunique algún tipo de "secreto" al servidor, que puede ser modificado mediante ingeniería inversa, con tiempo suficiente. Esto es básicamente lo que sucede cuando un software anti-piratería le dice al servidor que el cliente está bien.
Editar: para elaborar un poco sobre lo anterior, considere el código que valida el lado del cliente. Tiene dos tareas muy difíciles: comprobar que se está utilizando el código original (y no hay nada más que pueda interferir dinámicamente con el código original / en tiempo de ejecución (!)), Y comunicar este resultado al servidor, de tal manera que esta comunicación no puede ser falsificada Mientras que la primera parte es increíblemente difícil, la segunda parte es completamente imposible.
Si puede actualizar tanto el cliente como el servidor de forma regular, puede cambiar el secreto de forma regular, con la esperanza de dificultar el mantenimiento de los crackers. Sin embargo, con toda probabilidad, a menos que esté cambiando la forma en que se codifica / implementa el secreto, se puede descifrar muy rápidamente nuevamente. Básicamente, es una carrera armamentista entre usted y quien quiera resolverlo: quién tiene más tiempo y dinero para resolver el problema.
Habiendo aceptado esa parte, ¿hay algo más que podamos hacer? En un mundo perfecto, con un poder de cómputo y un ancho de banda infinitos, simplemente puede transferir continuamente el estado entre el cliente y el servidor, y hacer que el servidor ejecute una simulación perfecta de lo que está sucediendo en el cliente. Este modelo podría usarse para validar las acciones que el cliente afirma estar realizando. Esto no detectará si un humano o un bot está jugando, pero podrá validar si el cliente está reclamando un disparo a través de una pared o alguna otra acción inconcebible.
Tener suficientes datos en el servidor también es un primer paso para detectar comportamientos irregulares, tal vez apuntar demasiado rápido para los humanos, etc. Obviamente, la situación de simulación perfecta generalmente no es factible, pero se puede usar algún tipo de modelo estimado a escala reducida. muchas situaciones
fuente
No especificas el tipo de juego, por lo que me inclinaré mucho hacia los juegos RPG / MMO. Pero mucho de esto puede aplicarse a los juegos de FPS, Estrategia y Acción. La forma en que las grandes compañías de juegos multijugador como Blizzard tratan este problema en sus juegos es:
Luego aparecen en el juego (si es posible, para los mismos juegos como Starcraft 2 no lo es) o de lo contrario miran / hablan con el jugador sobre sus acciones como un "control humano". O al menos así es como debe manejarse. Blizzard es bastante bueno en esto, pero históricamente otras compañías de MMO no lo han sido.
Buscar bots no obvios no es fácil, pero algunas reglas básicas a seguir incluyen
El problema es que cuanto más popular sea tu juego, y cuanto más fructíferos puedan ser los bots para reducir el tedio en tu juego, más probable será que las personas usen y creen estos bots. Y es trivial restringir la velocidad de movimiento del mouse, agregar variaciones humanísticas aleatorias a los clics, incluso hacer que el bot cometa errores a un ritmo humano, abriendo y cerrando partes del menú, presionando el botón incorrecto y luego cerrando la ventana, cambiando entre el teclado y El ratón funciona como los humanos para reducir la fatiga de las manos. (Ni siquiera te das cuenta de que lo haces)
Entonces, el último paso cuando alguien o un bot está haciendo algo repetitivo durante mucho tiempo realmente tiene que ser un mod humano que se acerque al jugador y le hable. Si están allí y responden con respuestas humanas, son humanos. Por lo general, los mods le pedirán al jugador que se detenga por un tiempo, o los siga a alguna parte y realice otras acciones, los aros se vuelven más complejos con el tiempo.
Tanget
Por supuesto, eventualmente alguien creará un bot que no se puede distinguir de una persona real, pasando la prueba de Turing. Y hay muchos escritores de bots por ahí que pretenden hacer precisamente eso.
Yo mismo tenía una fascinación pasajera con la idea cuando comencé a programar y creé bots inútiles para Ultima Online que se pararía en la ciudad e imitaría a los NPC. Los comandos eran súper simples, por lo que eran fáciles de hacer, solo presionando las teclas para avanzar en diferentes direcciones, y mirando el registro del chat por su propio nombre y enviando los mensajes a ALICE a través de una versión web de la IA. No recuerdo cuál y probablemente ya no exista.
/Tangente
El punto es que debes decidir dónde dibujar la línea. Si no puede permitirse el lujo de un ejército de moderadores para hablar con las personas que su sistema identifica como bots, probablemente sea mejor dejar que la comunidad marque a las personas como bots, y luego, cuando sea suficiente, patear al jugador durante aproximadamente una hora. No prohibir, solo patear. El verdadero problema para la mayoría de los jugadores es que los bots acaparan recursos que otros jugadores humanos podrían estar usando. Si las turbas son escasas, como era el problema con Ragnarok Online, entonces los bots que deambulan y limpian áreas enteras de enemigos mientras recogen objetos (o no) son comunes, y arruinan el juego para otras personas. Para que pueda evitar el costo de los ejércitos administrativos de esa manera.
Finalmente, también puedes vivir con bots como una realidad de tu espacio de juego y fomentar su uso. Esto requiere diseñar su juego alrededor del uso eventual y común de bots, entrenadores y programas de ayuda. Quiero decir que hubo un MMO que hizo esto hace unos 10 años, pero no recuerdo cuál era. Deletreó el final del juego, porque los MMO son muy pesados y significa que el 95% de los jugadores nos alejamos de sus teclados en cualquier momento y destruyeron la comunidad. Si sigues esta ruta, ten cuidado.
fuente
evite tener características de juego de las que un usuario pueda ganar haciendo tareas repetitivas , especialmente en juegos similares a los del navegador. Las características del juego que causan tareas repetitivas no solo hacen que otros usuarios se enojen porque no tienen tiempo para hacerlas, sino que también hacen que el juego sea mucho más fácil de arrancar (¡y mucho menos divertido!)
Si una característica del juego puede ser arrancable, ¿por qué hay esa característica en el juego de todos modos? Esa característica claramente llama al usuario a construir un bot.
El juego debe jugarse dando al jugador una cantidad razonable de entretenimiento, normalmente mediante un conjunto de opciones no triviales. La capacidad de decidir enfrentar opciones no triviales separa a un humano de un bot. En última instancia, en lugar de buscar bots, busque en su juego dónde se podría implementar un bot, e impleméntelo usted mismo para que todos lo usen. Al hacerlo, ahorras tiempo a un jugador evitando que realice tareas aburridas, mientras luchas contra los bots desde la raíz: si no hay características de juego arrancables, ¿cómo puede haber bots?
Mi conclusión es: diría que hay un umbral en la cantidad mínima de complejidad que un juego necesita para que no se pueda arrancar. Haga que su juego supere ese umbral agregando opciones no triviales que finalmente aumentarán la experiencia del usuario.
De todos modos, tal vez este paradigma ya no se aplique en los días actuales ... pero todavía creo que esto es lo que hace un buen juego.
fuente
Las respuestas existentes ya son buenas, pero quería señalar que si sus cheques son caros (por ejemplo: ejecutar todo el lado del servidor del juego para asegurarse de que el cliente no esté haciendo trampa), puede elegir hacerlo solo algunos de el tiempo .
Por ejemplo, solo puede verificar acciones en una región en particular o por jugadores particulares (cambiando aleatoriamente después de un tiempo), o simplemente tener una cola de acciones y elegir aleatoriamente cuáles validar (e ignorar a los demás). Tal vez invente una heurística de quién es probable que haga trampa (básicamente busque a las personas que tienen más éxito) y valide sus acciones en el servidor.
Asegúrese de que el servidor no ceda cuando está validando acciones y cuando no lo está. Envíe siempre su respuesta estándar hasta que esté listo para tomar medidas (y no la entregue tardando más en enviar una respuesta cuando esté validando y cuando no lo esté).
De esta manera, puede obtener una protección bastante buena contra las trampas, utilizando solo la potencia del servidor que puede ahorrar (aunque obviamente cuanto más cerca esté de validar cada acción, mejor protección contra las trampas).
fuente
Bueno, no creo que haya una "solución de Ultiamte". Puede codificar los paquetes de datos y darle algunas reglas al servidor que recibe los paquetes. Por ejemplo, podría establecer que el mayor movimiento realista / permitido es +1 y no como un tramposo / pirata informático que lo establecería en 5 o más para ser más rápido. Solo piensa en lo que podría hacer un hacker para ser mejor que otros jugadores y establece reglas para ello.
fuente
La forma más simple es, en esencia, hacer del cliente una terminal tonta. Todo se hace en el servidor, y el cliente solo envía comandos al servidor. De esta manera, el servidor tiene el control total de todo.
Sin embargo, este probablemente no sea el caso más adecuado para usted, porque el servidor tiene que realizar más cálculos y la experiencia del usuario será mediocre. Por lo tanto, cuanto más lógica deje al cliente para realizar, mejor será la experiencia del usuario, pero menor será la seguridad. Entonces tendrá que encontrar un punto medio que sea aceptable para usted.
Además, solo envíe al cliente lo que "debería" saber. Por ejemplo, si un jugador enemigo está detrás de un muro, no envíe esa información a un cliente, o un cliente pirateado podrá discernir esta información (lea: wallhack).
fuente
EDITAR: no entendí la pregunta. Lo interpreté como "evitar la clave pirateada / pirateada" en lugar de "software pirateado que puede enviar un mensaje para generar mil millones de oro para el jugador".
La mayoría de los juegos en estos días tienen un valor vinculado a una cuenta en una base de datos, ya que todo lo que un cliente puede enviar a un servidor puede modificarse. Este es probablemente el método más simple y efectivo.
Con el predominio de Internet de alta velocidad y transferencia de archivos P2P, las compañías han cambiado de claves de CD que se almacenan localmente en el cliente a claves que están vinculadas a una cuenta en sus servidores. No hay más software de cliente "oficial" o "no oficial" ya que cualquiera puede descargar el cliente. Pero solo puedes jugar si tienes una cuenta con acceso para jugar.
Esto también tiene un beneficio para la empresa, ya que no necesitan gastar tanto en producir copias físicas del software.
fuente