Editar guardados binarios protegidos de juegos

Iniciado por FJDA, 2 Junio 2019, 15:31 PM

0 Miembros y 1 Visitante están viendo este tema.

FJDA

hola, no se muy bien donde exponer la pregunta. En principio sería en juegos pero viendo el tipo de temas que se abren ahí no creo sea el sitio.

Lo que me gustaría saber es como editar archivos binarios protegidos, ya que al cambiar un valor de dinero pongamos en el juego el valor es 15236, esto en el archivo se vería en hexadecimal y su valor sería 3B 84, pero invertido 3B 84 --> 84 3B:

En el juego:
15236

En el guardado del juego se vería :
7650:  00 00 00 00 00 00 00 84 3B 00 00


Sin embargo en muchos juegos  esto no está permitido puesto que al hacerlo el juego interpreta que el archivo está corrupto y esto es porque estos juegos al final del archivo de guardado se guarda otro valor. Es este valor el que no se obtener, ya que es una especie de sistema para detectar cambios en el archivo. A ver si tengo suerte y alguien sabe algo sobre el tema. Creo que pudiera ser la suma total de bytes del archivo o algo así.


gracias de antemano


@XSStringManolo

Usa el cheat engine. Lo que puedes hacer es modificar un valor que se sume a la variable. Estos son menos propensos a ser protegidos.

Por ejemplo en un juego creas un personaje y te deja elegir si darle + 5 puntos a fuerza o + 5 a magia.
En vez de cambiar el valor dentro de fuerza, cambias el +5 y le pones un + 200.
Creas el personaje y se te queda para siempre ese +200 que se sumó al valor.
Tienes tambien el HxD hex editor.

Muchas variables son calculadas tras operaciones, asique cambiar la variable directamente no sirve, ya que se obtiene el valor de la variable en tiempo de ejecución. Al cambiar la variable esta se actualiza al momento al resultado de la operación.


Serapis

No existe una respuesta genérica.
Cada caso tiene su solución, lo que supone que el que pretende hacer cambios debe entender algo más que solo cambiar valores binarios.

Veamos, si yo creo un juego y no lo he protegido de ninguna manera, el cambio que propones podría ser válido. Pero a la mínima que uno pretenda protegerlo un poco, será bastante más complicado que cambiar uno o dos valores.

De entrada uno puede generar un hash para el ejecutable, de modo que al iniciarse se recalcule y si fue modificado lo detecte lo que luego haga estará sujeto a la imaginación del creador cuando detecte el cambio...

También podría codificar los valores de diferente manera (que meramente guardarlos en binario, que con editor hex lo verías en hexadecimal), luego sería preciso investigar como fue codificado.

Una simple manera de codificarlo, es unir varios valores en uno mismo. Así la alteración del valor modifica por completo varios factores (no sólo el que uno pretendía modificar), lo que podría generar errores en el propio juego. 
Más aún al final los bytes resultantes podría cifrarlos (un simple xor podría bastar), con lo que aquello que se lee, ni siquiera guarda relación con el valor real del/los datos.

Imagina que tengo por un lado número de vidas, puntos, filas y columnas, podría simplemente codificarlo como (((filas *10) + vidas) * 1000) + ((puntos * 10)+ columnas), así estoy usando 3-4 bytes para guardar 4 valores muy distintos entre sí, y sin separación clara de valor por byte... una modificación podría generar error en el juego, porque al cargarlo, el juego podría esperar que fila y columna fuera un valor (por ejemplo) entre 5 y 20, y vidas un valor entre 0 y 9 y puntos (por ejemplo) un valor entre 0 y 99, la alteración de 1 de cualquiera de los bytes es fácil que esté modificando 2 o más valores a la vez.

En definitiva si no se sabe el modo exacto en que está guardado, hacer cambios al tuntún, es perder el tiempo. Y pretender que todos los datos simplemente estén tal cual en un fichero es un poco inocente, especialmente si el autor tenía intención de protegerlo de alguna manera...

Y para saber de modo exacto en que un juego guarda los datos hay que empaparse en el código, lo que supone ciertos conocimientos de ensamblador para empezar y saber usar la cabeza para entender que está haciendo en cada momento... en fin, como te decía no es algo genérico, cada cual adoptará medidas según estime oportuno y su imaginación le conduzca en el momento de hacerlo.

FJDA

#3
he comprobado que el valor hexadeciamal coincide siempre exactamente con el valor de dinero, lo único que cambia aparte de esto es una línea al final del archivo.

