¿Archivos "P6TA"?

Lugar donde se intentarán resolver problemas específicos
Responder
Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5520
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 17 Abr 2012, 09:59

En mi caso no es miedo al ensamblador. Recuerdo que en su momento estaba metiendo mano a la game boy, que usa la Z80, y ésa me la conozco, y tenía que mirar cosas de la NDS y de la PSX. Sé que tengo bastante facilidad para "juguetear" con ello, pero meterme de golpe con ARM y RISC como que no, que todo tiene un límite. Me decanté más por el RISC porque la NDS parecía que tenía sobrecapacidad, es decir, que había gente de sobra metiéndose con todo lo relativo a la consola, y creí que no merecía la pena. Después ya te das cuenta de que si quieres algo te toca hacerlo a ti mismo, que los demás se limitan a copiarse unos a otros, haciendo la misma cosa de 40 formas distintas, y dejando lo que realmente interesa de lado.

¿Te da vergüenza poner como nombre de variables a los registros del micro? Ahí se nota que eres un poco novato. Así es como se hace siempre, usando una especie de pseudo código. Aquí un ejemplo, de una parte de la descompresión del Legend of Mana de PSX, bastante simple, pero se nota la diferencia, y quien no entienda una columna puede entender otra (y ya ves que mi diagrama es mucho más simple que los que tú usas, jeje):

Código: Seleccionar todo

@codeF1: lbu   $t3,0x0001($t2)          # t3 = *(t2+1)       get X
         lbu   $v0,0x0000($t2)          # v0 = *t2           get N
         addiu $t2,$t2,0x0003           # t2 += 3            update pak_data_ptr
         addiu $t4,$t4,0x0003           # t4 += 3            update pak_code_ptr
         addiu $t0,$v0,0x0004           # t0 = v0 + 4        N += 4
@loopF1&#58; sb    $t3,0x0000&#40;$t1&#41;          # *t1 = t3 <-------+ put X
         addiu $t0,$t0,0xFFFFFFFF       # t0--             | N--
         bnez  $t0,@loopF1              # t1++             | update raw_ptr
         addiu $t1,$t1,0x0001           # if &#40;t0&#41; JMP >----+ loop while N
         j     @next                    # *t6 = t4           update pak_ptr
         sw    $t4,0x0000&#40;$t6&#41;          # JMP @next          another code
Una vez entendido lo anterior es cuando puede ponerse algo como:

Código: Seleccionar todo

      case 0xF1&#58; // F1+N+X&#58; put &#40;N+4&#41; times &#123;X&#125;
        n = *pak++ + 4;
        x = *pak++;
        while &#40;n--&#41; *raw++ = x;
        break;
Ahora es cuando se compara el MIPS con el C y se ve la diferencia.

Sube un fichero y lo miro un rato, que he terminado unas cosas que estaba haciendo y esta semana no creo que me ponga con nada, así que puedo echar un vistazo (en teoría).

~~~ AÑADIDO ~~~
Creo que ya lo tengo. Al final no era tan fiero el león como lo pintaban y es una simple compresión incremental. Luego más, que hoy estoy sólo y tengo que hacer la comida, y fregar, y limpiar, y ...

Avatar de Usuario
pleonex
Mensajes: 68
Registrado: 22 Ago 2011, 00:06
Ubicación: Espania
Contactar:

Mensaje por pleonex » 17 Abr 2012, 18:01

La verdad es que no suele ser complicado encontrar una codificación cuando le coges algo de manejo y cada vez hay más juegos con encriptaciones propias. Empecé a mirar código ensamblador de juegos de la DS por Navidad y ya he escrito 6 o 7 programas para decodificar (algunos muy básico de encriptación con XOR). Es cierto que conocía ya bastante de antes y de una asignatura de la carrera en la que me enseñaron un lenguaje ensamblador básico de 8 bits (CODE2). Pero especialmente ARM lo veo bastante intuitivo y fácil de aprender una vez que sabes los conceptos básicos.

Te subo aquí una carpeta llena de archivos con esta codificación:
novel
También he actualizado el programa para desencriptar que se me olvidó quitarle una líneas que sobreescribían los argumentos de entrada :p

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

Mensaje por CUE » 17 Abr 2012, 19:17

Bueno, en principio no necesitaba los ficheros, pero después de ver "aed1_0060_00.dat" y "passaged_000_00.dat" me ha tocado modificar la estructura de la cabecera que tenía, y, como no me has comentado nada, supongo que no te habrás fijado en ese byte rebelde que hay en la longitud:
- 0x00:4 signatura "SIR0"
- 0x04:1 ??? <--- no sé qué es este byte
- 0x05:2 el word bajo del tamaño del fichero comprimido
- 0x07:9 a cero
- 0x10:3 tamaño del fichero descomprimido
- 0x13:1 byte alto del tamaño del fichero comprimido
A partir de 0x14 están los datos comprimidos, que son valores de 16 bits. El primer dato es el valor inicial al que se irán sumando o restando incrementos dependiendo de los flags.

