2011-08-19 10 views
10

Un exploit común en los juegos casuales es avanzar artificialmente el reloj del sistema para saltar adelante en el juego. ¿Cómo puede un usuario avanzar en el reloj para ser detectado por una aplicación en un dispositivo iOS?¿Cómo puedo detectar localmente el avance del reloj del iPhone por un usuario entre las ejecuciones de la aplicación?

  • no debe implicar la comunicación de red
  • no debe asumir aplicación está abierta (en ejecución o suspendido), mientras que el reloj está avanzada
  • debe detectar el avance de reloj, la detección de rollback reloj no es suficiente

Idealmente , la solución sería robusta contra reinicios, pero eso no es un requisito.

+1

No creo que se pueda hacer sin comunicación de red. El receptor del GPS 'podría' hacer esto, pero no creo que exponga ninguna de las cosas del tiempo en la API. – iandotkelly

Respuesta

1

Estaba pensando en el hecho de que las cosas de CoreLocation podrían hacer esto si esa parte de los datos del GPS estuviera expuesta a usted. Sin embargo, eso me hizo pensar.

Mi única sugerencia (exagerada) es poner algo en el procesamiento en segundo plano, que tiene que ser por una pequeña razón específica, por ejemplo, para rastrear la ubicación en segundo plano. Como efecto secundario de eso, intente detectar un cambio de reloj en un temporizador regular. Apple podría rechazarlo, ya que puede estar claro que no está utilizando la información de ubicación y es solo una razón para explotar el procesamiento en segundo plano.

Cualquier solución que no implique el establecimiento de una red es entonces mucho más difícil de implementar, me pregunto por qué no la está usando.

11
+1

mach_absolute_time se reinicia al reiniciar el dispositivo. Está bien si un usuario elude la detección de trampas al reiniciar, pero no está bien si reiniciar incorrectamente los señala como haber avanzado el reloj. –

+0

Además, basado en la buena publicación del blog de Ben Dodson aquí, http://bendodson.com/weblog/2013/01/29/ca-current-media-time/, esto no funcionaría si el dispositivo se fuera a dormir por algún el tiempo entre reproducciones ya que parece que el CACurrentMediaTime (y por lo tanto mach_absolute_time ya que está basado en él) solo cuenta el tiempo del dispositivo activo y no el tiempo de actividad. – stuckj

0

Mientras que yo no creo que sea posible determinar con fiabilidad si un usuario tiene manualmente adelantó su reloj sin acceso a la red, por supuesto puede determinar de manera confiable si han retrocedido en el tiempo. Y como sabemos que esto es físicamente imposible, se puede suponer que han manipulado su reloj para hacer trampa.

Lo que quiero decir con esto es que no es el proceso habitual para activar alguna acción en la aplicación que requiera un período de espera, salir de la aplicación y adelantar el reloj, volver a ejecutar la aplicación para obtener lo que sea esperando y luego restablecer el reloj a la hora actual?

Si este es realmente el caso, para construir sobre la sugerencia de @smgambel, puede almacenar la hora física y la zona horaria actual en cada lanzamiento y compararla con la hora y la zona horaria previamente almacenadas.Si el tiempo es detrás de el tiempo almacenado anteriormente, y la zona horaria del dispositivo no ha cambiado, entonces puede asumir con seguridad que el usuario ha manipulado el reloj.

Cuestiones relacionadas