El juego de Android sigue siendo hackeado [cerrado]

143

Así que ya hemos pasado por esto varias veces, lanzamos un juego (de bajo costo) y alguien lo piratea y lo pone en un espejo. Configuramos las Alertas de Google para todas nuestras aplicaciones, por lo que nos dicen a diario quién está hackeando. Hasta ahora, hemos implementado el servicio de licencias, como lo sugirió Google, nuestra sal se hace aleatoriamente cada vez que se inicia la licencia con la identificación única del dispositivo. Ejecutamos el servicio de verificación una vez, cuando la aplicación se inicia por primera vez. Luego generamos un hash de 512 caracteres para la clave y el valor almacenado que se compara con SharedPreferences a partir de ahí en adelante.

Ahora, sé que verificar una vez es probablemente donde se bloquea la aplicación. Lo más probable es que nuestro código de bytes haya sido revisado y compilado sin la línea que inicia la verificación.

Desde aquí, no quiero ofuscar nuestro código, ya que lo he visto roto antes. Quiero algo un poco más sólido, y también quiero aprender cómo hacerlo correctamente. En este punto, estoy más interesado en aprender que en ganar dinero, ya que solo el 2% de las personas buscará alguna vez una versión pirateada.

Hasta ahora, por mi cuenta, he creado un generador de números aleatorios que se coloca en varias áreas de inicio del juego. Cuando se inicia (por ejemplo, 1 de cada 50 veces) se verifica la licencia. Sé que esto dificultaría la piratería porque el cracker tendría que eliminar cada caso, compilar, eliminar, compilar. Sin embargo, este método aún es crackable ... entonces, ¿qué sugieren ustedes? Nuevamente, estoy realmente interesado en este proceso de seguridad, así que por favor eduque, no convierta esto en una discusión sobre ofuscación o verificación periódica basada en una marca de tiempo.

Gracias

BajaBob
fuente
27
Si no te hubieras dicho a ti mismo que estás más interesado en aprender que en ganar dinero, mi respuesta sería simplemente "no vale la pena el dolor de cabeza". Dado que está interesado en el dolor de cabeza en sí, le digo que siga adelante (pero no tengo una respuesta para usted, solo seguiré esta pregunta como todos los demás).
Thiago Arrais
44
Si el mismo juego sigue siendo pirateado, ¿estás seguro de que no tienes un miembro problemático del personal? No es lo más agradable de considerar, pero puede suceder
Phil Lello
3
Aunque tiene más de 20 mil líneas de código, administro todo el proceso por mí mismo.
BajaBob
3
@BajaBob, entonces eres el topo: D
Sulfkain

Respuestas:

117

Mi idea no es una prueba de hackers, pero podría eliminar parte del interés por hackear el juego.

Modelo Freemium

1) Haz los primeros 5-10 niveles gratis para que las personas puedan aprender el juego y divertirse sin pagar. Menos querrá piratear el primer nivel y el juego se extenderá aún más por el modelo Freemium.

Shareware / paquetes de niveles agrupados

2) Deja que parte de los niveles o la lógica del juego permanezcan en línea. P.ej. al alcanzar el nivel 5 o 10 o 15, luego descargue partes pequeñas para el juego, y cada vez que envíe el registro de progreso del juego y valide esto contra posibles valores + códigos hash. Esto quizás podría permitir cerrar automáticamente las cuentas pirateadas.

Stealth Cheater Protection

3) También puedes contar "pequeñas banderas de advertencia" que colocas en el juego. No verifique la "validación" al principio, no incorpore estas banderas en la lógica del juego. No hagas que rompa el juego, porque nadie lo buscará. Luego, cuando el usuario llegó al final del monstruo de nivel, verifique si hubo alguna marca de advertencia registrada. Estos no aparecerán dentro del juego, por lo que el usuario desconocido con una edición pirateada podría estar jugando durante horas / días y darse cuenta repentinamente de que no podía terminar el juego o avanzar al siguiente nivel, porque el juego tenía un "error". Lo que el usuario no sabía era que este error solo se produce en clientes pirateados.

Conclusión

Sé más inteligente que las galletas. Engañarlos para que piensen que el trabajo está hecho. Haga una protección contra copia y sepa que los crackers más avanzados podrán eliminarla. Pero probablemente no quieran jugar 50 niveles para comprobar si el crack también funciona del todo.

