¿Qué utiliza para agrupar / cifrar datos?

14

Cada vez más juegos van por la ruta basada en datos, lo que significa que debe haber una capa de seguridad en torno a la manipulación fácil. Lo he visto donde los juegos agrupan por completo sus activos (audio, arte, datos) y me pregunto cómo están manejando eso. ¿Existen aplicaciones / bibliotecas que lo agruparán y lo ayudarán a administrar los activos dentro? Si no, ¿hay algún buen recurso al que apunte para empacar / desempacar / encriptar?

Esta pregunta específica gira en torno a C ++, pero estaría abierto a escuchar cómo se maneja esto también en C # / XNA.

Para ser claros, no estoy dispuesto a diseñar una solución para evitar la piratería. En el nivel fundamental, todos estamos manipulando 0 y 1. Pero, queremos evitar que el 99% de las personas que juegan al juego simplemente modifiquen los archivos XML que se utilizan para construir el mundo del juego. He visto muchos juegos agrupar todos sus recursos juntos. Simplemente tengo curiosidad sobre los métodos que están utilizando.

David McGraw
fuente
Buena pregunta, aunque no creo que haya una manera de protegerlo al 100%, creo que hay una forma ordenada de compactarlo y ofuscarlo, y me gustaría saber más al respecto ...
Prix
Vale la pena preguntarse si sus recursos de arte / audio incluso deberían considerarse "sensibles". Muchos juegos exponen deliberadamente sus activos a los jugadores, con el fin de apoyar una comunidad mod saludable, que a su vez puede agregar más valor al juego (incluso sin costo para el desarrollador, incluso).
Ian Schreiber
Me interesan principalmente los datos confidenciales que controlan un juego basado en datos (archivos xml, por ejemplo). Acabo de ver juegos que agrupan todo en uno o dos archivos.
David McGraw el
44
¿Qué tiene de malo que los jugadores jueguen con esos datos?
jsimmons
golpear mi propio tambor .. CFL: iki.fi/sol/cfl
Jari Komppa

Respuestas:

8

Una buena estrategia es crear su propio formato de archivo desde cero y hacerlo indexado con una tabla que apunte a fragmentos de datos en lugar de almacenar archivos secuenciales completos en su archivo, luego cifre su tabla de índice y comprima cada fragmento por separado usando LZMA / Bzip2.

Otro enfoque es usar bits de generadores de datos de procedimiento aquí y allá (si desea llegar tan lejos, incluso podría obtener los 'parámetros' para dichos generadores de un servidor en línea como una medida adicional), y descargando parte del trabajo a la GPU también puede evitar volcados de memoria completa y compensar parte del rendimiento perdido.

Sin embargo, encuentro que tales técnicas generalmente obstaculizan el rendimiento y desperdician el tiempo de desarrollo, todo el tiempo no ofrecen nada al usuario final sino problemas potenciales y errores innecesarios.

Sin embargo, nada es 100% seguro.

Voodooattack
fuente
+1 por esto. La compresión satisface la necesidad de ofuscar y mejorará los tiempos de carga y la huella de la aplicación. El archivo / empaque de datos requerirá una capa de abstracción de todos modos, por lo que combinarlo con algo que pueda cargar / descomprimir en su lugar no debería ser demasiada ingeniería. Si opta por la compresión, me aseguraré de mantener la lógica de compresión / descompresión separada de las cosas de carga / archivo. De esa manera, puede cambiar un algoritmo mejor en una fecha posterior, la infraestructura necesaria no cambia entre algoritmos.
MrCranky
@MrCranky: Si observa la forma en que EA lo hace con su formato de archivo .package (DBPF) (utilizado en los juegos SPORE y The Sims), verá esto en acción. Su motor tiene un campo adicional en la tabla de índice para "tipo de compresión", un código interno para qué algoritmo usar. Utilizan diferentes algoritmos de compresión basados ​​en el tipo de fragmento (los fragmentos de texto utilizan una compresión especial, por ejemplo). El sistema de versiones que utilizan también permite la integración de modificaciones y compatibilidad con versiones anteriores. Más información sobre el formato DBPF aquí: simswiki.info/DatabasePackedFile
voodooattack
Cosas interesantes: solo lo he hecho en tiempo de compilación con un #define, pero el tiempo de ejecución abre algunas buenas posibilidades (como poder cambiar su tipo de compresión sin tener que reconstruir cada archivo para su juego).
MrCranky
11

