Pregunta

Estoy jugando con un juego nativo (no web) para un jugador que estoy escribiendo y se me ocurrió que tener un juego diario/semanal/de todos los tiempos lista de puntuaciones más altas en línea (piense en la tabla de clasificación de Xbox Live) haría que el juego fuera mucho más interesante, agregando una (pequeña) cantidad de comunidad y competencia.Sin embargo, me temo que la gente vería esta característica como una invitación a la piratería, lo que desanimaría a los jugadores habituales debido a puntuaciones increíblemente altas.

Pensé en las formas obvias de prevenir tales intentos (cifrado de clave pública/privada, por ejemplo), pero descubrí maneras razonablemente simples de que los piratas informáticos podrían eludir todas mis ideas (extrayendo la clave pública del binario y enviando así mensajes cifrados falsos). puntuaciones, por ejemplo).

¿Alguna vez ha implementado una lista o tabla de clasificación de puntuaciones altas en línea?¿Encontró una forma razonablemente a prueba de piratas informáticos de implementar esto?Si es así, ¿cómo lo hiciste?¿Cuáles son sus experiencias con los intentos de piratería?

¿Fue útil?

Solución

Al final del día, usted confía en confiar en el cliente.Si el cliente envía repeticiones al servidor, es bastante fácil replicar o modificar una partida exitosa y enviarla al servidor.

Lo mejor que puedes hacer es elevar el listón para hacer trampa por encima de lo que un jugador consideraría que vale la pena superar.Para hacer esto, existen varias técnicas comprobadas (pero a menudo no mencionadas) que puede utilizar:

  1. Deje a los tramposos en la lista negra en un honeypot.Pueden ver sus propias puntuaciones, pero nadie más puede hacerlo.A menos que lo verifiquen iniciando sesión con una cuenta diferente, creen que han pirateado tu juego con éxito.
  2. Cuando alguien es marcado como tramposo, posponga cualquier repercusión en la cuenta hasta un momento determinado en el futuro.Haga este punto al azar, dentro de uno a tres días.Normalmente, un tramposo probará varios métodos y eventualmente tendrá éxito.Al posponer los comentarios sobre el estado de la cuenta hasta una fecha posterior, no logran comprender qué los atrapó.
  3. Capture todos los comandos de usuario del juego y envíelos al servidor.Verifíquelos con otras puntuaciones dentro de un delta determinado.Por ejemplo, si el jugador utilizó la acción de disparar 200 veces, pero obtuvo una puntuación de 200.000, pero los jugadores vecinos en el juego dispararon 5.000 veces para obtener una puntuación de 210.000, puede activar un umbral que señale a la persona para acciones adicionales o humanas. investigación.
  4. Agregue valor y persistencia a sus cuentas de usuario.Si sus cuentas de usuario tienen elementos desbloqueables para su juego, o si su juego requiere compra, el peso de una prohibición es mayor ya que el usuario no puede recuperar su estado de cuenta anterior simplemente creando una nueva cuenta a través de un proxy basado en web.

Otros consejos

Ninguna solución será perfecta mientras el juego se ejecuta en un sistema bajo el control del usuario, pero hay algunos pasos que puedes seguir para hacer que piratear el sistema sea más problemático.Al final, el objetivo sólo puede ser hacer que hackear el sistema sea más problemático de lo que vale la pena.

  • Envíe información adicional con las solicitudes de puntuación más alta para validar una del lado del servidor.Si obtienes 5 puntos por cada X, y el juego solo contiene 10 X, entonces tienes algunos aros adicionales para que el hacker salte y acepte su puntuación como válida.
  • Haga que el servidor envíe un desafío aleatorio que debe cumplirse con unos pocos bytes del binario del juego de ese desplazamiento.Eso significa que el hacker debe mantener una copia impecable del binario (solo un poco más de problemas).
  • Si tiene claves de licencia, solicite puntuaciones altas para incluirlas, de modo que pueda prohibir a las personas que descubran pirateando el sistema.Esto también le permite rastrear los intentos no válidos como se define anteriormente, para prohibir que las personas prueben el protocolo incluso antes de enviar una puntuación válida.