Una vez que se den cuenta de este problema, podrían comenzar a resolverlo también. Pero si divide el juego en paquetes de niveles, aún puede validar entre cada descarga de paquete. Entonces, una vez que reciba los datos hash del cliente pirateado, simplemente ejecute una excepción y bloquee el juego en el cliente. Vaya, el juego se bloqueó. No digas que es porque está pirateado. Un error del programa puede suceder. :-)

De nuevo, no es una prueba de hackers. Pero podría molestarlos lo suficiente como para pasar al siguiente juego. Por último, también podría publicar actualizaciones periódicas para el juego y solo la última versión debería poder "publicar los registros", etc., de modo que los usuarios activos tendrían que actualizar para mantenerse al tanto.

BerggreenDK
fuente
55
Wow, ideas geniales. Realmente aprecio todo esto, ni siquiera consideró hacer los niveles y publicarlos en un servidor y validarlos. Versonando ... gran idea. Mantenga a todos actualizados, haga que sea irracional crackear. ¡Muchas gracias, esto me mantendrá ocupado por un tiempo!
BajaBob
12
Suspiro, lástima que no puedas hacer +2 en una respuesta :) Un comentario: ¿Cómo puedes demostrar que el problema radica en que el juego está siendo pirateado? Si el juego tiene errores / es raro en una copia pirateada, la gente podría pensar que es un error y hablar mal del juego en los foros. No creo que este sea un problema tan grande en Android ya que no hay tantos foros con una gran audiencia, pero me pregunto si tiene sentido tener un descargo de responsabilidad por adelantado que "las copias piratas podrían no funcionar bien".
EboMike
3
Puedo recordar un juego de 1978 en el TRS80 que actuaría al azar si se eliminara la protección contra copia. Solo hubo 1 verificación de validez, y eliminarlo significaba que podía copiar libremente el juego, pero los extraños errores de juego no ocurrirían en copias legítimas, solo en copias pirateadas. Nadie pensó que era culpa del desarrollador ... sabíamos lo que estaba pasando.
Fixee
1
@EboMike Creo que la parte fuerte de mi idea para la protección contra copia es "actuar de la manera más normal posible", ni siquiera darles a los crackers una idea de los desagradables esquemas de protección que tenemos por delante. Esto solo haría que los más curiosos cazaran la protección. Solo por el gusto de hacerlo. Recuerde, muchos de ellos no lo hacen por el dinero, sino solo porque pueden presumir. Así que no los tientes. Solo actúa de manera casual. : o) Sé más inteligente que ellos.
BerggreenDK
2
@Fixee y otros El reciente juego Batman Arkham Asylum tenía algo parecido a eso: en copias pirateadas, un movimiento crucial fracasaría y te atascaría bastante temprano en el juego. Luego, cuando alguien se quejaba del "error" en los foros, el desarrollador podía sonreír y decir "no es un error en el juego, es un error en su código moral".
Nzall
20

He estado haciendo un poco de descompilación y pirateo de apk durante un tiempo (no warez, pero mods y hacks principalmente para las aplicaciones de google y el marco de android, siempre respetando las políticas de desarrolladores xda).

Una vez que aprende a leer smali, es casi como leer el código original de Java (pero con muchos más LOC). Por lo tanto, cualquier código que agregue para verificar las claves se puede encontrar y eliminar o reemplazar. Ni siquiera necesita volver a compilar cada vez para eliminar más de uno (algunas búsquedas hacen milagros para encontrar piezas de código similares) e, incluso si se necesitan ciclos de compilación / recompilación para encontrarlos, es solo una cuestión de uno o dos minutos descompilar: todo está automatizado por apktool y aún más por apkmanager.

Dicho esto, mi sugerencia para usted es implementar algún tipo de tabla de puntuación en línea o similar, y cuando el usuario mira la tabla de puntuación en línea, puede verificar el código hash que implementó y compararlo con la cuenta de Gmail asociada. De esa manera, puede informar el hackeo a Google y enviar un mensaje desagradable al usuario de warez, explicando por qué eso es ilegal.

Por supuesto, se podría implementar un nuevo truco para eliminar la tabla de puntuación, pero eso reduciría el interés de los warez.

