-- EBOOT.PBP --
[Ojo, la PSP es big-endian]
- Sólo vamos a discutir los formatos propios de la PSP: PSF, PSP y PSAR.
- WORD 16 bits, DWORD 32 bits.
/***********/
/*** PBP ***/
/***********/
- Una cabecera seguida de ficheros embebidos (pueden no aparecer todos)
UBYTE cabecera[0x28];
PARAM.PSF //Parámetros de la aplicación (menú del SO)
ICON0.PNG //Icono de la aplicación (menú del SO)
ICON1.PMF //Icono animado de la aplicación (menú del SO)
BACKGROUND.PNG //Fondo de la aplicación (menú del SO)
PIC1.PNG //Imagen de la aplicación (menú del SO)
SND0.AT3 //Sonido de la aplicación (menú del SO)
DATA.PSP //La aplicación en sí
DATA.PSAR //Datos de la aplicación
- Cabecera:
0x00 DWORD firma; //Siempre 0x00504250 (".PBP")
0x04 DWORD version; //Versión del PBP
0x08 DWORD offset[8]; //Corresponden al desplazamiento dentro del PBP de los 8 ficheros
indicados en la estructura del PBP
- Los PBP con version = 0x00010001 tienen una protección añadida que no deja modificar el PBP. Si se modifica algún byte, no arranca: si es el PNG porque
"la información de copyright ha sido modificada". Si es el PSF, entonces arranca pero finalmente vuelve a salir "no se puede ejecutar".
- Encontrados PBP con el offset de UNKNOWN.PSAR apuntando al final de los datos del PBP. No existe PSAR.
/***********/
/*** PSF ***/
/***********/
- Alineamiento a DWORD
0x00 DWORD firma; //Siempre 0x00505346 (".PSF")
0x04 DWORD version; //Siempre 0x0101 0000
0x08 DWORD offset_tabla_claves; //Relativo al comienzo del PSF
0x0C DWORD offset_tabla_valores; //Relativo al comienzo del PSF
0x10 DWORD num_claves; //Número de elementos de la tabla_indice
0x14 UBYTE tabla_indice[]; //Elementos de 16 bytes, cada uno con el siguiente formato:
// WORD offset_tabla_claves Desplazamiento de la clave en "tabla_claves"
// UBYTE alineamiento_dato Alineamiento de los datos en
"tabla_valores", siempre 0x04, alineamiento
a nivel de byte
// UBYTE tipo_datos Tipo de datos (0 - binario, 2 - cadena de caracteres
UTF-8 acabada en NULL, 4 - número de 32 bits con
signo)
// DWORD tamanio_datos Tamaño de los datos (bytes) en "tabla_valores"
// DWORD tamanio_total Tamaño de datos y relleno (bytes) en
"tabla_valores"
// DWORD offset_valor Offset del valor en "tabla_valores"
0xXX UBYTE tabla_claves[]; //Claves: serie de cadenas de caracteres ASCII sin espacios acabadas en
NULL (0x00). Alineamiento a DWORD, por tanto puede haber relleno con
ceros
0xXX UBYTE tabla_valores[]; //Valores de los parámetros indicados por "tabla_indice" y "tabla_claves"
- Claves que se conocen:
Clave Tipo Descripción
----- ---- -------------------------------------------------------------
BOOTABLE INT Si está a 1 parece indicar que aplicación se puede arrancar nada más
encenderse la PSP (saltando el menú)
CATEGORY TXT Categoría del PSF
DISC_ID TXT ID del disco
DISC_NUMBER INT Número de disco si hay varios discos (cuenta desde 1)
DISC_TOTAL INT Número total de discos
DISC_VERSION TXT Versión del disco
DRIVER_PATH TXT ?
LANGUAGE TXT Lenguaje
PARENTAL_LEVEL INT Mínimo nivel parental requerido para ejecutar
PSP_SYSTEM_VER TXT Versión mínima de FW para ejecutar
REGION INT Máscara con las regiones autorizadas a ejecutar
SAVEDATA_DETAIL TXT Texto que aparece debajo de los datos de la partida salvada
SAVEDATA_DIRECTORY TXT Nombre del directorio donde se halla la partida salvada
SAVEDATA_FILE_LIST BIN Lista de fichero de partida salvada. Formato desconocido.
SAVEDATA_PARAMS BIN Parámetros de partida salvada. Formato desconocido.
SAVEDATA_TITLE TXT Título de la partida salvada.
TITLE TXT Título de la aplicación.
TITLE_0 TXT Título de la aplicación en Japonés
TITLE_2 TXT Título de la aplicación en Francés
TITLE_3 TXT Título de la aplicación en Español
TITLE_4 TXT Título de la aplicación en Alemán
TITLE_5 TXT Título de la aplicación en Italiano
TITLE_6 TXT Título de la aplicación en Holandés
TITLE_7 TXT Título de la aplicación en Portugués
TITLE_8 TXT Título de la aplicación en Ruso
TITLE_9 TXT Título de la aplicación en ???
TITLE_10 TXT Título de la aplicación en ???
TITLE_11 TXT Título de la aplicación en ???
UPDATER_VER TXT Utilizado por los actualizadores de FW para indicar a qué versión se actualiza.
- La clave CATEGORY describe el tipo de datos que contiene el PSP. Las opciones que se conocen son:
"MS" -> MemoryStick SaveGame (sólo en este caso, la entrada en la tabla índice indica un tamaño de 2 bytes
en vez de 3)
"MG" -> MemoryStick Game
"UG" -> UMD Game
"WG" -> WLAN Game
"UV" -> UMD Video
"UA" -> UMD Audio
"UC" -> UMD Cleaning Disc
"EG"??
/***********/
/*** PSP ***/
/***********/
- Cabecera:
0x00 DWORD firma; //Siempre 0x7E505350 ("~PSP")
0x04 WORD atributos1; //1 -> SCE_MODULE_ATTR_CANT_STOP
//2 -> SCE_MODULE_ATTR_LOAD
//4 -> SCE_MODULE_ATTR_START
//8 -> ???
0x06 WORD atributos2; //1 -> FLAG_COMPRESS
//2 -> FLAG_NORELOC
0x08 UBYTE version_modulo_bajo;
0x09 UBYTE version_modulo_alto;
0x0A UBYTE nombre[0x1C];
0x26 UBYTE version_formato; //Siempre 1
0x27 UBYTE num_segmentos;
0x28 DWORD tamanio_elf; //Tamaño del PRX (.PSP sin cabecera)
0x2C DWORD tamanio_psp; //Tamaño del DATA.PSP
0x30 DWORD entrada; //Entrada al ejecutable
0x34 DWORD offset_modinfo; //Los 8 bits más altos se restan a los 24 bajos
0x38 DWORD tamanio_bss;
0x3C WORD alineamiento[4];
0x44 DWORD direccion[4];
0x54 DWORD tamanio[4];
0x64 DWORD desconocido[6];
0x7C UBYTE tipo;
0x7D UBYTE desconocido[0x33];
0xB0 DWORD tamanio_elf_comp; //Tamaño del PRX comprimido
0xB4 DWORD desconocido; //Siempre 0x8000 0000
0xB8 UBYTE desconocido[0x18]; //Siempre 0
0xD0 DWORD id;
0xD4 UBYTE desconocido[0x7c];
- Datos: muy probablemente el ejecutable comprimido y cifrado.
/************/
/*** PSAR ***/
/************/
- Tiene el siguiente formato:
- Cabecera
- Sección A (Cabecera, Datos)
- Sección A (Cabecera, Datos)
- Sección B (Cabecera, Datos)
... y así alternando A y B
- Sección A (Cabecera, Datos)
- Sección B (Cabecera, Datos)
- Cabecera:
0x00 DWORD firma; //Siempre 0x50534152("PSAR")
0x04 DWORD separador; //Siempre 0x01000000
0x08 DWORD tamanio; //Tamaño de los datos (sin contar la cabecera)
0x0C DWORD separador //Siempre 0x01000000
- Cabecera de sección:
0x00 UBYTE desconocido[0xb0];
0xB0 DWORD tamanio_datos; //Tamaño de los datos de la sección
0xB4 UBYTE desconocido[4]; //¿Siempre 0x80?
0xB8 UBYTE desconocido[0x18]; //¿Siempre 0x00?
0xD0 UBYTE desconocido[4]; //¿Siempre 0x06?
0xD4 UBYTE desconocido[0xC];
0xE0 UBYTE desconocido[0x70];
- Datos de sección
- El tipo A siempre tiene 0x110 bytes.
- El tipo B es variable en tamaño.
- Es probable que se trate de la aplicación a ser instalada por el ejecutable DATA.PSP