Sin embargo, en general, lograr que el juego sea lo suficientemente popular como para que la gente se interese en hackearlo sea probablemente un desafío mucho mayor.

Sinceramente no creo que sea posible.

Lo hice antes usando un cifrado de clave bastante simple con un binario comprimido que funcionó lo suficientemente bien para la seguridad que necesitaba, pero honestamente creo que si alguien considera descifrar su tabla de puntuación más alta en línea como un truco, lo logrará.

Hay algunas personas bastante tristes que también son bastante brillantes, a menos que consigas que todos se acuesten, es una causa perdida.

Si tu juego tiene un sistema de repetición integrado, puedes enviar repeticiones al servidor y hacer que el servidor calcule la puntuación de la repetición.

Este método no es perfecto, aún puedes hacer trampa ralentizando el juego (si está basado en acciones) o escribiendo un bot.

He estado haciendo algo de esto con mis juegos Flash y realmente es una batalla perdida.Especialmente para ActionScript que se puede descompilar en un código algo legible sin demasiado esfuerzo.

La forma en que lo he estado haciendo es un enfoque bastante convencional de enviar la puntuación y el nombre del jugador en texto plano y luego un hash de los dos (con la sal adecuada).Muy pocas personas están lo suficientemente decididas como para hacer el esfuerzo de resolverlo, y las pocas que lo están lo harían de todos modos, anulando todo el tiempo que les dedicas.

En resumen, mi filosofía es dedicar tiempo a mejorar el juego y hacerlo lo suficientemente difícil para hacer trampa.

Una cosa que podría ser bastante efectiva es hacer que el juego envíe la puntuación al servidor varias veces mientras juegas, enviando un poco de información del juego cada vez, lo que te permitirá validar si la puntuación es "realista".Pero eso podría ser realmente un poco exagerado.

Esa es una pregunta realmente difícil.

Nunca he implementado tal cosa, pero aquí hay una aproximación simple.

Su principal preocupación se debe a que los piratas informáticos adivinan qué está haciendo su aplicación y luego envían sus propios resultados.

Bueno, antes que nada, a menos que su solicitud tenga un gran éxito, no me preocuparía.Hacer tal cosa es extremadamente difícil.

El cifrado no ayudará con el problema.Verá, el cifrado ayuda a proteger los datos en su camino, pero no protege ninguna de las partes de la transacción antes de que se cifren los datos (que es donde puede estar la principal vulnerabilidad).Entonces, si cifra la seguridad, los datos permanecerán privados pero no estarán seguros.

Si realmente le preocupa, le sugeriré ofuscar el código y diseñar el sistema de puntuación de una manera que no sea completamente obvia lo que está haciendo.Aquí podemos tomar prestadas algunas cosas de un protocolo de cifrado.Aquí hay un ejemplo:

  1. Digamos que la puntuación es algún número m
  2. Calcula algún tipo de control sobre la puntuación (por ejemplo el CRC o cualquier otro sistema que veas pies).De hecho, si inventas uno, no importa lo aburrido que sea, funcionará mejor)
  3. Obtenga la clave privada del usuario (D) de su servidor remoto (obviamente a través de una conexión segura).Eres el único que conoce esta clave.
  4. Calcule X=m^D mod n (siendo n el módulo público de su algoritmo de clave pública/privada) (es decir, cifrelo :P)

Como puede ver, eso es simplemente una ofuscación de otro tipo.Puedes bajar por ahí todo el tiempo que quieras.Por ejemplo, puede buscar los dos números primos más cercanos a X y usarlos para cifrar el CRC y enviarlo también al servidor, de modo que tendrá el CRC y la puntuación por separado y con diferentes esquemas de cifrado.

