encryption leaderboard

encryption - Listas de puntaje en línea seguras para juegos no Web



leaderboard (10)

Estoy jugando con un juego de un jugador nativo (no web) que estoy escribiendo, y me ocurrió que tener una lista de mejores puntuaciones en línea diaria / semanal / de todos los tiempos (creo que el Xbox Live Leaderboard) haría que el juego mucho más interesante, agregando un poco (pequeña) cantidad de comunidad y competencia. Sin embargo, me temo que las personas verían esa característica como una invitación al hackeo, lo que desalentaría a los jugadores habituales debido a puntajes imposiblemente altos.

Pensé en las formas obvias de prevenir tales intentos (encriptación de clave pública / privada, por ejemplo), pero he descubierto formas bastante simples en que los hackers podrían eludir todas mis ideas (extrayendo la clave pública del binario y enviando falsas encriptadas puntajes, por ejemplo).

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


@Martín.

Así es como creo que funciona Mario Kart Wii. La ventaja adicional es que puedes dejar que todos los demás jugadores observen cómo el que obtuvo la puntuación más alta obtiene la puntuación más alta. Lo curioso de esto es que si revisas el recorrido más rápido del " Volcán agitado ", verás que alguien encontró un atajo que te permite omitir el 95% de la pista. No estoy seguro de si aún lo tienen como el mejor tiempo.


Al final del día, confía en confiar en el cliente. Si el cliente envía repeticiones al servidor, es bastante fácil replicar o modificar un juego exitoso y enviarlo al servidor.

Su mejor opción es subir el listón por hacer trampa por encima de lo que un jugador consideraría que vale la pena superar. Para hacer esto, hay una serie de técnicas probadas (pero a menudo no mencionadas) que puede usar:

  1. Deja a los tramposos en la lista negra en un honeypot. Pueden ver sus propios puntajes, pero nadie más puede hacerlo. A menos que verifiquen iniciando sesión con una cuenta diferente, creen que han pirateado su juego con éxito.
  2. Cuando alguien está marcado como tramposo, difiera cualquier repercusión de la cuenta de transpiración hasta un punto determinado en el futuro. Haga este punto al azar, dentro de uno a tres días. Típicamente, un tramposo intentará múltiples métodos y eventualmente tendrá éxito. Al diferir 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 contra otros puntajes dentro de un delta dado. Por ejemplo, si el jugador usó 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 desencadenar un umbral que señala a la persona por más o por humanos investigación.
  4. Agregue valor y persistencia a sus cuentas de usuario. Si sus cuentas de usuario tienen 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.

Como dice la otra respuesta, te ves obligado a confiar en un cliente potencialmente malicioso, y un simple detente más un pequeño monitoreo humano será suficiente para un juego pequeño.

Si quieres ser elegante, entonces tienes que buscar patrones de fraude en los datos de puntaje, en forma similar a una compañía de tarjetas de crédito que mira los datos de cargos. Cuanto más se 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. decir que el cliente tuvo que subir un registro de auditoría basado en el tiempo del puntaje (que también puede usar para permitir que otros clientes vean los mejores juegos), el servidor puede validar si el registro de puntajes rompe cualquiera de las reglas del juego.

Al final, esto todavía se trata de hacerlo lo suficientemente caro como para desalentar el fraude en el marcador. Desea un sistema en el que siempre pueda mejorar el código del servidor (más fácil de actualizar) para hacer frente a los nuevos ataques en su sistema de validación.


Esa es una pregunta realmente difícil.

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

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

Bueno, antes que nada, a menos que tu aplicación tenga un gran éxito, no estaría preocupado. Hacer tal cosa es extremadamente difícil.

La encriptación no ayudará con el problema. Como ve, el cifrado ayuda a proteger los datos en su camino, pero no protege ninguno de los lados de la transacción antes de que los datos sean encriptados (que es donde puede estar la vulnerabilidad principal). Entonces, si cifras el seguro, los datos permanecerán privados, pero no serán seguros.

