212 votos

¿Cuál es la mejor manera de evitar que la gente la tabla de Puntuación basada en PHP de un juego en Flash de hacking

Estoy hablando de un juego de acción con no superior puntuación límite y no hay manera de comprobar el resultado en el servidor mediante la reproducción se mueve, etc.

Lo que realmente necesito es el cifrado más seguro posible en Flash/PHP, y una manera de evitar que las personas que llaman a la página en PHP otros que a través de mi archivo Flash. He probado algunos métodos simples en el pasado de realizar varias llamadas para una puntuación única y completar una suma de comprobación / secuencia de fibonacci, etc., y también dejando en la oscuridad el SWF con Amayeta SWF Cifrar, sino que todos fueron hackeados con el tiempo.

Gracias a StackOverflow respuestas ahora he encontrado algo más de información de Adobe - http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html y https://github.com/mikechambers/as3corelib - que yo creo que puedo usar para el cifrado. No es seguro que esto se va a obtener de mí todo CheatEngine, aunque.

Necesito saber las mejores soluciones tanto para AS2 y AS3, si son diferentes.

Los principales problemas que parecen ser cosas como TamperData y LiveHTTP cabeceras, pero entiendo que hay más avanzado de herramientas de hacking así como CheatEngine (gracias Mark Webster)

415voto

tqbf Puntos 6629

Este es un clásico problema con el Internet, los juegos y concursos. Su código Flash trabaja con los usuarios para decidir una puntuación de un juego. Pero los usuarios no son de confianza, y el Flash de código se ejecuta en el ordenador del usuario. Estás SOL. No hay nada que usted puede hacer para evitar que un atacante de la forja de puntuaciones:

  • Flash es aún más fácil de realizar ingeniería inversa de lo que usted podría pensar que es, desde el bytecode están bien documentados y describir un lenguaje de alto nivel (Actionscript) --- cuando usted publicar un juego Flash, eres la publicación de su código fuente, ya sea que lo sepas o no.

  • Los atacantes el control de la memoria de tiempo de ejecución de Flash intérprete, de modo que cualquier persona que sabe cómo usar un programables depurador puede modificar cualquier variable (incluyendo la puntuación) en cualquier momento, o alterar el programa en sí.

El más simple posible ataque contra su sistema es ejecutar el tráfico HTTP para el juego a través de un proxy, la captura de la alta puntuación de guardar y reproducir con mayor puntuación.

Usted puede intentar bloquear este ataque por la unión de cada puntuación alta salvar a una sola instancia del juego, por ejemplo mediante el envío de un token de cifrado para el cliente al inicio del juego, el cual podría ser:

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))

(También se puede usar una cookie de sesión para el mismo efecto).

El código del juego se hace eco de esta token de vuelta al servidor con la alta puntuación de guardar. Pero un atacante puede todavía acaba de iniciar el juego de nuevo, obtener un token, y luego inmediatamente a la pasta que token para reproducir alta puntuación guardar.

Así que la próxima que se alimentan no sólo un símbolo o el cookie de sesión, pero también una alta puntuación-cifrando la clave de sesión. Esta va a ser una AES de 128 bits de la clave, cifra con una clave codificada en el juego Flash:

hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))

Ahora, antes de que el juego de los puestos de la alta puntuación, se descifra la alta puntuación-cifrado-de la clave de sesión, que se puede hacer, porque usted no modificable de la alta puntuación de cifrado de sesión-clave de descifrado de clave en el Flash binario. Cifrar la puntuación más alta con este descifrada la clave, junto con el hash SHA1 de la puntuación más alta:

hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))

El código PHP en el servidor comprueba el token para asegurarse de que la solicitud procede de un juego válido instancia, y luego descifra el cifrado de alta calificación, comprobación para asegurarse de que la alta puntuación coincide con el SHA1 de la alta puntuación (si omite este paso, el descifrado se trata simplemente de producir al azar, probabilidad muy alta, puntuaciones más altas).

Así que ahora el atacante decompile Flash de su código y encuentra rápidamente la AES código, que sobresale como un pulgar dolorido, aunque si no desea ser rastreado en 15 minutos con una memoria de búsqueda y un trazador ("quiero saber mi puntaje para este juego es el 666, por lo que vamos a encontrar 666 en la memoria, luego de la captura de cualquier operación que toca ese valor --- oh, mira, la máxima puntuación código de cifrado!"). Con la clave de sesión, el atacante no tiene que ejecutar el código Flash; se agarra a un juego de lanzamiento de token y la clave de sesión y puede enviar de vuelta un arbitraria la puntuación más alta.

