2009-05-08 22 views
11

Supongamos que está diseñando un juego para PC que realiza un seguimiento de los puntajes más altos. Además de mantener puntajes locales, se configura un servidor de puntaje global al que accede el juego a través de Internet. Los jugadores deberían poder enviar sus puntajes más altos a la lista global de puntajes altos justo después de haber completado un juego, o más tarde, de su lista local de puntaje más alto. Este debe ser un problema común; Los juegos de arcade en las consolas de juegos modernas a menudo cuentan con una lista global de puntuaciones altas que funciona así.¿Cómo puede evitar que puntajes altos falsos aparezcan en una lista global de puntajes altos?

Mi pregunta se reduce a: ¿cómo se puede evitar que alguien presente puntuaciones altas falsas? O, dicho de otra manera, ¿cómo puede el servidor de puntaje global estar seguro de que un puntaje enviado realmente se produjo al recorrer el juego?

Cuanto más pienso en esto, más creo que puede ser un problema sin solución.

Lo que haría comúnmente para verificar que un mensaje provenga de una fuente determinada es hacer que la fuente firme digitalmente el mensaje. Ciertamente podría hacer eso en este caso, pero el problema real es que el jugador, al tener el software, también tiene la clave privada del software. No importa lo ofuscado que pueda ser, puede ser de ingeniería inversa, o incluso simplemente extraído de la memoria.

Otra opción sería enviar una repetición del juego del jugador al servidor de puntuación más alta, que ejecutaría rápidamente la repetición y verificaría que el puntaje enviado coincide con el resultado de la repetición. Esto no resuelve el problema, pero ciertamente hace que sea más difícil falsificar un puntaje alto si también tiene que producir una repetición muy compleja que lo "pruebe".

¿Es este un problema que tiene una solución, o es realmente insoluble? ¿Existen técnicas utilizadas por los desarrolladores de la consola de juegos local para evitar este tipo de exploits, o simplemente confían en la consola para evitar que se ejecute un código no autorizado?

+0

La presencia de puntuaciones falsas es el resultado de personas jugando fuera de las reglas establecidas. Entonces, en cierto sentido, se trata de un problema de personas y no de un problema del sistema (o uno que puede resolverse a nivel del sistema). – rndmcnlly

Respuesta

6

Para un juego de PC donde el puntaje es generado por el cliente, este no es un problema solucionable ya que el cliente es inherentemente indigno de confianza.

Lo único que puede intentar hacer es dificultar que alguien envíe un puntaje falso.

Algunos pensamientos:

  • Proteger la puntuación en memoria. Puede usar API's como CryptProtectMemory para ocultar la puntuación en la memoria: una simple escritura de memoria no funcionará. Sin embargo, con un depurador adjunto o mediante la inserción de código en su proceso, aún podrían modificar el puntaje. Puedes ver varios esquemas para tratar de vencer a los depuradores.

  • Protege la puntuación en ruta al servidor. Puede encriptar los datos que se envían al servicio, como sugiere, pero dado que la parte que no es de confianza tiene el control de la clave, esto no es más que una ofuscación y no ofrece una protección sólida.

  • Valida el puntaje en el servicio. Me detestaría hacer esto, más allá de los controles muy simples. Un error aquí provocará que rechaces puntajes válidos. Será imposible distinguir entre tramposos y jugadores fuertes.

En este punto, realmente tiene que preguntarse si el esfuerzo de ingeniería realmente lo vale. ¿Qué pasa si alguien publica un puntaje no válido? ¿Qué es lo que realmente pierdes? Haría lo mínimo para protegerme contra un niño con un simple guión. Es decir, no tiene su presentación puntuación sea justo:

http://myservice.com/submitscore.aspx?PlayerName=Michael&Score=999999999 

me acaba de utilizar la protección simple en la memoria contra fisgones casuales, algunos de ofuscación sencilla en el cable (hash de la partitura con una galleta servidor) y por hacer.

5

Que yo sepa, esto no tiene solución.

He visto a mucha gente tratar de ocultar la clave de encriptación. He visto a algunas personas incluir otros controles de cordura como el tiempo transcurrido o los enemigos restantes. Nunca he visto uno que envíe una repetición, aunque, por supuesto, es posible.

En un sitio web que permanecerá inalterado, configuran una rutina de envío de resultados falsos que se encuentra fácilmente. Si un perpetrador lo usa, su dirección de IP será automáticamente prohibida en futuras actualizaciones.

1

Olvídese de la cuestión criptogénica; Si su código puede ser pirateado en la máquina local, ¿cómo evitar que alguien establezca un alto puntaje loco de manera artificial y luego transmitirlo utilizando el mecanismo de confianza existente?

Hasta que pueda establecer la confianza en el código en sí, un mecanismo criptográfico para las comunicaciones no será el problema real.

6

"Otra opción sería enviar a lo largo de una repetición de juego del jugador ... Esto no resuelve el problema,"

serio? Por qué no?

"también tiene que producir una repetición muy compleja que" pruebe "[la puntuación]".

¿Estás sugiriendo que alguien podría fingir la repetición? ¿Razonar una solución de puntaje súper alto sin jugar realmente el juego? Falsificar las marcas de tiempo y todo? Tire de Donald Crowhurst?

¿Por qué no simplemente jugar el juego en lugar de intentar falsificar un registro de jugar el juego?

O ... si es tan fácil falsificar un historial de juego que conduzca a una puntuación súper alta, quizás el juego esté mal diseñado. Si el juego es "difícil", la persona debe tomar todas las decisiones correctas. Si el juego es fácil, entonces el puntaje no refleja las elecciones del jugador y es fakable.

Piénsalo de esta manera. Elija cualquier juego o deporte. Alguien dice que, digamos, Suiza venció a Nueva Zelanda en una regata de yates. Usted los desafiaría buscando detalles sustantivos sobre el lugar, los barcos, los equipos y las carreras individuales para convencerse de que era cierto. Ciertamente, podrían fingirlo, pero si tienen un rico conjunto de detalles que cubren la carrera, entonces ... ¿cómo es eso no es "prueba"?

+0

Su punto es absolutamente válido. En la práctica, * enviaré los datos de la reproducción y verificaré los puntajes con ella. Principalmente pregunté porque estoy interesado en aprender sobre otros métodos útiles de asistencia tecnológica para prevenir este tipo de abuso. –

+0

Estoy completamente en desacuerdo con que un juego en el que es fácil crear una secuencia de movimientos que representa el estado del juego necesariamente debe estar "mal diseñado". Considere el ajedrez, por ejemplo. –

+0

@John Feminall: no es "fácil crear una secuencia de movimientos" sino "fácil de falsificar una historia de juego que lleva a una puntuación súper alta". Si puedes simular una puntuación súper alta, el juego está mal diseñado. Si puedes simplemente reclamar una victoria, eso no es bueno. Tienes que respaldar ese reclamo con las decisiones que conducen a la victoria. –

-2

Envía el hash del (software + sal aleatoria) junto con el puntaje. Comprueba este hash con el servidor. Si coincide (lo que significa que el software no está alterado) acéptelo. De lo contrario, el puntaje proviene de una versión "modificada" del juego. Rechazarlo. La sal aleatoria debe cambiar cada vez que se genere el hash (tiempo del sistema actual o algo así)

Consulte el código fuente de Quake III Arena. Su versión fue bastante tonta. Desafortunadamente, no recuerdo el enlace ahora.

+1

. Es fácilmente reversible y no es para nada infalible. – Unknown

Cuestiones relacionadas