Existen infinidad de formas para encriptar datos. Algunas rápidas, otras tremendamente costosas.

En el caso de los videojuegos, los desarrolladores suelen optar por encriptaciones rápidas y a la vez sencillas.

Aplicar un NOT a los bits, rotar los bits o aplicar una máscara XOR son opciones muy usadas y sencillas de implementar en los videojuegos. Nota: Aplicar un NOT a un byte, equivale a aplicarle un XOR 0xFF

Algunos juegos que necesitan más seguridad (como algunos mmorpgs), optan por usar encriptaciones avanzadas, como pueda ser Rijndael. Pero en todos los casos, si tenemos acceso al código que se está ejecutando, se puede hackear con mayor o menor dificultad.

Otros juegos optan por mezclar rotación de bits con xor. O aplicar máscaras de xor con longitud variable. La forma más efectiva para las encriptaciones XOR, es usar máscaras con longitudes de números primos, optimizando así la repetición de la máscara final. Si 7 y 11 son números primos. Aplicar dos máscaras XOR de longitud 7 y 11, tenemos una máscara final de una longitud de 77 bytes. Si se aplica una máscara XOR en conjunción con rotación de bits, suele ser bastante complicado de descifrar sin acceder al código ensamblador.

Identificar encriptaciones sencillas

Identificar encriptaciones sencillas

Encriptación NOT

En el caso de una encriptación por NOT o rotación de bits simple, se suele ver con facilidad la encriptación si el fichero que estamos investigando contiene principalmente texto. En estos casos, no se ve texto con un editor hexadecimal, pero si que se ve que todo el fichero o prácticamente todo el fichero, contienen no más de 30 bytes diferentes.

Con una encriptación de NOT simple, los desarrolladores se aseguran que con una búsqueda relativa tradicional, no se encontrará nada: 0001 - 1 | 1110 - 14 0010 - 2 | 1101 - 13 0011 - 3 | 1100 - 12

Las búsquedas relativas, se basan en el orden de las letras. Al aplicar un NOT, el orden de las letras se ve invertido. Así que si el buscador relativo no soporta ésto, de poco servirá.

En el caso de imágenes, un NOT no sería demasiado efectivo, pues la imagen se vería prácticamente igual, y se vería enseguida que está invertida.

Encriptación mediante rotación de bits

Encriptación mediante suma o resta

Esta encriptación no supone ningún problema para un buscador relativo.

Encriptación XOR

Encriptación XOR de un byte

Aplicar un XOR con la misma máscara a cada byte es una opción tradicional muy usada. Es una encriptación muy rápida. Y se encripta de la misma forma que se desencripta. Además suele tener un impacto muy pequeño a la hora de comprimir. Los ficheros encriptados con una máscara de un byte, se suelen comprimir prácticamente igual que los ficheros originales en muchos casos.

En el caso de texto, no es tan obvio con un editor hexadecimal como un NOT simple, pero igualmente se repetirán principalmente unos 30 caracteres como mucho (en juego en inglés). Analizando con un editor hexadecimal la frecuencia de cada byte, se verá fácilmente que habrán algunos que se usen mucho, y otros que no se usen nada, o muy poco. Si el fichero tiene punteros, y con suerte bytes sin encriptar 00, la máscara del XOR sería exáctamente el valor que toma en el lugar donde debería haber un 00.

En el caso de imágenes, es fácil encontrar zonas con muchos 00s en imágenes sin comprimir. Tanto en imágenes con paletas de color (el 00 se suele usar como transparente o negro), o en imagenes de 24 o 32 bits. El 00 puede ser negro o transparente en la mayoría de los casos. Así que si se ve un caracter repetido muchas veces en una imagen con pixeles transparentes, muy posiblemente esa sea la máscara, porque ahí iría un byte 00.

Encriptación XOR de palabra

Ésta encriptación entraría dentro de las XOR multibyte, pero también se puede considerar en cierta medida como un XOR de un solo byte, ya que no hay un vector para la máscara, sino un único valor. En arquitecturas de 32 bits, se suelen usar 4 bytes.

Ejemplos de juegos que usan encriptación por XOR de palabra: - Ragnarok Battle Offline: 0x0E3DF59AC (sólo se usa en la tabla de archivos)

La encriptación XOR de palabra, permite encriptar/desencriptar (en el caso de 32 bits) 4 bytes de golpe, así que es mas rápido. Eso así, solo funciona con datos de longitud múltiplo de 4. Para datos con otras longitudes, habría que hacer una excepción al final para el byte, los dos bytes o los 3 bytes restantes. La encriptación XOR de un byte se puede optimizar para encriptar varios bytes a la vez usando un XOR de palabra. Si la máscara de un byte es 0x73, en una encriptación de palabra de 32 bits equivalente la máscara sería 0x73737373.

Encriptación XOR multibyte

A partir de aquí, comprimir ficheros encriptados con algo más que una rotación simple o un XOR aplicado a cada byte, hacen que los datos ya no se compriman tan bien como los originales, cuanto mejor es la encriptación, generalmente peor se comprime. Así que la mejor opción es encriptar datos ya comprimidos.

Encriptación mixta (XOR + rotación o suma/resta)

Identificar encriptaciones avanzadas

Las encriptaciones avanzadas son bastante raras de encontrar en videojuegos antiguos. Y generalmente comprimir, ya supone un paso para evitar la modificación de los datos originales, así que rara vez se molestan en algo más que comprimir. En cualquier caso, si no se localiza ningún patrón de los anteriores, o está comprimido, o es una encriptación mixta xor + rotación bien hecha o es una encriptación avanzada. En el caso de una encriptación mediante Rijndael, con la computación actual que se puede usar, aunque tengas una muestra sin encriptar y otra encriptada, es prácticamente imposible sacar la clave original usada para la desencriptación. Así que la única forma es localizar la clave, no en el archivo encriptado, sino en el programa del juego. Desensamblando.