Usted está ahora en el punto en que la mayoría de desarrolladores acaba de renunciar --- dar o tomar un par de meses de jugar con los atacantes por:

  • La codificación AES de teclas con las operaciones XOR

  • La sustitución de la clave de matrices de bytes con funciones que calculan la clave

  • La dispersión falso clave de encriptación y de alta puntuación de publicaciones en todo el binario.

Todo esto es sobre todo una pérdida de tiempo. Se va sin decir, SSL no va a ayudar a usted; SSL no puede protegerlo cuando uno de los dos puntos finales SSL está mal.

Aquí hay algunas cosas que realmente pueden reducir la puntuación más alta de fraude:

  • Requieren un inicio de sesión para jugar el juego, el inicio de sesión de producir una cookie de sesión, y no permitir que varios pendientes juego se lanza en la misma sesión o en varias sesiones simultáneas para el mismo usuario.

  • Rechazar las puntuaciones más altas de las sesiones de juego que duran menos que el menor real de los juegos jugados (para un acercamiento más sofisticado, tratar de "poner en cuarentena" las puntuaciones más altas de las sesiones de juego que duran menos de 2 desviaciones estándar por debajo de la media de la duración del juego). Asegúrese de que usted está siguiendo el juego de las duraciones de serverside.

  • Rechazar o poner en cuarentena los puntajes altos desde inicios de sesión que sólo han jugado el juego una vez o dos veces, por lo que los atacantes tienen para producir un "rastro de papel" razonable mirando el juego de juego para cada inicio de sesión que crean.

  • "Latido" de las puntuaciones durante el juego, por lo que su servidor ve la puntuación de crecimiento durante la vida útil de un juego. Rechazar los altos puntajes que no siga razonable puntuación curvas (por ejemplo, saltar desde 0 a 999999).

  • "Instantánea" del estado del juego durante el juego (por ejemplo, cantidad de munición, la posición en el nivel, etc), que luego puede conciliar contra grabado provisional de puntuaciones. Usted incluso no tiene que tener una manera para detectar anomalías en los datos para empezar, sólo tienes que recogerlo, y luego se puede volver atrás y analizar si las cosas se ven de pescado.

  • Deshabilitar la cuenta de cualquier usuario que falla uno de sus cheques de la seguridad (por ejemplo, mediante la presentación de un cifrado de alta calificación que se produce un error de validación).

Sin embargo, recuerde que usted sólo disuadir alta calificación de fraude de aquí. No hay nada que usted puede hacer para evitar que si. Si hay dinero en la línea en su juego, alguien va a derrotar a cualquier sistema que pueda venir. El objetivo no es detener este ataque; es para hacer el ataque más caro que conseguir realmente bueno en el juego y vencerla.

25voto

Stephen Deken Puntos 2418

Usted puede estar haciendo la pregunta equivocada. Usted parece enfocarse en los métodos que la gente utiliza para juego a su manera la puntuación más alta de la lista, pero el bloqueo de determinados métodos, sólo va tan lejos. Yo no tengo experiencia con el TamperData, así que no puedo hablar de eso.

La pregunta que debemos hacernos es: "¿Cómo puedo verificar que presentaron puntuaciones son válidos y auténticos?" La forma concreta de hacerlo es juego-dependiente. Por muy simples juegos de rompecabezas, usted puede enviar a través de la partitura junto con las específicas del estado inicial y la secuencia de los movimientos que se tradujo en el estado final, y, a continuación, vuelva a ejecutar el juego en el lado del servidor usando el mismo se mueve. Confirmar que la declaró la puntuación es la misma que la puntuación calculada y sólo aceptan la puntuación si coinciden.

19voto

stormlash Puntos 827

Una forma fácil de hacer esto sería proporcionar un hash criptográfico de su puntuación en valor, junto con el puntaje de sí mismo. Por ejemplo, cuando la publicación de los resultados a través de HTTP GET: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