He usado partidas de NFS UNDERGROUND para probar, y he usado un programa para este fin NFS7:Underground Savegame Editor



He comparado el archivo modificado por el programa y el original. Cambio el dinero y al cambiar el dinero la diferencia es la línea en la que se guarda el valor del dinero:

7650:  00 00 00 00 00 00 00 XX XX 00 00

y el final del archivo, el resto es idéntico, no hay diferencias. Entonces la modificación del dinero es correcta, en principio el cambio no debería dar error, la clave está en el final del archivo.  He comprobado con otros juegos incluso de PS y PS2 y ocurre igual.

Con estos juegos antiguos debería ser fácil, pero no  :-\

Serapis

No nos cuentas que sucede cuando cambiar el valor e intentas ejecutar el juego ahora con dicho cambio.

Dices que también cambia la línea al final del archivo, pero no me ha quedado claro, quién y cuando cambia esa línea. Según me parece entender lo haría el editor cuando introduces cambios en el juego?. el editor no debería hacer más cambios que los que tu introduzcas, salvo que sea un editor especializado en un tipo de programas y que 'sabe' que debe efectuar cambios para compatiibilizarlos con los cambios que uno efectúa... esto es que el editor 'reconoce' que debe actualizar de modo congruente otras partes del programa.
Ese parece el caso, pués según dices usas el editor: NFS7:Underground Savegame Editor para el NFS UNDERGROUND.
Sin conocer para nada ambos programas, estimo, que esa línea final debe ser una especie de hash que el juego tiene que validar (es decir calculará un hash para todo el fichero (excepto donde se deposita esa parte por lo general) y si no coincide con el almacenado al final en dicha línea considerará que fue manipulado (evidentemente se desquita diciendo que está corrupto, pués le da igual si el cambio fue gigantesco o de solo 1 mísero byte, es una buena excusa), y por tanto si lo que hace es rechazar siquiera el intento de cargarlo.

Si no es así, prueba ha hacer el cambio con otro editor hexadecimal genérico, es decir que sólo cambie el valor que te interesa (para probar de entrada solo ese dle dineor que ya sabes la posición donde se guarda). Guarda el cambio y ejecútalo a ver qué sucede...

De entrada no hagas un cambio de dinero del tipo: si el original = 120, ahora tu cambio: 25000, si no más bien si antes era 120, ahora pon 121 a ver si resulta, si resulta y luego al poner un valor muy elevado, no, queda claro que estaría haciendo un filtrado de datos comprobando que los valores no estén por  encima de ciertos límites (es decir el juego s eprogramó pensando en que habría quien quisiera hacer trampa haciendo cambios en los datos del código).

Si con todo falla, considera que el programa utilizado (al caso ese NFS7:Underground Savegame Editor) o no lo hace bien o es para alguna versión distinta del programa que estás utilizando...

Personalmente no soy de perder el tiempo en desemsamblar el código de un juego solo para hacer algunos cambios y favorecer la partida, pero entiendo que los muy 'jugones' que dedican y pasan horas con un juego en concreto, tengan interés en ello, pués puede suponerles ciertas dosis de alivio para superar niveles complicados o simplemente hacerlo más entretenido. Pero en ese caso, tienes que o bien confiar en programas ya hecho por otros que 'funcionen' bien, o aprender por tí mismo que no creo que sea el caso, así que:

Por la imagen que aportas se ve que el programa adjunta una web hacia el desarrollador, pero data del 2004, así que es más que probable que dicha web ni exista ya, pero incluso es probable que en un fichero de texto o ayuda incluya un correo (es más probable que un correo se mantenga después de tantos años).
En fin, busca entre los ficheros donde tienes comprimido/descomprimido/instalado ese editor, figura algún correo hacia el tal 'mift0', si es así escríbele (en inglés preferiblemente, el dominio .ru es de Rusia, así que el tipo de español seguramente nothing), dile que tus cambios no surten efecto y el programa lo interpreta como corrupto, dile la versión del juego que usas y la versión de su editor (según se ve, la 1.1), posiblemente (si el correo sigue vigente y lo recibe , lo lee y lo entiende) te oriente y te aclare el punto donde falla o como mínimo te indique otro editor/versión que funcione bien, o quien sabe quizás le animes a revisarlo y tratar de hacer una nueva versión de su editor que corrija fallos o amplíe su uso a versiones más nuevas del juego.

FJDA

#5
Cita de: NEBIRE en  3 Junio 2019, 19:35 PM
in conocer para nada ambos programas, estimo, que esa línea final debe ser una especie de hash que el juego tiene que validar (es decir calculará un hash para todo el fichero (excepto donde se deposita esa parte por lo general) y si no coincide con el almacenado al final en dicha línea considerará que fue manipulado
Exácto esto es

Si yo mediante un simple editor hexadecimal cambio solo los valores hexadecimales de dinero entonces el juego detecta el cambio y simplemente ignora el archivo de guardado en este caso con NFS UNDERGROUND, y crea una nueva partida desde 0.  Como dices el otro editor especializado para modificar el savegame de NFSU aparte del dinero (que es lo que solamente he pedido que modifique el programa) modifica la última línea y como dices debe ser una especie de hash que el juego tiene para validar. Entonces el cambio si surte efecto.

En otros casos, es decir otros juegos, te puede decir que el archivo de guardado está corrupto, por no es el caso en NFS U.

Pues no veo la forma de calcular el hash del archivo antes de la última línea si no es usando mi propio programa.

Serapis

Cita de: FJDA en  4 Junio 2019, 02:11 AM
...
Pues no veo la forma de calcular el hash del archivo antes de la última línea si no es usando mi propio programa.
Para eso hay que mirar el código fuente...
Puede que se utilice un hasheado estándard, en cuyo caso es bastasnte asequible (es decir podría ser tan fácil como reconocer que usa tal o cual hash). ...aunque poniéndolo difícil, el programador pudo generar el hash a 'cachos', es decir no todo seguido del tirón... si no tomando arrays de igual o distinto tamaño con que nutrir el hash, o incluso ir generando hashes para cada array y luego finalmente hashear la concatenación de todos esos hashes.

Poniéndolo algo más difícil puede que previo y/o posterior al hasehado de una función conocida, esté también codificado.

O bien aportar su propio algoritmo de hasheado, pero vamos descarto que se haya tomado esta molestia.

Si tienes algo de idea de programación, investiga que librerías utiliza y si alguna de ellas es una librería de criptografía, o bien directamente busca las funciones invocadas. De ser así, puedes ceñirte en buscar en el código donde se utiliza/n dichas funciones (si aparece varias veces,  es claro que la que interesa acontece al poco de pretender cargar una partida guardada y también al poco de guardar una partida, en ambos casos hará uso de la función hash, en una para al término de guardar la partida añadir el hash como firma de verificación y al cargarla, para comprobar que no está dañada/manipulada. De ahí irías a un punto bastante más específico, del que se podría ver qué parámetros utiliza para invocar la función, y podría haber suerte y estar invocando una función criptgráfica cuyo parámetro aclare que algortimo de hash usa en concreto.

Si resulta negativo, esto es, que utiliza un función hash propia exprofeso, implica más trabajo porque entonces tienes que revisar el código para reproducir una implementación del algoritmo de hash que incorpore.

.:UND3R:.

Cita de: FJDA en  4 Junio 2019, 02:11 AM
Exácto esto es

Si yo mediante un simple editor hexadecimal cambio solo los valores hexadecimales de dinero entonces el juego detecta el cambio y simplemente ignora el archivo de guardado en este caso con NFS UNDERGROUND, y crea una nueva partida desde 0.  Como dices el otro editor especializado para modificar el savegame de NFSU aparte del dinero (que es lo que solamente he pedido que modifique el programa) modifica la última línea y como dices debe ser una especie de hash que el juego tiene para validar. Entonces el cambio si surte efecto.

En otros casos, es decir otros juegos, te puede decir que el archivo de guardado está corrupto, por no es el caso en NFS U.

Pues no veo la forma de calcular el hash del archivo antes de la última línea si no es usando mi propio programa.


Lo más probable es que se trate de un checksum, un valor adicionado al final para evitar errores en la escritura de la partida guardada, te doy un ejemplo:

tienes:
01 02 03 04 XX

el valor de XX asumiendo que el checksum es la suma de todos los valores es: 10 = 0A
01 02 03 04 0A

Suponiendo que el dinero es $1.234, si lo cambias por $2.234:
02 02 03 04 0A, te provocará un error dado que el checksum debería ser: 0B

02 02 03 04 0B

Por lo que deberías conocer la rutina encargada de generar el checksum de los datos guardados, lógicamente este checksum fue descubierto por medio de ingeniería inversa con la tools que estás usando, saludos

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)