Me resulta extraño separar 1 byte de la longitud comprimida para ponerlo aparte.


Aquí está mi versión de la descompresión: ***BORRADO***

Ahora ya es un programa entendible, que no se parece en nada al pseudo-código.
No he hecho la compresión, te la dejo para ti, que a mí no me gusta este sistema. Para cualquier duda, ya sabes, manda primero las cervezas.

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

Mensaje por CUE » 18 Abr 2012, 11:20

Me estaba comiendo el coco con una cosilla hasta que lo he visto claro.

El byte 0x14 es el valor inicial, el que inicia la descompresión, y el byte 0x15 es el valor "antiguo", pues se necesitan dos valores, imagino que para optimizar las repeticiones de números de 16 bits. Tal y como estaba se podía dar el caso de que ese valor "antiguo" no fuese cero y la descompresión se hiciese mal, aunque no he visto ningún caso en los ejemplos ya que siempre se inicializa a cero. En teoría esos dos valores deberían ser de 8 bits, pero soy un derrochador y los pongo de 32, que no pasa nada.

Todo esto es porque no lo veía claro cuando el flag era del tipo "????????-???????1", que es el único caso en el que no se actualiza el valor "antiguo", o del tipo "????????-?????x10", pues se podría usar el valor sin estar definido.

Todo actualizado en condiciones: http://www.mediafire.com/?p9bls1lqfb904at

Avatar de Usuario
pleonex
Mensajes: 68
Registrado: 22 Ago 2011, 00:06
Ubicación: Espania
Contactar:

Mensaje por pleonex » 18 Abr 2012, 21:01

Gracias, ya la conseguí comprender, de hecho he trabajado con alguna similar a ella (como el ADPCM para los STRM).

No le veo mucho sentido que haya una cabecera de 0x20 bytes cuando cabe en una de 0x10 y con tanto espacio de separación entre valores. Además, he estado investigando con IDA y en ningún momento ni el byte en 0x04 ni en 0x15 se leen. Por lo que pienso que debe ser un estándar y que cada compañía crea sus herramientas.

Esto es lo que hace justamente antes de iniciar el proceso de decodificación:

Código: Seleccionar todo

RAM&#58;02044E40 LDR     R6, &#91;R0,#&#40;unk_2354768 - 0x2354740&#41;&#93; ; Get file pointer
RAM&#58;02044E44 LDR     R0, &#91;R0,#&#40;unk_2354744 - 0x2354740&#41;&#93;
RAM&#58;02044E48 LDRB    R2, &#91;R6,#0x10&#93;                  ; Read decrypted size
RAM&#58;02044E4C LDRB    R1, &#91;R6,#0x11&#93;                  ; it's 3 bytes
RAM&#58;02044E50 LDRB    R4, &#91;R6,#0x12&#93;
RAM&#58;02044E54 ADD     R5, R2, R1,LSL#8
RAM&#58;02044E58 LDR     R1, =unk_2354740
RAM&#58;02044E5C MOV     R2, #0
RAM&#58;02044E60 STR     R2, &#91;R1,#&#40;unk_2354794 - 0x2354740&#41;&#93;
RAM&#58;02044E64 STR     R2, &#91;R1,#&#40;unk_2354798 - 0x2354740&#41;&#93;
RAM&#58;02044E68 LDRB    R3, &#91;R6,#0x14&#93;                  ; Read the initial value of the encryption
RAM&#58;02044E6C ADD     R4, R5, R4,LSL#16
RAM&#58;02044E70 ADD     R2, R6, #0x16                   ; Position of the encoded data
RAM&#58;02044E74 STRB    R3, &#91;R0&#93;                        ; Store it
RAM&#58;02044E78 STRB    R3, &#91;R1,#&#40;unk_2354790 - 0x2354740&#41;&#93;
Lee el byte de 0x14 con LDRB y luego pone el puntero directamente en 0x16, así que no se usa a simple vista.

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

Mensaje por CUE » 18 Abr 2012, 21:31

Si eso lo pensé, pero si lo comprimido comienza con "????????-?????010" se usa R0, que debe contener el valor anterior del byte (R5), y no está definido aún, por lo que la compresión partiría de un byte falso, o sea, que ni se sabe lo que saldría. La única opción posible es que sea ese byte de la cabecera, que parece ser 0 siempre. También es verdad que nunca va a empezar con esa máscara de flags porque todos los ficheros son "SIR0", y el incremento de "S" a "I" no producirá nunca ese caso. Pero como soy un tiquismiquis, lo pongo, que no me gusta dejar cosas sueltas, aunque no se usen nunca.