No envíe datos confidenciales.

No hay forma de enviar datos cifrados para que solo el juego pueda acceder a ellos. Puede esforzarse mucho, pero rápidamente se mete en los problemas de DRM.

Si quieres mantener tus activos de juego lejos de miradas indiscretas.

  1. cerrarlo
  2. xor el archivo
  3. cambie la extensión a algo aburrido (es decir my_level.zip.xor, no , use my_level.map).

Eso detendrá al 95% de los usuarios maliciosos. El otro 5% lo obtendrá sin importar lo que haga.
No necesita realmente comprimir y xor. En su lugar, podría usar lzma y usar AES con una clave conocida. El punto es no gastar mucho tiempo en ello.

código_deft
fuente
Eso es lo que generalmente veo en la mayoría de los juegos ... galletas para ti.
Premio
2
Realmente solo zip + renombrar es probablemente suficiente.
coderanger
1
no lo creo, me gusta el That will stop 95% of mischeivieous users.hecho de romperlo, aunque creo que todavía hay personas que realmente lo conseguirán, agradecería si no todos y cada uno pudiera hacerlo. En estos días, la mayoría de los niños de 10 años saben cómo abrir archivos en el bloc de notas y cambiarle el nombre ...
Prix
1
Saber cómo, sí. Alguna vez te importará, no.
coderanger
zip + renombrar no es suficiente. Linux rara vez usa extensiones de archivo para determinar el tipo de archivo. En cambio, mira los primeros bytes y lo usa para determinar su tipo. Un zip renombrado todavía aparece como un zip en Linux. Windows XP no hace esto, todavía usa extensiones. No sé cómo lo hace Windows7, pero espero que en el futuro Windows use una técnica similar.
deft_code
4

Pasar una gran cantidad de tiempo en esto es probablemente una tontería. Existen herramientas para capturar datos de textura y modelo directamente desde la GPU, y los sonidos pueden apuntar fácilmente a un dispositivo de bucle virtual. Todo lo que necesita ser verdaderamente seguro necesita vivir en un servidor y trabajar solo a través de desafío / respuesta. Hacer la validación de datos del cliente es otra historia, algo más como Valve's -verify_all. Eso sigue siendo difícil, ya que no puede confiar en el ejecutable local para aplicarlo (o al menos no puede confiar en él más de lo que confía en su sistema anti-trampa de punto final, que también es una idea tonta).

coderanger
fuente
4

Mi trabajo es en software antisuperficies. Conozco a alguien que es un cracker de juegos de la vieja escuela. Rompe juegos como respirar. No puedes detener a personas como él. Si su juego es lo suficientemente popular, múltiples versiones crackeadas de su juego llegarán a los sitios de torrents solo unos días después del lanzamiento, sin importar lo que haga. Mi consejo es que hagas lo mínimo para mantener alejado al Joe promedio que cree que podría querer darle una puñalada a esta ingeniería inversa.

Jake McArthur
fuente
1
Ese es el objetivo. No tengo absolutamente ningún deseo de luchar contra los hackers.
David McGraw el
1

Buena pregunta, pero no es fácil responderla.
Según mi experiencia con la seguridad de los datos, debe pensar en lo siguiente:

1) ¿Qué está protegiendo, de quién y cuál es el impacto si esos datos son inseguros? La seguridad tiene mucho más que ver con la evaluación de riesgos que con las soluciones técnicas sistemáticas
2) Supongo que su plataforma es de escritorio (por ejemplo, Windows / OSX) en ese caso un espacio de problemas diferente que el hardware propietario como PS3 / Xenon que tienen sus propios intentos de seguridad a nivel de kernel (si esta es una solución válida está abierta a debate)
3) Cifrado! = seguridad. El cifrado solo garantiza que sus datos no puedan leerse , no garantiza que sus datos no puedan escribirse, reproducirse o representarse.

Si sus requisitos son hacer que sus datos sean a prueba de manipulaciones, entonces debe pensar en el hash de sus datos (preferiblemente con SHA-256 o SHA-512). Sin embargo, para volver a repetir, piense por qué es importante y qué gana al agregar seguridad a su sistema.
También vale la pena saber que agregar tecnología de encriptación a su producto puede tener implicaciones legales debido a restricciones de exportación (la tecnología de encriptación se clasifica como tecnología de grado de armas restringidas, lo crea o no), por lo que es aconsejable usar bibliotecas que hayan superado estos problemas legales.
Finalmente, nunca use su propia tecnología de encriptación, use algoritmos bien conocidos, documentados e investigados como AES, Blowfish, RSA, etc.

