Savegames/es: Difference between revisions
No edit summary |
mNo edit summary |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
Esta página describe el formato, la des/encriptación, etc de las partidas guardadas de los cartuchos de los juegos de la 3DS. Puedes encontrar partidas guardadas de varios juegos de la 3DS en la página de [[Games | Esta página describe el formato, la des/encriptación, etc de las partidas guardadas de los cartuchos de los juegos de la 3DS. Puedes encontrar partidas guardadas de varios juegos de la 3DS en la página de [[Games|Juegos (Inglés)]]. | ||
Line 43: | Line 43: | ||
Los siguientes dos bytes que siguen al blockmap son el CRC16 (con 0xFFFF como valor inicial (como el modbus)) de los primeros 8 bytes del blockmap. | Los siguientes dos bytes que siguen al blockmap son el CRC16 (con 0xFFFF como valor inicial (como el modbus)) de los primeros 8 bytes del blockmap. | ||
Entonces hay el journal. | |||
La estructura del journal es: | |||
<pre> | <pre> | ||
struct sector_entry { | struct sector_entry { | ||
uint8_t virt_sec; // | uint8_t virt_sec; // Asignado al sector | ||
uint8_t prev_virt_sec; // | uint8_t prev_virt_sec; // Sector físico previamente asignado | ||
uint8_t phys_sec; // | uint8_t phys_sec; // Asignado desde el sector | ||
uint8_t prev_phys_sec; // | uint8_t prev_phys_sec; // Sector virtual previamente asignado | ||
uint8_t phys_realloc_cnt; // | uint8_t phys_realloc_cnt; // Cantidas de veces que el sector físico ha sido reasignado | ||
uint8_t virt_realloc_cnt; // | uint8_t virt_realloc_cnt; // Cantidas de veces que el sector virtual ha sido reasignado | ||
uint8_t chksums[8]; | uint8_t chksums[8]; | ||
} __attribute__((__packed__)); | } __attribute__((__packed__)); | ||
Line 63: | Line 63: | ||
</pre> | </pre> | ||
Con la constante mágica 0x080d6ce0. | |||
Los checksums de las entradas del blockmap/journal trabajan de la siguiente forma: | |||
* | * cada byte es el checksum de un bloque de tamaño 0x200 bytes encriptado | ||
* | * para calcular el checksum, el CRC16 del bloque ( con el valor iniciar 0xFFFF) es calculado, y los dos bytes del CRC16 son XOReados juntos para producir un checksum de 8 bits. | ||
=== | === Particiones=== | ||
Puede haber múltiples particiones en el chip. | |||
Las particiones están representadas por tablas de manchas del DIFI dentro de la estructura DISA. | |||
El orden de las manchas del DIFI es el orden de las particiones del chip. | |||
'''DISA''' | '''DISA''' | ||
Line 82: | Line 82: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! | ! Principio | ||
! | ! Longitud | ||
! | ! Descripción | ||
|- | |- | ||
| 0x00 | | 0x00 | ||
Line 92: | Line 92: | ||
| 0x04 | | 0x04 | ||
| 4 | | 4 | ||
| | | Desconocido (puede ser mágico, puede ser el mismo que todas las partidas) | ||
|- | |- | ||
| 0x08 | | 0x08 | ||
| 8 | | 8 | ||
| | | Tamaño de la tabla de particiones | ||
|- | |- | ||
| 0x10 | | 0x10 | ||
| 8 | | 8 | ||
| Offset | | Offset a la partición primaria de la tabla del DISA | ||
|- | |- | ||
| 0x18 | | 0x18 | ||
| 8 | | 8 | ||
| Offset | | Offset a la partición secundaria de la tabla del DISA | ||
|- | |- | ||
| 0x20 | | 0x20 | ||
| 8 | | 8 | ||
| | | Longitud de la tabla de particiones | ||
|- | |- | ||
| 0x28 | | 0x28 | ||
| 8 | | 8 | ||
| | | Offset de la entrada de guardado en la tabla de particiones | ||
|- | |- | ||
| 0x30 | | 0x30 | ||
| 8 | | 8 | ||
| | | Longitud de la entrada de guardado en la tabla de particiones | ||
|- | |- | ||
| 0x38 | | 0x38 | ||
| 8 | | 8 | ||
| | | Offset de la entrada de datos en la tabla de particiones | ||
|- | |- | ||
| 0x40 | | 0x40 | ||
| 8 | | 8 | ||
| | | Longitud de la entrada de datos en la tabla de particiones | ||
|- | |- | ||
| 0x48 | | 0x48 | ||
| 8 | | 8 | ||
| | | Offset de la partición de guardado | ||
|- | |- | ||
| 0x50 | | 0x50 | ||
| 8 | | 8 | ||
| | | Longitud de la partición de guardado | ||
|- | |- | ||
| 0x58 | | 0x58 | ||
| 8 | | 8 | ||
| | | Offset de la partición de datos | ||
|- | |- | ||
| 0x60 | | 0x60 | ||
| 8 | | 8 | ||
| | | Longitud de la partición de datos | ||
|- | |- | ||
| 0x68 | | 0x68 | ||
| 4 | | 4 | ||
| | | Tabla activa (y el offset hacia la filebase) | ||
|- | |- | ||
| 0x6C | | 0x6C | ||
| 0x20 | | 0x20 | ||
| Hash | | Hash desde la partición activa | ||
|- | |- | ||
| 0x8C | | 0x8C | ||
| 4*29 | | 4*29 | ||
| | | Desconocido | ||
|} | |} | ||
Line 169: | Line 169: | ||
Actually DIFI blobs are 0x12C large because the last 4 are not used and appear 0xFFFFFFFF at the encrypted image. | Actually DIFI blobs are 0x12C large because the last 4 are not used and appear 0xFFFFFFFF at the encrypted image. | ||
Para la mayoria de los juegos hay solo 1 division(La division SAVE) y algunos(como Asphalt 3D , Steel Diver & Lego Star Wars III) tienen 2 divisiones | |||
* 2 | * 2 Divisiones significan que los archivos dentro de la division SAVE estan en otra division ( nosotro podriamos llamarla division DATA). | ||
* No | * No mas de 2 divisiones han sido vistas todavia (y no pueden ser debido a la estructura conocida DISA). | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 552: | Line 552: | ||
[[File:Sfsave_drawing.png]] | [[File:Sfsave_drawing.png]] | ||
=== | === La Inicialización === | ||
Cuando un EEPROM save contiene todos los bloques xFFFF se asume sin inicializar los cartuchos y lo inicializa los datos por defecto en su lugar, sin preguntar al usuario. | |||
Tengo un juego nuevo SplinterCell3D-Pal y he descargado la partida guardada y era 128KB de 0xFF, excepto los primeros bytes 0x10, que fueron 'Z' (en mayúsculas) --[[User:Elisherer|Elisherer]] 22:41, 15 de octubre de 2011 (CEST) | |||
=== Fun Facts === | === Fun Facts === |