Para ocultar los secretos del juego a las personas que pasan por el código, ¿podría un juego usar código auto modificable?

Ok, entonces, como alguien más mencionó, el código auto modificable * dentro del ejecutable * generalmente no es posible ahora. Esta es realmente una medida de seguridad para evitar que el código se modifique cuando no debería.

Sin embargo, muchos juegos realmente ejecutan la lógica real del juego a un nivel completamente diferente, no en el código fuente compilado sino en los scripts interpretados. Y esto abre más posibilidades para modificar el código, porque lo más probable es que se carguen en la memoria de datos antes de ser procesados, lo que se modificará. (Nota: cuando digo “memoria de datos” no estoy sugiriendo que haya algún tipo diferente de memoria, sino que hay varias secciones de memoria, que se asignan a usos específicos, y el sistema de mapeo de memoria evita que se usen para cosas equivocadas.)

Además, creo que vale la pena señalar que en muchos juegos, puedes descubrir lo que contiene el juego simplemente mirando los nombres de los archivos, por lo que ocultar algo de las personas no se trata solo de esconder cosas en el código sino también de esconderlas Los datos en sí. Los datos para un juego se pueden almacenar de una gran variedad de formas: muchos de ellos se agrupan en archivos grandes para mayor eficiencia, y estos a menudo se agrupan en función de su proximidad, por ejemplo, colocan todos los diferentes objetos de datos necesarios para un nivel particular en el mismo archivo.

Un último punto, volver al tema del código en lugar de los datos, es decir que hay herramientas que pueden recompilar un ejecutable en el código C ++; obviamente, no es capaz de interpretar cuál es el “significado” del código, pero puede hacer cosas como mostrarle la lógica y, en teoría, podría permitir que alguien realice ingeniería inversa casi todo en su código. Entonces, como dice una de las otras respuestas, en realidad debes comenzar a pensar en la seguridad a través de la oscuridad. Esto no es fácil de hacer, pero probablemente sea la única forma en que no se pasará por alto rápidamente.

Las CPU modernas no te dejan. En iOS, está prohibido ejecutar código modificado. No puede utilizar un lenguaje compilado JIT como resultado.

Si restringe su plataforma a una que le permita modificar el código y seguir ejecutándolo, entonces puede hacerlo. Pero sería muy difícil, y no hay herramientas listas que pueda usar para que funcione.

La forma más fácil que se te ocurra sería dejar ciertas ramas incondicionales, pero luego cambiarlas a condicionales después de alcanzar ciertos desencadenantes en el juego. Cambiar los valores incrustados (instrucciones de modo inmediato) sería otro enfoque fácil.

Sin embargo, requiere que escribas esa parte del juego en lenguaje ensamblador.

E incluso ese enfoque sería pirateable. Cualquier cosa que se ejecute completamente en el cliente puede ser hackeado. Todo lo que puedes hacer es elevar el listón.

Y una forma mucho más simple de elevar el listón sería cifrar sus datos: cada nivel que complete el jugador podría crear la clave que descifraría el siguiente nivel. Luego, si el nivel se hackeó lo suficiente, incluso podría no crear la clave correcta. 🙂

NO.

¿Por qué? El juego que mencionaste, super Mario Bros, es un juego fuera de línea. Una vez que compra el juego fuera de línea, a la compañía realmente no le importa si termina el juego más rápido o si desbloquea todas las áreas. Porque ya les diste dinero.

Ahora hay casos en los que el desarrollador necesita bloquear el acceso a ciertas áreas, SÍ. Todos los juegos en línea. Hay un cierto código que tiene que hablar con el servidor del juego para desbloquear una nueva área del juego. Si intenta modificar algunos de los elementos importantes del código, generalmente pueden detectar que ha modificado el código y lo desconectarán.

Asi es como se hace.

En general, nadie más que el desarrollador no puede ver el código de un juego. La mayoría de los juegos y programas se compilan en código de máquina muy difícil de leer y comprender. Estas son instrucciones que la computadora sigue para ejecutar un juego. Algunos idiomas pueden compilarse en código de bytes, que es igualmente ilegible pero interpretado por un software separado en lugar del procesador de la máquina.

Si un desarrollador decide liberar su código en cualquier medida, pero no quiere que nadie lo copie, podría ofuscarlo. El código ofuscado es generalmente ilegible, pero podría entenderse con tiempo y conocimiento. En el código ofuscado, los nombres de variables y funciones a menudo se asignan a palabras clave sin significado real. Por ejemplo, una función setWidth () puede convertirse en func_4873 () cuando se ofusca. El código ofuscado aún se puede compilar en el programa del que proviene.