Si usa eso junto con la ofuscación, diría que sería difícil de piratear.Sin embargo, incluso eso podría ser mediante ingeniería inversa, todo depende del interés y la capacidad del hacker, pero...En serio, ¿qué clase de monstruo necesita tanto esfuerzo para cambiar los resultados de un juego?(A menos que sea WoW o algo así)

Una última nota

Ofuscador para .NET

Ofuscador para Delphi/C++

Ofuscador para ensamblador (x86)

Como dice la otra respuesta, estás obligado a confiar en un cliente potencialmente malicioso, y un simple elemento disuasorio más un poco de monitoreo humano será suficiente para un juego pequeño.

Si quiere ser sofisticado, debe buscar patrones de fraude en los datos de puntaje, de manera similar a como una compañía de tarjetas de crédito busca datos de cargos.Cuanto más estado comunique el cliente a su servidor, más fácil será encontrar un patrón de comportamiento correcto o incorrecto a través del código.Por ejemplo.Digamos que el cliente tuvo que cargar un registro de auditoría de la puntuación basado en el tiempo (que tal vez también pueda usar para permitir que otros clientes vean los mejores juegos), el servidor puede luego validar si el registro de puntuación infringe alguna de las reglas del juego.

Al final, se trata todavía de hacerlo lo suficientemente caro como para disuadir de hacer trampa en el marcador.Querrá un sistema donde siempre pueda mejorar el código del servidor (más fácil de actualizar) para hacer frente a cualquier nuevo ataque a su sistema de validación.

@Martín.

Así es como creo que funciona Mario Kart Wii.La ventaja adicional es que puedes dejar que todos los demás jugadores vean cómo el poseedor de la puntuación más alta obtuvo la puntuación más alta.Lo curioso de esto es que si echas el vistazo más rápido"Volcán Gruñón"traza del tiempo, verás que alguien encontró un atajo que te permite saltarte el 95% de la pista.No estoy seguro de si todavía tienen ese tiempo como el más rápido.

No puede hacerlo en una plataforma de cliente que no sea de confianza.En la práctica, es posible derrotar incluso a algunas plataformas "confiables".

Hay varios ataques que son imposibles de detectar en el caso general, principalmente modificando variables en la memoria.Si no puede confiar en las variables de su propio programa, no podrá lograr mucho.

Las otras técnicas descritas anteriormente pueden ayudar, pero no resuelven el problema básico de ejecutar en una plataforma que no es de confianza.


Por curiosidad, ¿estás seguro de que la gente intentará piratear una tabla de puntuación más alta?He tenido un juego en línea durante más de dos años con una tabla de puntuación alta trivialmente crackabe.Mucha gente lo ha jugado, pero no tengo pruebas de que alguien haya intentado superar las puntuaciones más altas.

Por lo general, el mayor defensor contra las trampas y la piratería es la vigilancia de la comunidad.Si una puntuación parece bastante sospechosa, un usuario puede denunciarla por hacer trampa.Y si suficientes personas informan esa puntuación, los administradores pueden verificar la validez de la repetición.Es bastante fácil ver la diferencia entre un bot y un jugador real, si ya hay un grupo de jugadores jugando con total legitimidad.

Los administradores deben supervisar sólo aquellas puntuaciones que se cuestionan, porque existe una pequeña posibilidad de que un grupo de usuarios se sumen al carro para eliminar una puntuación perfectamente ganada con tanto esfuerzo.Y los administradores solo tienen que ver los pocos puntajes que se reportan, por lo que no les quita mucho tiempo, menos aún para un juego pequeño.

Incluso el simple hecho de saber que si trabajas duro para crear un bot, el simple hecho de ser derribado nuevamente por el sistema de informes es un elemento disuasivo en sí mismo.

Quizás incluso cifrar los datos de repetición tampoco estaría de más.Los datos de reproducción suelen ser pequeños y cifrarlos no requeriría mucho más espacio.Y para ayudar a mejorar eso, el propio servidor probaría la repetición mediante el registro de control y se aseguraría de que coincida con la puntuación obtenida.

Si hay algo que el sistema antitrampas no puede encontrar, los usuarios lo encontrarán.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top