Ayuda para encontrar el cifrado de un conjunto de archivos.

Lugar donde se intentarán resolver problemas específicos
silenthill
Mensajes: 69
Registrado: 05 Oct 2016, 12:28

Mensaje por silenthill » 18 Oct 2016, 14:54

El registro a2 toma como valor 0x0000CC para este archivo:
https://mega.nz/#!ct4VlRrA!9IlZzcc_1tU8 ... 1TVRagASsY
Que es con el que he hecho las capturas.

Captura del momento justo en el que se entra en la rutina con el valor de los registros.
https://mega.nz/#!5tQCxBKD!ASOSfXg65Fym ... xKcuL45Ow4
Como ves a2 entra con el valor 0x0000CC en la rutina (el valor viene cargado de antes concretamente de aquí...)
https://mega.nz/#!ZxhwjBrA!dCW0eghl0pwx ... DeW79Zrfes
En esa captura A2 vale 00 y los registro a0 y a1 ya tiene el valor con los que van a entrar en la rutina...
Sin embargo cuando se llega al move a2,v0...
https://mega.nz/#!x5wRXShb!wdOXfvMdizUd ... i617n3Wm7Q
El siguiente paso sería ya en la rutina con a2 valiendo CC.
https://mega.nz/#!IwxByLKI!_UUM72cGKkIu ... LKKh3At-EU

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5661
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 18 Oct 2016, 15:24

Repito lo de antes, tú puedes verlo, pero los demás no. Parece que ese valor coincide con el segundo byte encriptado, pero con un fichero posteado y 4 líneas del post de esta mañana no se ve nada que llegue a una conclusión.

PD: No pongas así las imágenes, que se tarda un montón en verlas.

silenthill
Mensajes: 69
Registrado: 05 Oct 2016, 12:28

Mensaje por silenthill » 18 Oct 2016, 16:00

Lo he estado comprobado con unos cuantos archivos y coincide.
El valor de 0x000041 hace el xor con 0x000040. En el caso del primer ejemplo que postee el xor para 0x000041 sería xor entre "ac" y "ad" (valores 0x000040 y 0x000041) "ac" xor "ad" = 01 . En el caso del segundo archivo que he posteado es entre cd xor cc =01.
Para el primer mission01 que postee a2 entraría con el valor AD y se obtendría esto:

- 0x40 -> AC xor "AD" = 01
- 0x41 -> AD xor AC = 01
- 0x42 -> 2D xor AD = 80
- 0x43 -> 2D xor 2D = 00
- 0x44 -> 4D xor 2D = 60

Para el segundo mission01 posteado sería a2 entra con el valor CC.

- 0x40 -> CD xor "CC" = 01
- 0x41 -> CC xor CD = 01
- 0x42 -> 4C xor CC = 80
- 0x43 -> 4C xor 4C = 00
- 0x44 -> 4D xor 2C = 60

Para el archivo mission02 de los que tengo descifrados

Original:
- 0x40 = 64
- 0x41 = 65
- 0x42 = e5
- 0x43 = e5
- 0x44 = 85

Descifrado: a2 entraría con el valor 65

- 0x40 -> 64 xor "65" = 01
- 0x41 -> 65 xor 64 = 01
- 0x42 -> e5 xor 65 = 80
- 0x43 -> e5 xor e5 = 00
- 0x44 -> 85 xor e5 = 60

Para los dos archivos que he tenido oportunidad de capturar con el debug se sigue ese mismo esquema. Para los que he podido comprobar que tengo cifrados y su correspondiente descifrado también he visto lo mismo.

Enlace para los archivos mission02 descifrados y sin descifrar.
https://mega.nz/#!ptJl1bra!VpM5Czpgzg0Q ... rT_60qT5yw

Gracias por el ejemplo aunque seguramente no usaré C, al pobre le tengo muy olvidado. :wink:

P.D. He logrado reinsertar el mission01 que estaba cifrado ya descifrado y traducido y el juego no se cuelga con el archivo descifrado. Sólo he tenido que variar el valor de 0x00002e de 0c a 08 y resinertar a mano un texto descifrado de un dump del propio juego justo al terminar de ejecutar el bucle.:D :D :D

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5661
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 18 Oct 2016, 21:00