En su pregunta, hizo referencia a Super Mario Bros. A diferencia de muchos juegos modernos, los juegos de Mario más antiguos se escribieron principalmente en ensamblaje, que pueden compilarse directamente en código de máquina y viceversa. En otras palabras, es casi imposible ocultar el código, pero la ofuscación aún es posible. En este caso, crear código roto no sería una ayuda, porque el juego no se ejecutaría correctamente. Su mejor opción como desarrollador que escribe en alguna forma de ensamblaje sería hacer que su código sea ilegible al ofuscarlo.

Para responder a su pregunta, este “código que necesita ser corrompido” tiene que ser “corrompido” por más código, que en algún momento no debe ser corrugado para que funcione. Y ese código puede analizarse sobre cómo corromper el código objetivo.

Puede evitar que las personas lean el código. Se llama cifrado. Hace que el código o los datos no tengan sentido hasta que lo descifre. El cifrado ya se usa ampliamente en los juegos.

En lugar de los habituales JPEG y MP3, los juegos utilizan formatos de archivo especializados que están diseñados para leerse de manera eficiente en hardware específico. Y además de eso, los datos del juego se pueden cifrar para que solo el juego pueda leerlos.

Sin embargo, el código del juego para descifrar puede analizarse y usted puede descubrir cómo se descifran los archivos.

Por lo tanto, debe cifrar el juego en sí y confiar en un sistema operativo “seguro” para descifrar el código del juego.

Nuevamente, esto ya se está haciendo en los juegos de consola. Y todavía no impide que las personas encuentren formas de piratear la consola.

Entonces, si bien puede dificultarles encontrar sus secretos, no puede hacerlo imposible.

No voy a decir que es imposible, pero si se pudiera hacer, me imagino que sería muy difícil.

Las computadoras son tontas. El código es tonto. Al programar, físicamente tiene que decirle al código exactamente qué hacer. ¿Cómo sabría un fragmento de código que otro fragmento de código está dañado? Bueno, tendría que comprobarlo. Para hacer esto, tendría que escribir el código para verificar, que es básicamente una flecha gigante que apunta directamente al código que necesita ser corrompido.

La mejor forma en que puedo pensar en hacer esto sería tener una configuración de cliente-servidor. En ese escenario, puede hacer que el cliente envíe información específica al servidor y que el servidor responda al cliente con el área oculta si se cumplen ciertos criterios. De esta manera, la persona que juega el juego solo tendrá acceso al código del cliente, y nunca al código del servidor. Esto probablemente no funcionaría muy bien para un juego como Mario.

Hay otras formas de evitar que las personas lean / entiendan su código. La ofuscación es la más común, sin embargo, con suficiente tiempo y esfuerzo, un desarrollador dedicado probablemente podría resolverlo. Una que no me gusta sugerir, pero que podría funcionar para esto, es la seguridad a través de la oscuridad. Si ocultas la lógica lo suficientemente bien, o agregas suficientes capas de oscuridad, probablemente puedas disuadir a la mayoría de las personas que están husmeando.

En el siguiente juego, tendrás que alterar el código para progresar:
un juego de aventura javascript de usuario

Otro: tienes que hackear este juego multijugador masivo para vencerlo

En los años 80, era más común reutilizar código como datos y datos como código. ¡Algunos juegos incluso jugarían código como música! Ahora los desarrolladores se quejan porque el servidor solo tiene 64 GB de RAM y 100 GB de SSD :-p

No relacionado, pero agradable de ver: verdadero ciclo de color de 8 bits con HTML5 (se usó en ’90 toot)

No Si alguien aplica ingeniería inversa a un juego, entonces tiene acceso a todo el código del juego, por lo que podrá ver las rutinas de auto-modificación y determinar cómo debe verse el código después de que se modifique.

La solución sería si las rutinas de modificación se almacenaran en un servidor remoto, de modo que el juego pudiera ejecutarlas cuando fuera necesario (si estuviera en línea). Pero, en primer lugar, sería mucho más fácil almacenar el código “secreto” en el servidor remoto.

¿Sabes lo popular que es EA como editor de juegos? Si no, deberías leer un poco sobre ellos. De alguna manera, siguen su estrategia de publicar con seguridad corrupta para que solo los piratas puedan jugar sus juegos correctamente.

¡Oh espera! ¿Te refieres a sacar juegos con fuente corrupta? ¿Y quieres que la gente te pague por juegos con código fuente dañado? ¿Juegos que son 100% más propensos a fallar?

¿Comprarías ese tipo de juegos?