La verdad es que como método de compresión es un verdadero asco. Viene bien para ficheros con muchos bytes iguales seguidos, que es donde alcanza su máxima compresión (12.5%), pero como haya unos cuantos bytes diferentes seguidos la eficiencia de la compresión disminuye mortalmente, pudiendo darse muchos casos en los que el fichero comprimido ocupe más que el descomprimido. Imagino que por eso lo usan con los gráficos (no sé si está con otro tipo de ficheros).

Por cierto, en teoría debería poder reemplazarse cualquier fichero comprimido por su versión descomprimida. ¿Has hecho la prueba? Mister_seta te lo pagará con sexo si funciona, que lo sé yo, que a mí me debe su virginidad (tengo pruebas de ello, por si se echa para atrás, y pienso cobrarlo).

Avatar de Usuario
pleonex
Mensajes: 68
Registrado: 22 Ago 2011, 00:06
Ubicación: Espania
Contactar:

Mensaje por pleonex » 18 Abr 2012, 23:29

He estado indagando y mirando en otros juegos de esta compañia y su último juego para la DS es el 999 donde incorporan por primera vez los AT6P, en los demás hay AT4P, AT5P y los SIR0 sin codificar, por lo que se supone que ese AT6P es la última versión de su "estupenda" codificación...

Lo de reemplazarlo por uno descomprimido no va, y mira que debería porque hay una parte donde va comprobando si todas las cabeceras son "SIR0" pero nada, me encuentro que intenta meter al SIR0 en la subrutina de decodificación y se queda en el bucle infinito que hay cuando el flag de la descompresión es mayor de 0x100.

De todas formas, tengo ganas de hacer alguna codificación por practicar, ya si tengo tiempo y no me meto en más proyectos (lo hago sin querer que es lo peor...) lo intento.

(Para que luego digan que hacemos todo esto gratis... inocentes)

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

Mensaje por CUE » 20 Abr 2012, 10:51

Si no recuerdo mal, la AT4P era una variante de LZ, que ya es algo más decente y comprensible, además de ser válida para cualquier tipo de fichero. La AT5P creo que la vi en el juego 999, pero ni me molesté en abrir uno de esos ficheros.

Si no van los ficheros descomprimidos, la única solución es romhack del de verdad, parcheando la rutina y que si encuentra el "SIR0" en la cabecera se salte la descompresión. Para mí eso son palabras mayores, que no domino a fondo el ARM, pero no parece ser muy complicado, quitando lo de buscar espacio libre donde meterla.

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

Mensaje por CUE » 01 Sep 2012, 15:33

No tengo youtube (ni feisbuk, ni tuiter, ni ganas de tener todas esas cosas que sólo hacen perder el tiempo), así que no puedo subir vídeos para que se vean.

Si alguien puede, que sube éste, que es muy esmirriado, de sólo 1.04MB, aunque tampoco es que merezca mucho la pena:
http://www.mediafire.com/?yojroc19021bc1y

Uno de los fotogramas es el siguiente:
[img]http://img163.imageshack.us/img163/5367/testfeq.png[/img]

A ver quién sabe lo que tiene de especial esa imagen. Pero, ojo, que estamos en crisis, así que no hay ni chuches ni muñecas chochonas de premio.

~ AÑADIDO ~
Por si algún pleonex se pone quisquilloso: no hay carácter '¡' porque he usado un programa de edición gráfico en inglés, que, como todo el mundo mundial sabe, no usa ese carácter.

mister seta 123
Mensajes: 53
Registrado: 14 Ago 2011, 15:23

Mensaje por mister seta 123 » 01 Sep 2012, 19:28

Pues... el logotipo está al revés. ¿Me das una palmadita en la espalda, al menos?

Coñas aparte, ¿entonces ya es posible editar algo? Me alegro pues, tiene que haber sido chungo. Supongo que también podría servir para otros juegos de la compañía, pero si este es el único con los AT6P...

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

Mensaje por CUE » 02 Sep 2012, 09:28

Editar se ha podido editar siempre. Pero volver a meter en el juego no.

mister seta 123
Mensajes: 53
Registrado: 14 Ago 2011, 15:23

Mensaje por mister seta 123 » 02 Sep 2012, 17:07

Perdona, a eso me refería, a si ya se podían meter en el juego. Entonces, ¿has conseguido que el juego se salte la descompresión o lo has hecho de otra forma?

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

Mensaje por CUE » 02 Sep 2012, 17:26

No hay que saltarse nada ni hacerlo de otra forma, basta con comprimirlo.

mister seta 123
Mensajes: 53
Registrado: 14 Ago 2011, 15:23

Mensaje por mister seta 123 » 02 Sep 2012, 20:37

¿Con el Tinke? Me dice que hubo un error comprimiendo el archivo.
Y sé que es una bestiada, pero probando a comprimirlo en un .rar me sale esto:


[img]http://img684.imageshack.us/img684/4217/sinttulowhh.png[/img]

Es lo único que he conseguido hasta ahora.

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

Mensaje por CUE » 03 Sep 2012, 11:16

Es que no puedes comprimirlo porque no tienes la herramienta para ello.

Responder