A la hora de calcular esta suma de comprobación, un secreto compartido debe ser utilizado; este secreto nunca debe ser transmitida a través de la red, sino que debe estar codificado tanto en el backend PHP y el flash de la interfaz. La suma de comprobación de arriba se crean anteponiendo la cadena "secreto" a la puntuación de "500", y se ejecuta a través de md5sum.

Aunque este sistema evitará que un usuario de la fijación arbitraria de las puntuaciones, esto no impide que un "ataque de reproducción", donde un usuario reposts que previamente se calcula la puntuación y el hash de la combinación. En el ejemplo anterior, una puntuación de 500 podría producen siempre el mismo valor hash de la cadena. Algunos de los riesgos pueden ser mitigados mediante la incorporación de más información (tales como nombre de usuario, fecha y hora, o dirección IP) en la cadena ser de hash. Aunque esto no va a impedir la repetición de los datos, se asegurará de que un conjunto de datos sólo es válida para un único usuario en un único momento.

Para evitar cualquier repetición de los ataques que se produzcan, algún tipo de reto-respuesta del sistema deben ser creados, tales como los siguientes:

  1. El juego flash ("el cliente") realiza un HTTP GET de http://example.com/highscores.php sin parámetros. Esta página se devuelven dos valores: una generada aleatoriamente sal de valor, y un hash criptográfico de que la sal de valor, combinado con el secreto compartido. Esta sal de valor deben ser almacenados en una base de datos local de espera de consultas, y deben tener una marca de tiempo asociado con él, de manera que se puede "caducar" después de tal vez un minuto.
  2. El flash juego combina el valor de la sal con el secreto compartido y calcula un hash para comprobar que coincide con el proporcionado por el servidor. Este paso es necesario para evitar la manipulación de los valores de sal por parte de los usuarios, como se verifica que el valor de la sal era en realidad generada por el servidor.
  3. El flash juego combina el valor de la sal con el secreto compartido, de alto valor de puntuación, y cualquier otra información relevante (nombre de usuario, la dirección ip, fecha y hora), y calcula un hash. A continuación, se envía esta información a la backend PHP a través de HTTP GET o POST, junto con el valor de la sal, la puntuación más alta, y otra información.
  4. El servidor combina la información recibida de la misma manera como en el cliente, y calcula un hash para comprobar que coincide con el proporcionado por el cliente. Entonces, también se verifica que el valor de la sal es todavía válida como aparecen en la pendiente de la lista de consulta. Si se cumplen ambas condiciones, se escribe la alta puntuación a la tabla de puntuación más alta y devuelve firmado un mensaje de "éxito" para el cliente. Además, se elimina el valor de la sal a partir de la pendiente de la lista de consulta.

Por favor, tenga en cuenta que la seguridad de cualquiera de las técnicas anteriores se ve comprometida si el secreto compartido es siempre accesible para el usuario

Como alternativa, algunos de este ida y vuelta podría ser evitado por forzar el cliente para comunicarse con el servidor a través de HTTPS, y a asegurar que el cliente está configurado para sólo confiar en los certificados firmados por una autoridad de certificación de la que sólo tú tienes acceso.

11voto

DGM Puntos 14007

Me gusta lo que tpqf, dijo, pero en vez de deshabilitar una cuenta cuando se descubre el engaño, implementar un honeypot para cada vez que inician sesión, ver sus cuentas hackeadas y nunca sospeche que ellos se han marcado como un troll. Google para "phpBB MOD Troll" y usted verá un enfoque ingenioso.

4voto

divillysausages Puntos 5991

En respuesta tqbf menciona que sólo se puede hacer una búsqueda de la memoria para la puntuación de la variable ("Mi puntaje es el 666 por eso busco el número 666 en la memoria").

Hay una forma de evitar esto. Tengo una clase a continuación: http://divillysausages.com/blog/safenumber_and_safeint

Básicamente, usted tiene un objeto para guardar tu puntuación. En la incubadora se multiplica el valor que se le pasa con un número aleatorio (+ y -), y en el captador de dividir el valor guardado por el azar multiplicador para obtener el original. Es simple, pero ayuda a detener la búsqueda de la memoria.

También, ver el video de algunos de los chicos detrás de la Pulsador motor que hablar de algunas de las diferentes formas de combatir la piratería: http://zaa.tv/2010/12/the-art-of-hacking-flash-games/. Ellos fueron la inspiración detrás de la clase.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X