Ayuda para encontrar el cifrado de un conjunto de archivos.
-
- Mensajes: 54
- Registrado: 05 Oct 2016, 12:28
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
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
- CUE
- Administrador
- Mensajes: 5519
- Registrado: 24 Ene 2011, 16:52
-
- Mensajes: 54
- Registrado: 05 Oct 2016, 12:28
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.
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.

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.

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.



- CUE
- Administrador
- Mensajes: 5519
- Registrado: 24 Ene 2011, 16:52
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
Básicamente en C es un simple bucle:
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

Básicamente en C es un simple bucle:
Código: Seleccionar todo
total = *(unsigned int *)(tabla + 0x34);
idx = 0x40;
xor = tabla[idx+1];
for (i = 0; i < total; i++) {
codificado = tabla[idx+i];
tabla[idx+i] ^= xor;
xor = codificado;
}
-
- Mensajes: 54
- Registrado: 05 Oct 2016, 12:28
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...
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.
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.
A mí es que me metes en C y me pierdo...

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.

Un saludo y muchas gracias.
P.D. Te añado a los créditos en agradecimientos y probado en la consola y funciona.
- CUE
- Administrador
- Mensajes: 5519
- Registrado: 24 Ene 2011, 16:52
Yo soy más castizo que eso. A mí con unos regalitos, tipo 3%, mordida o comisión, me valesalteadorneo escribió:P.D. Te añado a los créditos en agradecimientos y probado en la consola y funciona.

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.
-
- Mensajes: 54
- Registrado: 05 Oct 2016, 12:28
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.
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.

De cualquier manera... Agradecido hasta el infinito y más allá del 3% si programas una herramienta en condiciones.



- CUE
- Administrador
- Mensajes: 5519
- Registrado: 24 Ene 2011, 16:52
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.
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.
-
- Mensajes: 54
- Registrado: 05 Oct 2016, 12:28
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
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
- CUE
- Administrador
- Mensajes: 5519
- Registrado: 24 Ene 2011, 16:52
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é.
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é.
-
- Mensajes: 54
- Registrado: 05 Oct 2016, 12:28
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.
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.
- CUE
- Administrador
- Mensajes: 5519
- Registrado: 24 Ene 2011, 16:52
-
- Mensajes: 54
- Registrado: 05 Oct 2016, 12:28
Biennnnnn...
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.


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.
- CUE
- Administrador
- Mensajes: 5519
- Registrado: 24 Ene 2011, 16:52
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.
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.
-
- Mensajes: 54
- Registrado: 05 Oct 2016, 12:28
Muchaaassssss gracias. Te añado a las créditos.
Funciona de muerte.
Funciona de muerte.
Última edición por silenthill el 21 Oct 2016, 16:30, editado 1 vez en total.