2008-08-25 30 views
24

Estoy jugando con un juego de un jugador nativo (no web) que estoy escribiendo, y se me ocurrió que tenía un diario/semanal/de todos los tiempos La lista de mejores puntuaciones en línea (piense en la tabla de clasificación de Xbox Live) haría que el juego fuera mucho más interesante, añadiendo algo de (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.Listas de puntuaciones más seguras en línea para juegos no web

Pensé en las formas obvias de evitar tales intentos (encriptación de clave pública/privada, por ejemplo), pero he descubierto maneras razonablemente simples de que los hackers eludan todas mis ideas (extrayendo la clave pública del binario y enviando puntuaciones cifradas falsas, por ejemplo).

¿Alguna vez ha implementado una lista de mejores puntuaciones en línea o 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?

Respuesta

39

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 apuesta es elevar 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. Deje 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 se marca como tramposo, difiera las repercusiones de la cuenta de la 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.
6

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 necesitaba pero creo sinceramente que si alguien considera que descifrar su tabla en línea de puntaje, se hará.

Hay algunas personas muy tristes por ahí que también son muy brillantes a menos que puedas obtenerlas todas, es una causa perdida.

5

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 (correctamente salados). 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.

En resumen, mi filosofía es dedicar el tiempo a 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 de juego cada vez, lo que te permite validar si el puntaje es "realista". Pero eso podría ser un poco exagerado en realidad.

23

Ninguna solución va a ser perfecta mientras el juego se ejecuta en un sistema bajo el control del usuario, pero hay algunos pasos que puede seguir para hackear el sistema con 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 puntuación más altas para validar uno 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.
  • 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 prístina del binario (solo un poco más de problemas).
  • Si tiene claves de licencia, solicite puntajes altos para incluirlas, para poder 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.

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.

+6

gran línea: "En general, sin embargo, conseguir el juego lo suficientemente popular para las personas que cuidan a entrar ilegalmente en él es probablemente un reto mucho más grande". –

2

Como dice la otra respuesta, estás 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, simular a una compañía de tarjetas de crédito que mira los datos de carga. 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 hacer trampa 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.

3

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 hackers adivinan qué está haciendo su aplicación y luego envían sus propios resultados.

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

El cifrado 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 te preocupa, sugeriré que se ofusque el código y se diseñe el sistema de puntaje de una manera que no es completamente obvia de lo que se está haciendo. Aquí podemos tomar prestadas algunas cosas de un protocolo de cifrado. He aquí un ejemplo:

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

Como se ve eso es sólo la 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 la ofuscación, diría que sería difícil de hackear. Sin embargo, incluso eso podría ser engingeered inversa, todo depende del interés y la capacidad del hacker, pero ...en serio, ¿qué tipo de fenómeno requiere tanto esfuerzo para cambiar sus resultados en un juego? (A menos que se WoW o algo así)

Una última nota

Obfuscator for .NET

Obfuscator for Delphi/C++

Obfuscator for assembler (x86)

5

Si el juego ha construido en un sistema de repetición, puede enviar las repeticiones con el servidor y haga que el servidor calcule el puntaje de la repetición.

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

2

@Martin.

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 registro de tiempo "Grumble Volcano" más rápido, 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.

+0

Sí, eso es una hazaña en el diseño del juego frente a la piratería. Los jugadores en uno de mis juegos móviles encontraron un exploit que de hecho hizo que la jugabilidad fuera más divertida, la dejé, algunos se quejaron de que los puntajes más altos no eran reales, pero los mejores 20 son los suficientemente inteligentes como para descubrir el exploit y competir juntos. – Marc

2

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.


Fuera de interés, ¿está seguro de que la gente intentará hackear 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 puntaje trivialmente crackabe. Muchas personas lo han jugado, pero no tengo evidencia de que alguien haya tratado de descifrar los puntajes más altos.

1

Por lo general, la mayor defensa contra el engaño y la piratería es un reloj comunidad. 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 únicamente los resultados que consiguen cuestionados, porque hay una pequeña posibilidad de que un grupo de usuarios podría carro para eliminar una puntuación perfecta ganada. 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 hecho de saber que si uno trabaja duro para hacer un bot, sólo para ser derribado de nuevo por el sistema de informes, es un elemento disuasorio en sí mismo.

Quizás incluso la encriptación de los datos de repetición no estaría de más, tampoco. 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 de lucha contra la trampa no puede encontrar, los usuarios encontrarán.

Cuestiones relacionadas