Buena suerte.


Actualizar

Después de investigar para responder esta pregunta: inyectando código en APK (realmente sobre el mecanismo de Amazon DRM), puedo decir un poco sobre cómo Amazon protege las aplicaciones: incluye métodos para verificar la validez de la instalación en todas partes (puede ver un ejemplo de cómo lo hacen en mi respuesta a esa pregunta). Esto hará que cualquier intento de hackear una aplicación no sea muy difícil, pero extremadamente tedioso. Creo que es un punto fuerte: los hackers no querrán pasar tanto tiempo haciendo tantas tareas repetitivas: no es un desafío y es aburrido. El principal defecto que veo en ese enfoque es la posibilidad de hackear la aplicación de Amazon para que siempre devuelva una respuesta válida, por supuesto. Pero, si combina sus comprobaciones hash actuales con algún tipo de comprobación en línea dispersa entre sus métodos, creo que las posibilidades de que sea pirateado pueden reducirse drásticamente.

Aleadam
fuente
3
Debo mencionar que mucha gente tiene un problema con las aplicaciones "llamando a casa". Personalmente, eso es estúpido: un teléfono con Android 'llama a casa' de tantas maneras con tanta frecuencia que realmente no importa, y ¿cuál es el problema con una verificación de verificación de licencia anónima? Todavía quería descartar eso: algunas personas sienten un gran mal olor por "llamar a casa", especialmente cuando no se revela.
EboMike
3
Bueno, es comprensible que las personas puedan tener un problema si la aplicación 'llama a casa' y no le avisa al usuario. Pero una tabla de puntaje basada en la web resuelve que, dado que es el usuario el que se conecta voluntariamente
Aleadam es el
Es cierto, pero una vez que usa la conexión que se suponía que debía subir "anónimamente" los puntajes y enviar el hash de la cuenta de Gmail, es un problema diferente. De nuevo: no para mí. Creo que esto es perfectamente razonable, y personalmente estaría tentado a implementar este esquema en mi propia aplicación. Las personas que se quejan serán minoritarias (y, muy probablemente, comprarán la aplicación independientemente).
EboMike
¿Por qué descompilarías el framework en lugar de descargar el código fuente?
Phil Lello
1
@Phil no tienes acceso al código fuente para el touchwiz o los FW de detección, así que si quieres modificar un teléfono en particular, a veces la forma más fácil es descompilarlo y cambiar el smalis.
Aleadam
20

Tomado de mi solución de esta publicación Evite apk agrietado

Implemente su propia biblioteca de licencias.

También lo recomiendo para ver esto desde la grabación de Google I / O 2011 en YouTube:

Evadiendo piratas y deteniendo vampiros

EDITAR:

Las notas de presentación de evadiendo piratas y deteniendo vampiros

Algunos puntos clave básicos

Try TryAgain
fuente
Los enlaces anteriores parecen no ir siempre a la página vinculada ... parece que solo funciona a veces y depende del sistema operativo y del navegador. Por lo tanto, tome nota del final #%3ar.page.15en las URL. Si no se le redirige automáticamente a esa página, asegúrese de mirar el enlace para ver dónde / qué página debería estar mirando.
Try TryAgain
1
¡Agradable! Veo que también creen en Freemium y ocultan ciertos "errores" dentro del juego (simplemente usando una técnica de licencias). Me gustaría una solución multiplataforma en lugar de un servidor de licencias solo para Android. Pero interesante también.
BerggreenDK
por cierto. es divertido, esta respuesta tiene 15 pulgares arriba, la mía ya ha cruzado 90 y no se considera la respuesta correcta :-)
BerggreenDK
8

Sé que realmente no te ofuscas, pero realmente necesito reaccionar a esto:

Desde aquí, no quiero ofuscar nuestro código, ya que lo he visto roto antes. Quiero algo un poco más sólido, y también quiero aprender cómo hacerlo correctamente.

ProGuard es muy confiable en mi experiencia, y esto a pesar de que uso un par de funciones avanzadas como AIDL y algún código nativo que llama al método Java. Toma un poco de trabajo leer la documentación y hacer las cosas correctamente, pero una vez que estás ProGuard es extremadamente confiable y también optimiza su aplicación.