ps La clave pública / privada no es adecuada o práctica para cifrar grandes cantidades de datos, por lo tanto, DRM / PGP, etc., utiliza un sistema simétrico RSA + híbrido , es decir, asegura la clave simétrica con RSA y luego realiza el cifrado simétrico estándar con esa clave

Es un tema complejo muy grande y definitivamente no le he hecho justicia.

Espero que ayude

zebrabox
fuente
1

Si desea un ejemplo de un formato que fue diseñado y construido (probablemente diseñado en exceso) por ser pequeño (compresible), ridículamente seguro y flexible, debe buscar el formato MPQ de Blizzard.

http://wiki.devklog.net/index.php?title=The_MoPaQ_Archive_Format

El diseño general del archivo es el siguiente:

Archivo de encabezado Archivo de datos Datos de archivo - Archivos especiales Tabla hash Tabla de bloques Tabla de bloques extendida Firma digital fuerte

Este formato tiene TODO. Bloqueable, bloqueable extendido, datos divididos en sectores (para una transmisión sencilla), soporte para 7 (!) Algoritmos de compresión (si cuenta la compresión de sonido) que se pueden combinar arbitrariamente, firma digital débil, firma digital fuerte, etc.

Si comprara la API de Blizzard que se ocupa de la arquitectura de archivos, obtendría todo lo que necesitaría y mucho más.


fuente
Gracias por el enlace, nunca pensé en investigar más los detalles de MPQ (y en general asumí que no estarían disponibles)
Bill
Si es tan seguro, ¿por qué se ha realizado ingeniería inversa a tal grado e incluso tiene bibliotecas de terceros para interactuar con él? ;-)
coderanger 01 de
La mayoría (leer: todas) las herramientas para interactuar con archivos * .mpq dependen de Stormlib, que está escrito y mantenido por un tipo.
Hasta donde yo sé, Stormlib requiere que tengas el juego original del que proviene el archivo, ya que las claves para el descifrado se almacenan en el ejecutable. Sin embargo, la razón más importante por la que es tan seguro no es porque sea imposible entrar. Pero para los datos sobre la marcha enviados a través de la red, es insuperable. Los datos están tan fuertemente encriptados que sería inútil que un tercero los desencripte sobre la marcha.
Y, de hecho, con 'World of Warcraft', Blizzard ha sido pionero en tecnología de transmisión, lo que le permite jugar con solo un pequeño porcentaje de todos los datos descargados en su disco duro. El formato * .mpq sobresale en este tipo de trabajo. Sin mencionar que cuando Blizzard lanzó el instalador de Starcraft 2 unos días antes del lanzamiento oficial del juego, sus archivos estaban tan fuertemente encriptados que no se pudieron abrir hasta mucho después del lanzamiento del juego. : P
0

Como esto ha sido resucitado recientemente, su pregunta (y, por lo tanto, todas las respuestas hasta ahora) solo parece tratar con la carga del archivo, que es tan seguro como el ejecutable que quiere cargarlo. En la PC no hay nada que sea realmente seguro (solo retrasas a las personas), puedes verificar las cosas en los servidores, pero incluso esa verificación se puede eliminar para que los exe modificados se puedan ejecutar sin importar qué. Las consolas todavía son "bonitas", por lo que en la mayoría de los casos allí genero un hash de archivos importantes, luego firmo el hash con una clave privada, incrusto la clave pública en el código y verifico el hash seguro en el archivo.

Pensé en lanzar otro ataque a la conversación, algo que solo encontré el año pasado ya que no tiendo a enviar mucho en la PC. Cheat Engine es un pequeño programa muy ordenado que casi automatiza la creación de tus propios hacks (lo que significa que cualquiera puede usarlo). Está bastante avanzado en lo que puede hacer, muchos de los trucos / trampas que he visto que la gente vende están hechos por esto o algo muy parecido a lo que he visto (todos los del mercado masivo). Con algo de trabajo que pueda proteger contra cosas como esta nuevamente, supongo que todo depende de cuán popular sea el juego y si alguien se preocupa lo suficiente como para molestarse.

Opps, olvidé mencionar que una buena lib para el cifrado (en C ++) es LibTomCrypt .

Roger Perkins
fuente