Entonces el valor para encriptar el primer byte es el que hay en el segundo, después ya es usando el siguiente byte, ¿no?

Es probable que el byte en 0x2E indica si está codificado o no. Pero en esos casos siempre hay que probar que funcione en emuladores y en la consola real, que más de una vez ha habido un disgusto por ello.

A mí es que me sacan del C y me pierdo. Es que soy un clásico y un romántico :ic_girl_in_love:

Básicamente en C es un simple bucle:

Código: Seleccionar todo

total = *(unsigned int *)(tabla + 0x34);
idx = 0x40;
xor = tabla[idx+1];
for &#40;i = 0; i < total; i++&#41; &#123;
  codificado = tabla&#91;idx+i&#93;;
  tabla&#91;idx+i&#93; ^= xor;
  xor = codificado;
&#125;

silenthill
Mensajes: 69
Registrado: 05 Oct 2016, 12:28

Mensaje por silenthill » 18 Oct 2016, 22:23

Correcto, y el que se usa para el segundo es el primero. Para el tercero es el segundo, para el cuarto es el tercero...

A mí es que me metes en C y me pierdo... :shock:

El algoritmo es básicamente lo que he escrito con el purebasic (era lo que tenía más a mano) ahora queda el tema de cargar el archivo, buscar el contador, minipularlo, archivo de salida... Tengo que refrescar todo eso, hace lustros que no programo nada más que scripts.

Sí, eso es lo mismo que pienso que hace el 0x0000002e revisando el código no da pistas sobre ello. En fin, mientras funcione. :D Me falta probarlo en la propia consola, en cuanto tengo un poco de tiempo se lo paso.

Un saludo y muchas gracias.

P.D. Te añado a los créditos en agradecimientos y probado en la consola y funciona.

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5661
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 19 Oct 2016, 11:40

salteadorneo escribió:P.D. Te añado a los créditos en agradecimientos y probado en la consola y funciona.
Yo soy más castizo que eso. A mí con unos regalitos, tipo 3%, mordida o comisión, me vale :)

Ahora mismo estoy con la mano lesionada, con un vendaje que parece más de lo que es, así que esta semana estoy tocándome los webs (con la mano sana, clara, jeje). Si veo que no me duele mucho intento hacer esa chuminada para el sábado, que es muy simple, pero no es lo mismo poner un mensaje que hacer un programa, que la mano no está para muchos trotes.

silenthill
Mensajes: 69
Registrado: 05 Oct 2016, 12:28

Mensaje por silenthill » 19 Oct 2016, 15:38

Ahora mismo he hecho algo medio funcional con el autoit. Un poco basurilla aunque funciona casi bien, digo casi porque por algún motivo no me decodifica el primer caracter... :?: El caso es que en la anterior prueba que hice si que lo hacia aunque sólo admitía un valor para a2. Alguna cosa estoy metiendo mal... Tengo que investigarlo mejor.
De cualquier manera... Agradecido hasta el infinito y más allá del 3% si programas una herramienta en condiciones. :D :lol: :D Desgracidamente lo que voy a sacar por esta traducción es 0,00000 Euros... Eso sí prometo la primicia en cuanto tengo todo bien montado.

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5661
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 19 Oct 2016, 16:06

Hacer ese programa es cosa de 5 minutos. Luego son 15 más para poner chuminadas, como mensajes de error y eso.

Solo he probado un poco a lo tonto con el fichero del primer post, y no salen bien las cosas. Cerca del final de los datos ya no decodifica bien, y no sé si será porque el fichero está mal o por alguna otra razón. Con el otro que has posteado me ha funcionado sin problema. Obviamente, no puede ser por lo que he hecho ya que funciona correctamente, no tiene nada extraño, es un simple bucle que hace un xor, y si fallase lo haría desde el principio, no en un punto cercano del final de ese fichero.