Los trucos de seguridad personalizados / criptográficos son buenos, pero sin ofuscación es como arrojar una piedra al agua en mi humilde opinión.

He usado ProGuard en producción durante muchos meses, y funciona perfectamente.

Si le gusta aprender, lea cuidadosamente el manual de ProGuard, experimente con él e inspeccione sus registros de salida.

olivierg
fuente
todo lo que se puede leer también se puede descompilar, solo es cuestión de potencia de CPU y terquedad. La ofuscación todavía permite que el código se ejecute, por lo que mientras se descompila / desofusca el código, el cracker aún puede comparar la versión en ejecución con la original. Puede retrasar el cracker o detener el cracker menos experimentado, pero no es seguro en absoluto.
BerggreenDK
4

La posibilidad de que haya programadores más talentosos que USTED (se aplica a todos los programadores) es del 100%. Y si eso es cierto, no puedes arreglar la piratería. Pero puede dedicarle tanto tiempo y esfuerzo para quebrar.

Si desea ganar dinero serio, debe investigar un poco sobre su grupo de usuarios objetivo y las ciencias del comportamiento. Necesitas hacer que los usuarios que jueguen traigan dinero nuevo, y eso es todo.

Además, lo entendiste todo mal. Los hackers son los miembros más activos de su base de usuarios, simplemente se comportan de una manera que no pretendían.

Tome los juegos de Zynga en Facebook, por ejemplo, ¿cree que ha sido pirateado? - Claro, y alrededor de +100000 jugadores solo juegan, porque puedes usar bots, que automatizan todo.

Tener una gran base de usuarios activa de botnets de personas reales, hace que los jugadores de tipo archivero quieran jugar, y si juegas, y se ve genial, entonces Avarage Joe también querrá jugar. Si Avarage Joe juega, entonces sus amigos podrían querer jugar, y probablemente no le importará nada más, entonces ser mejor que su amigo, matar el tiempo o tener algo de qué hablar. Es probable que los amigos de Avarage Joe estén dispuestos a pagar para ser mejores que Joe, pero más bien le gustaría invertir en algo que los haga mejores.

Además, si el valor real es jugar el juego gratis, entonces los usuarios que usan la versión gratuita pirateada, probablemente nunca habrían pagado por ello. Pero tú eres Avarage Joes y sus amigos podrían. Así que este es el comercial más barato que puedes tener. Si quieres ganar dinero con tu gran base de usuarios, solo crea nuevas versiones del juego con pequeños cambios en los niveles y gráficos.

Margus
fuente
3

La piratería siempre será un problema. En general, los crackers son mejores para jugar a este juego de seguridad aunque oscuridad que los desarrolladores.

torre
fuente
2

Qué pregunta tan interesante e inquietante. :-) Como ejercicio, puede intentar lanzar una aplicación a través de Amazon; tienen su propio mecanismo DRM; Me pregunto si funciona mejor que ProGuard ...

George Freeman
fuente
1
¡A partir de hoy, la aplicación Lucky Patcher también ha descifrado Amazon DRM! Aparte de ProGuard, otra solución podría ser DexGuard. Pero comprar DexGuard cuesta unos cientos de euros, pero uno no puede estar seguro de que incluso puede proteger sus códigos de ser pirateados ...
ChuongPham
2

En mi opinión, uno de los elementos clave es extender el código para que no esté todo en un solo lugar. Si tiene una función llamada LicenseChecker.checkLicense () que recupera la licencia y la verifica, puede estar seguro de que se deshabilitará de inmediato.

La única ventaja que tiene es que los crackers no pueden ver los comentarios de su código (y, si se ofusca, los nombres de los métodos / variables), se le ocurre algo extraño. En onCreate () de una actividad, obtiene el ID de la licencia. En onResume (), obtienes otro valor para compararlo. Tal vez cree un hilo y haga algunas verificaciones allí. Y luego, alguna otra pieza de código irrelevante (tal vez el control del jugador) podría recoger el valor y compararlo y almacenar el resultado en algún lugar. Luego, otras tres partes de código irrelevantes comprobarán de forma independiente ese valor y desactivarán su aplicación si no coincide.