Si realmente está preocupado, le sugiero que ofusque el código y diseñe el sistema de puntuación de una manera que no sea completamente obvia. Aquí podemos tomar prestadas algunas cosas de un protocolo de cifrado. Aquí hay un ejemplo:

  1. Digamos que la puntuación es un número m
  2. Calcule algún tipo de control sobre el puntaje (por ejemplo, el CRC o cualquier otro sistema que vea pies. De hecho, si acaba de inventar uno, no importa qué tan cojo 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. Compute X = m ^ D mod n (n es el módulo público de su algoritmo de clave pública / privada) (es decir, encriptelo: P)

Como ve, eso es solo ofuscación de otro tipo. Puedes ir por ese camino todo el tiempo que quieras. Por ejemplo, puede buscar los dos números primos más cercanos a X y usarlos para encriptar el CRC y enviarlo también al servidor, por lo que tendrá el CRC y el puntaje por separado y con diferentes esquemas de encriptación.

Si usa eso junto con ofuscación, diría que sería difícil de hackear. No obstante, incluso eso podría ser engingeered inversa, todo depende del interés y la capacidad del pirata informático, pero ... en serio, ¿qué tipo de fenómeno requiere tanto esfuerzo para cambiar sus resultados en un juego? (A menos que sea WoW o algo así)

Una última nota

Obfuscator para .NET

Obfuscator para Delphi / C ++

Obfuscator para ensamblador (x86)


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

La forma en que lo he estado haciendo es un enfoque bastante convencional de enviar el puntaje y el nombre del jugador en texto sin formato y luego un hash de los dos (salados adecuadamente). Muy pocas personas están lo suficientemente determinadas como para tomar el esfuerzo de resolverlo, y las pocas que lo harían de todos modos negarían todo el tiempo que pusieran en ello.

Para resumir, mi filosofía es dedicar el tiempo para mejorar el juego y hacer que sea lo suficientemente difícil como para hacer trampa.

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


Honestamente, no creo que sea posible.

Lo he hecho antes de usar un cifrado de clave bastante simple con un binario comprimido que funcionó lo suficientemente bien para la seguridad que requería pero, sinceramente, creo que si alguien considera descifrar su tabla en línea de puntaje alto, se hará.

Hay algunas personas bastante tristes que también son bastante brillantes a menos que puedas tenerlas todas, es una causa perdida.


Ninguna solución será perfecta mientras el juego se ejecute en un sistema bajo el control del usuario, pero hay algunos pasos que puede tomar para que el sistema tenga más problemas. Al final, el objetivo solo puede ser hackear el sistema con más problemas de lo que vale.

  • Envíe información adicional con las solicitudes de puntaje más alto 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 consiga que tu puntaje sea aceptado como válido.
  • Haz que el servidor envíe un desafío aleatorio que debe cumplirse con unos pocos bytes del binario del juego a partir de ese desplazamiento. Eso significa que el hacker debe mantener una copia prístina del binario (solo un poco más de problemas).
  • Si tiene claves de licencia, solicite puntajes altos para incluirlas, de modo que pueda prohibir que las personas atrapadas pirateen el sistema. Esto también le permite rastrear intentos inválidos como se definió anteriormente, para prohibir que las personas prueben el protocolo antes de presentar siquiera un puntaje válido.

Sin embargo, en general, hacer que el juego sea lo suficientemente popular como para que las personas se encarguen de hackearlo es probablemente un desafío mucho más grande.


No puede hacerlo en una plataforma de cliente no confiable. En la práctica, es posible vencer incluso algunas plataformas "de confianza".

Existen varios ataques que son imposibles de detectar en el caso general, principalmente la modificación de variables en la memoria. Si no puede confiar en las variables de su propio programa, realmente no puede lograr mucho.

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

Por interés, ¿está seguro de que las personas intentarán piratear una tabla de puntaje alto? He tenido un juego en línea durante más de dos años con una tabla de puntaje trivialmente crackabe. Muchas personas lo han jugado, pero no tengo evidencia de que alguien haya tratado de descifrar los puntajes más altos.


Por lo general, el mayor defensor contra el fraude y el pirateo es una vigilancia comunitaria. Si un puntaje parece bastante sospechoso, un usuario puede reportar el puntaje por hacer trampa. Y si hay suficientes personas que reportan 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 montón de jugadores jugando el juego en total legitimidad.

Los administradores deben supervisar solo los puntajes que sean cuestionados, ya que hay una pequeña posibilidad de que un grupo de usuarios elimine un puntaje perfectamente logrado. Y los administradores solo tienen que ver los pocos puntajes que se informan, por lo que no es demasiado tiempo, incluso menos para un juego pequeño.

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

Quizás incluso encriptar los datos de la repetición no dañaría. Los datos de reproducción a menudo son pequeños, y encriptarlos no requeriría mucho más espacio. Y para ayudar a mejorar eso, el servidor probará la repetición con el registro de control y se asegurará de que coincida con el puntaje obtenido.

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


Si su juego tiene un sistema de reproducción integrado, puede enviar repeticiones al servidor y hacer que el servidor calcule el puntaje de la repetición.

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