~~~ EDITADO ~~~
No, al mission 2 le pasa lo mismo. Cuando empiezan los textos no decodifica bien, todo lo anterior sí, así que ahí falta algo.

silenthill
Mensajes: 69
Registrado: 05 Oct 2016, 12:28

Mensaje por silenthill » 19 Oct 2016, 20:19

A partir de POF los datos no van codificados.
Ya he conseguido hacer una porquería de programa de descifrado en Autoit y que funciona. Antes se comía el primer dato pero el resto lo descifraba.
De todas formas cuidado que si estás mirado los dos primeros archivos el texto original está en japo.
Si miras los segundos el POF está en 0x0005c0, en los primeros que postee el POF comienza en 0x0005f0

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5661
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 19 Oct 2016, 20:54

No, antes del POF lo hace mal. Lo hace bien hasta los textos de las etiquetas, pero cuando vienen los textos del juego ya no lo hace bien. O eso o me has dado ficheros con textos japoneses: MISSION_001(original) y MISSION_002(original).

Si está visto que esta no es mi semana, ¡¡¡PUTA BIDA!! (sí, con B de BACAVURRA).

Mándame un mazo de ficheros codificados con textos legibles, que la tool creo que está bien como la tengo ya, incluso cambia el byte ese que hay por ahí. Codificar es imposible, ya explicaré el por qué.

silenthill
Mensajes: 69
Registrado: 05 Oct 2016, 12:28

Mensaje por silenthill » 20 Oct 2016, 00:12

https://mega.nz/#!x5BmQD5b!ol38Tj7qVV8q ... t6TautX8mg
Más de 100 archivos incluidos algunos largos todos supuestamente en inglés.
Lo que no sé es si todos contiene texto. Los de misiones seguro, los largos los hay con texto y los hay sin texto. Bueno texto que se use en el juego, texto tienen todos que son rutas de archivos. Acabo de pillar uno que creo que tiene texto en japones que no tradujeron. El Game_Info. Está en el paquete.

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5661
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 20 Oct 2016, 09:16

Muchos no tienen nada. Otros tienen cosas en japonés. Pero vamos, parece que he decodificado todo bien.

El GAME_INFO_SLG tiene 100 bytes de texto en japonés, usando el codepage 932.
El GAME_INFO_SLG_TMP_PARAM tiene los 22 bytes de texto en japonés también.

¿La parte del POF qué es? ¿Gráficos?

silenthill
Mensajes: 69
Registrado: 05 Oct 2016, 12:28

Mensaje por silenthill » 20 Oct 2016, 12:04

Biennnnnn... :D :D
La basurilla que programé es bastante basura.
Cabría pensar que son gráficos por como están los datos, pero los gráficos del juego se almacenan en otros archivos.
Los gráficos está ya editados y reinsertados, inclusos unos muy suyos que cargan letras como texturas y las usan animaciones. Tuve que editar las animaciones.
Con texto están los de las misiones y luego los de los objetos, nombre de las misiones y alguno otro más. Los otros están vacios.

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5661
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 21 Oct 2016, 15:21

Aquí va todo: https://www.mediafire.com/?94tylu68vqk5jvu

Dentro está:
decoder.c -> el código fuente del decodificador
decoder.exe -> el ejecutable del decodificador
decode.bat -> un simple BAT para que haga todo de golpe
encoded\*.* -> carpeta con todos los ficheros codificados

En la carpeta "encoded\" se meten todos los ficheros a decodificar. Luego se ejecuta el BAT y se crea automáticamente la carpeta "decoded\" con todos los ficheros decodificados.

En el código fuente se pueden indicar los bloques a decodificar, cambiando un 0 por un 1. Por defecto he dejado solo el "MXEC", que es donde están los textos.

silenthill
Mensajes: 69
Registrado: 05 Oct 2016, 12:28

Mensaje por silenthill » 21 Oct 2016, 16:23

Muchaaassssss gracias. Te añado a las créditos.
Funciona de muerte.
Última edición por silenthill el 21 Oct 2016, 16:30, editado 1 vez en total.

Responder