Ahora debería decir de antemano que esto puede causarle dolor de cabeza: obviamente, el código desordenado y desagradable es más difícil de depurar y puede causar errores. En el peor de los casos, crea falsos positivos en aplicaciones compradas legítimamente.

Y, por supuesto, todo se puede aplicar ingeniería inversa: una vez que los crackers encuentran el lugar donde la aplicación está deshabilitada, rastrean el valor que se está leyendo. Luego podrían rastrear dónde se está almacenando y rastrear eso ... o, mucho más fácil, simplemente pueden deshabilitar la verificación final (es por eso que recomendé 3 lugares diferentes, todos desencadenados). La seguridad es tan buena como el eslabón más débil.

No podrás detener la piratería. Su mejor opción es retrasar la difusión de una copia pirateada hasta que la publicidad inicial sobre su aplicación se haya calmado.

EboMike
fuente
1

Primero, NO me considero un profesional en el campo de la seguridad de SW, pero:

Creo que una cosa importante es dejar que la aplicación dependa en alguna parte de la verificación de firma. No deje que afecte de inmediato, pero deje que establezca algunas banderas o cambie algunos valores. más adelante, use esas banderas, verifíquelas, deje que su ausencia / incorrección provoque una excepción de algún tipo que terminará la aplicación tal vez. Siempre que la verificación de firma solo sea relevante en este momento, es fácil omitirla, eliminar la línea, una vez que toca más áreas en el código, su aplicación se vuelve más difícil (o menos fácil ...) de hackear. Además, tal como lo veo, no todas las verificaciones deberían llamar a la misma rutina para la sanción, porque esto también facilitará la búsqueda del mecanismo de protección y su finalización.

Por supuesto, la sanción a tomar en casos de SW ilegal puede variar, es posible que desee bloquear la aplicación cuando se usa ilegalmente, pero es posible que también desee mantenerla en funcionamiento y solo enviar un mensaje que le pida al usuario que compre una copia legal de la aplicación.

Si esto es justo lo que no querías escuchar, entonces lamento tu tiempo :)

MByD
fuente
77
Hacer que su aplicación se bloquee cuando detecte que ha sido pirateada puede ser contraproducente, a menos que lo haga muy explícito por eso se bloqueó. Recuerdo haber leído sobre algunos desarrolladores de juegos que hicieron que su juego se bloqueara después de un período de tiempo aleatorio si fallaba un control antipiratería. Por supuesto, toneladas de personas lo piratearon, pero no se dieron cuenta de que los accidentes se debieron a que estaban ejecutando una versión pirateada. Esto resultó en mucha mala prensa para los desarrolladores, y puede haber afectado sus ventas.
Mitch Lindgren
3
@ Mitch - Estoy de acuerdo. Lo di como una posibilidad, pero la "mejor" estrategia técnica tal vez, probablemente no sea la mejor estrategia "comercial".
MByD
0

Los usuarios de Android simplemente aceptarán el dolor de las casas telefónicas constantes. La única aplicación segura de Android es una aplicación de Android siempre conectada.

Esto se debe, en gran parte, a la negativa de Google a bloquear la instalación, como lo ha hecho Apple. En IOS tienes que hacer jailbreak al teléfono. En Android, puede cargar cualquier APK en una instalación estándar de fábrica.

Mantenga parte / la mayoría / todo su contenido en el servidor; entregarlo en trozos; validar la licencia / sesión en cada llamada.

yetimoner
fuente
Aclaración: si bien puede rootear cualquiera de las plataformas, solo un pequeño porcentaje de usuarios de IOS realmente lo hará por temor a instalar la instalación. También en muchas partes del mundo es difícil o imposible pagar una aplicación de Android, lo que alimenta la piratería.
yetimoner
Esta fue en realidad una de las ideas de mi respuesta de 2011 ... ¿por qué publicarlo de nuevo?
BerggreenDK
0

Será increíblemente difícil inhibir este tipo de comportamiento. Todo lo que se maneja en el lado del cliente se puede piratear mediante la descompilación y modificación de APK, la edición de memoria con software como Game Guardian ect.

La única forma en que puedo ver cuán parcialmente es evitar hacer un juego en línea. O tener ciertas funciones manejadas en línea. O si el cifrado antisabotaje como Denuvo alguna vez está disponible para Android / iOS.

Techinator
fuente