• Viernes 29 de Marzo de 2024, 14:25

Autor Tema:  Investigación sobre el EBOOT.PBP de la PSP  (Leído 15035 veces)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Investigación sobre el EBOOT.PBP de la PSP
« en: Miércoles 21 de Enero de 2009, 10:08 »
0
Hola de nuevo a tod@s los usuarios del foro.

La PSP es una consola de portátil de Sony y que utiliza unos extraños ficheros llamados EBOOT.PBP como ejecutables. Esto me extrañó mucho y comencé a investigar por mi cuenta sobre el formato y el contenido de este fichero y recopilando información de Internet. Si alguien le interesa el tema, estaría encantado de recibir una mano. Aquí les dejo los resultados temporales de mis avances. Espero que os animéis alguno  :)

Código: Text
  1. -- EBOOT.PBP --
  2.  
  3. [Ojo, la PSP es big-endian]
  4.  
  5. - Sólo vamos a discutir los formatos propios de la PSP: PSF, PSP y PSAR.
  6. - WORD 16 bits, DWORD 32 bits.
  7.  
  8. /***********/
  9. /*** PBP ***/
  10. /***********/
  11.  
  12. - Una cabecera seguida de ficheros embebidos (pueden no aparecer todos)
  13.  
  14. UBYTE cabecera[0x28];
  15. PARAM.PSF             //Parámetros de la aplicación (menú del SO)
  16. ICON0.PNG             //Icono de la aplicación (menú del SO)
  17. ICON1.PMF             //Icono animado de la aplicación (menú del SO)
  18. BACKGROUND.PNG        //Fondo de la aplicación (menú del SO)
  19. PIC1.PNG              //Imagen de la aplicación (menú del SO)
  20. SND0.AT3              //Sonido de la aplicación (menú del SO)
  21. DATA.PSP              //La aplicación en sí
  22. DATA.PSAR             //Datos de la aplicación
  23.  
  24. - Cabecera:
  25.  
  26. 0x00    DWORD firma;                //Siempre 0x00504250 (".PBP")
  27. 0x04    DWORD version;              //Versión del PBP
  28. 0x08    DWORD offset[8];            //Corresponden al desplazamiento dentro del PBP de los 8 ficheros
  29.                                       indicados en la estructura del PBP
  30.  
  31. - 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
  32. "la información de copyright ha sido modificada". Si es el PSF, entonces arranca pero finalmente vuelve a salir "no se puede ejecutar".
  33.  
  34. - Encontrados PBP con el offset de UNKNOWN.PSAR apuntando al final de los datos del PBP. No existe PSAR.
  35.  
  36. /***********/
  37. /*** PSF ***/
  38. /***********/
  39.  
  40. - Alineamiento a DWORD
  41.  
  42. 0x00    DWORD firma;                //Siempre 0x00505346 (".PSF")
  43. 0x04    DWORD version;              //Siempre 0x0101 0000
  44. 0x08    DWORD offset_tabla_claves;  //Relativo al comienzo del PSF
  45. 0x0C    DWORD offset_tabla_valores; //Relativo al comienzo del PSF
  46. 0x10    DWORD num_claves;           //Número de elementos de la tabla_indice
  47. 0x14    UBYTE tabla_indice[];       //Elementos de 16 bytes, cada uno con el siguiente formato:
  48.                                     //  WORD offset_tabla_claves  Desplazamiento de la clave en "tabla_claves"
  49.                                     //  UBYTE alineamiento_dato   Alineamiento de los datos en
  50.                                                                   "tabla_valores", siempre 0x04, alineamiento
  51.                                                                   a nivel de byte
  52.                                     //  UBYTE tipo_datos  Tipo de datos (0 - binario, 2 - cadena de caracteres
  53.                                                           UTF-8 acabada en NULL, 4 - número de 32 bits con
  54.                                                           signo)
  55.                                     //  DWORD tamanio_datos  Tamaño de los datos (bytes) en "tabla_valores"
  56.                                     //  DWORD tamanio_total  Tamaño de datos y relleno (bytes) en
  57.                                                              "tabla_valores"
  58.                                     //  DWORD offset_valor  Offset del valor en "tabla_valores"                                                    
  59. 0xXX    UBYTE tabla_claves[];       //Claves: serie de cadenas de caracteres ASCII sin espacios acabadas en
  60.                                       NULL (0x00). Alineamiento a DWORD, por tanto puede haber relleno con
  61.                                       ceros
  62. 0xXX    UBYTE tabla_valores[];     //Valores de los parámetros indicados por "tabla_indice" y "tabla_claves"
  63.  
  64. - Claves que se conocen:
  65.  
  66. Clave                   Tipo    Descripción
  67. -----                   ----    -------------------------------------------------------------
  68. BOOTABLE                INT     Si está a 1 parece indicar que aplicación se puede arrancar nada más
  69.                                 encenderse la PSP (saltando el menú)
  70. CATEGORY                TXT     Categoría del PSF
  71. DISC_ID                 TXT     ID del disco
  72. DISC_NUMBER             INT     Número de disco si hay varios discos (cuenta desde 1)
  73. DISC_TOTAL              INT     Número total de discos
  74. DISC_VERSION            TXT     Versión del disco
  75. DRIVER_PATH             TXT     ?
  76. LANGUAGE                TXT     Lenguaje
  77. PARENTAL_LEVEL          INT     Mínimo nivel parental requerido para ejecutar
  78. PSP_SYSTEM_VER          TXT     Versión mínima de FW para ejecutar
  79. REGION                  INT     Máscara con las regiones autorizadas a ejecutar
  80. SAVEDATA_DETAIL         TXT     Texto que aparece debajo de los datos de la partida salvada
  81. SAVEDATA_DIRECTORY      TXT     Nombre del directorio donde se halla la partida salvada
  82. SAVEDATA_FILE_LIST      BIN     Lista de fichero de partida salvada. Formato desconocido.
  83. SAVEDATA_PARAMS         BIN     Parámetros de partida salvada. Formato desconocido.
  84. SAVEDATA_TITLE          TXT     Título de la partida salvada.
  85. TITLE                   TXT     Título de la aplicación.
  86. TITLE_0                 TXT     Título de la aplicación en Japonés
  87. TITLE_2                 TXT     Título de la aplicación en Francés
  88. TITLE_3                 TXT     Título de la aplicación en Español
  89. TITLE_4                 TXT     Título de la aplicación en Alemán
  90. TITLE_5                 TXT     Título de la aplicación en Italiano
  91. TITLE_6                 TXT     Título de la aplicación en Holandés
  92. TITLE_7                 TXT     Título de la aplicación en Portugués
  93. TITLE_8                 TXT     Título de la aplicación en Ruso
  94. TITLE_9                 TXT     Título de la aplicación en ???
  95. TITLE_10                TXT     Título de la aplicación en ???
  96. TITLE_11                TXT     Título de la aplicación en ???
  97. UPDATER_VER             TXT     Utilizado por los actualizadores de FW para indicar a qué versión se actualiza.
  98.  
  99. - La clave CATEGORY describe el tipo de datos que contiene el PSP. Las opciones que se conocen son:
  100.     "MS" -> MemoryStick SaveGame (sólo en este caso, la entrada en la tabla índice indica un tamaño de 2 bytes
  101.             en vez de 3)
  102.     "MG" -> MemoryStick Game
  103.     "UG" -> UMD Game
  104.     "WG" -> WLAN Game
  105.     "UV" -> UMD Video
  106.     "UA" -> UMD Audio
  107.     "UC" -> UMD Cleaning Disc
  108.     "EG"??
  109.  
  110.  
  111. /***********/
  112. /*** PSP ***/
  113. /***********/
  114.  
  115. - Cabecera:
  116.  
  117. 0x00    DWORD firma;                //Siempre 0x7E505350 ("~PSP")
  118. 0x04    WORD atributos1;            //1 -> SCE_MODULE_ATTR_CANT_STOP
  119.                                     //2 -> SCE_MODULE_ATTR_LOAD
  120.                                     //4 -> SCE_MODULE_ATTR_START
  121.                                     //8 -> ???
  122. 0x06    WORD atributos2;            //1 -> FLAG_COMPRESS
  123.                                     //2 -> FLAG_NORELOC
  124. 0x08    UBYTE version_modulo_bajo;
  125. 0x09    UBYTE version_modulo_alto;
  126. 0x0A    UBYTE nombre[0x1C];
  127. 0x26    UBYTE version_formato;      //Siempre 1
  128. 0x27    UBYTE   num_segmentos;             
  129. 0x28    DWORD tamanio_elf;          //Tamaño del PRX (.PSP sin cabecera)
  130. 0x2C    DWORD   tamanio_psp;        //Tamaño del DATA.PSP
  131. 0x30    DWORD entrada;              //Entrada al ejecutable
  132. 0x34    DWORD offset_modinfo;       //Los 8 bits más altos se restan a los 24 bajos
  133. 0x38    DWORD tamanio_bss;
  134. 0x3C    WORD alineamiento[4];
  135. 0x44    DWORD direccion[4];
  136. 0x54    DWORD tamanio[4];
  137. 0x64    DWORD desconocido[6];
  138. 0x7C    UBYTE tipo;
  139. 0x7D    UBYTE desconocido[0x33];
  140. 0xB0    DWORD tamanio_elf_comp;       //Tamaño del PRX comprimido
  141. 0xB4    DWORD   desconocido;          //Siempre 0x8000 0000
  142. 0xB8    UBYTE desconocido[0x18];      //Siempre 0
  143. 0xD0    DWORD   id;
  144. 0xD4    UBYTE   desconocido[0x7c];
  145.  
  146. - Datos: muy probablemente el ejecutable comprimido y cifrado.
  147.  
  148. /************/
  149. /*** PSAR ***/
  150. /************/
  151.  
  152. - Tiene el siguiente formato:
  153.        
  154.         - Cabecera
  155.         - Sección A (Cabecera, Datos)
  156.         - Sección A (Cabecera, Datos)
  157.         - Sección B (Cabecera, Datos)
  158.         ... y así alternando A y B
  159.         - Sección A (Cabecera, Datos)
  160.         - Sección B (Cabecera, Datos)
  161.        
  162. - Cabecera:
  163.  
  164. 0x00    DWORD   firma;          //Siempre 0x50534152("PSAR")
  165. 0x04    DWORD   separador;      //Siempre 0x01000000
  166. 0x08    DWORD tamanio;          //Tamaño de los datos (sin contar la cabecera)
  167. 0x0C    DWORD   separador       //Siempre 0x01000000
  168.  
  169. - Cabecera de sección:
  170.  
  171. 0x00    UBYTE desconocido[0xb0];
  172. 0xB0    DWORD   tamanio_datos;          //Tamaño de los datos de la sección
  173. 0xB4    UBYTE   desconocido[4];         //¿Siempre 0x80?
  174. 0xB8    UBYTE desconocido[0x18];        //¿Siempre 0x00?
  175. 0xD0    UBYTE desconocido[4];           //¿Siempre 0x06?
  176. 0xD4    UBYTE desconocido[0xC];
  177. 0xE0    UBYTE desconocido[0x70];
  178.  
  179. - Datos de sección
  180.  
  181.         - El tipo A siempre tiene 0x110 bytes.
  182.         - El tipo B es variable en tamaño.
  183.         - Es probable que se trate de la aplicación a ser instalada por el ejecutable DATA.PSP
  184.