Se adjunta informacion publicada en su blog:
Spoiler:
MONTAJES:
La PS3 utliza un sistema de montajes muy parecido a lo que podria ser montar una unidad en un entorno Linux.
Lo primero que se indica es el tipo de unidad que vamos a montar, donde se especifica un string de los siguientes:
- CELL_FS_DUMMY: Este tipo de unidad es utilizado en las maquinas Retail para montar una unidad DUMMY (es decir, existe pero no hace nada) en la unidad “/app_home”. Este tipo tambien es utilizado en las maquinas Debug o RefTool en el caso de que arranquemos en el modo Release.
- CELL_FS_HOSTFS: Este tipo de unidad es usado para el montaje de la unidad “/host_root” y “/app_home”.
- CELL_FS_IOS:BDVD_DRIVE: Este tipo de unidad tal y como su nombre indica esta relacionado con la unidad “/dev_bdvd” de una forma generica.
- CELL_FS_IOS:PATA0_HDD_DRIVE: Indica el tipo de unidad para montar la unidad “/dev_hdd0″, este tipo es utilizado en los modelos por ejemplo Phat de 60 Gigas.
- CELL_FS_IOS:PATA0_BDVD_DRIVE: Tipo de unidad que ayuda a montar la unidad “/dev_bdvd”, este tipo es utilizado en los modelos por ejemplo Phat de 60 gigas.
- CELL_FS_IOS:PATA1_HDD_DRIVE: Indica el tipo de unidad para montar la unidad “/dev_hdd0″, este tipo es utilizado en los modelos por ejemplo Phat de 60 Gigas.
- CELL_FS_IOS:PATA1_BDVD_DRIVE: Tipo de unidad que ayuda a montar la unidad “/dev_bdvd”, este tipo es utilizado en los modelos por ejemplo Phat de 60 gigas.
- CELL_FS_IOS:BUILTIN_FLASH: Tipo de unidad que especifica el montado de una unidad flash generica, por ejemplo “/dev_flash”.
- CELL_FS_IOS:COMPACT_FLASH: Unidad de tipo Compact Flash para ayudar al montaje de la unidad “/dev_cf”. Logicamente solo para los modelos que lo soporten internamente.
- CELL_FS_IOS:MEMORY_STICK: Al igual que el anterior ayuda en el montaje de la unidad “/dev_ms”. Al igual que ocurre con la anterior solo si internamente se tiene soporte.
- CELL_FS_IOS:SD_CARD: Unidad de tipo SD_CARD para ayudar al montaje de la uniadd “/dev_sd”. Requiere tener soporte interno.
- CELL_FS_IOS:USB_MASS_STORAGExxx: Tipo de unidad que ayudara a montar las unidades “/dev_usbxxx”. xxx puede ser cualquier valor numerico comenzando desde el 000 para la unidad “/dev_usb000″, etc.
- CELL_FS_IOS:USB_MASS_STORAGE: Lo mismo que la anterior pero para montar una unidad generica “/dev_usb”.
- CELL_FS_IOS:BUILTIN_FLSH1: Tipo de unidad indicado para montar la unidad “/dev_flash” exclusivamente.
- CELL_FS_IOS:BUILTIN_FLSH2: Tipo de unidad indicado para montar la unidad “/dev_flash2″ exclusivamente.
- CELL_FS_IOS:BUILTIN_FLSH3: Tipo de unidad indicado para montar la unidad “/dev_flash3″ exclusivamente.
- CELL_FS_IOS:BUILTIN_FLSH4: Tipo de unidad indicado para montar la unidad “/dev_flash4″ exclusivamente.
- CELL_FS_UTILITY:HDD0: Disco duro HDD0
- CELL_FS_UTILITY:HDD1: Disco duro HDD1
- CELL_FS_UTILITY:HDD2: – Sin informacion -
- CELL_FS_UTILITY:HDD: Disco duro
- CELL_FS_PSEUDO: – Sin informacion -
- CELL_FS_ADMINFS: Para ser usado en el montaje de la unidad “/app_home”.
Lo segundo a indicar es el tipo de sistema de archivos que usaremos en esa unidad, indicado por un string de los siguientes:
- CELL_FS_DUMMYFS: Precisamente un sistema de archivos DUMMY, a ser indicado con el IOS DUMMY visto anteriormente.
- CELL_FS_ADMINFS: Para ser usado con el IOS con el mismo nombre.
- CELL_FS_FAT: Para montar una unidad con el sistema de archivos FAT32.
- CELL_FS_SIMPLEFS: Usado a veces por los discos duros y la flash2. Se utiliza principalmente para chequear si tiene formato la unidad, en este modo se permite el formateo de la unidad.
- CELL_FS_UFS: Para montar las unidades de disco duro, como veremos posteriormente.
- CELL_FS_UDF: Para montar la unidad de disco “/dev_bdvd”.
- CELL_FS_ISO9660: Sirve para montar unidad de disco.
- CELL_FS_EFAT: – Sin informacion -
- CELL_FS_PFAT: – Sin informacion -
Lo tercero a especificar es el nombre de la unidad en un string, este nombre de unidad tiene que ser un nombre de unidad reconocido por el sistema para la unidad que queremos montar.
Puede ser uno de los siguientes:
- /app_home : Unidad para tener un sistema de archivos en un equipo remoto, como un PC. Tambien sirve para entornos de depuracion.
- /host_root: En conjuncion con lo anteriormente citado.
- /dev_bdvd: La unidad de disco BDVD.
- /dev_flash: La unidad flash principal, en donde la mayor parte del firmware esta alojado.
- /dev_flash2: Unidad flash donde se almacena el registro con la configuracion del sistema, por ejemplo.
- /dev_flash3: Tercera unidad flash, con archivos de sistema. Es recomendable hacer backup de ella tambien.
- /dev_flash4: Desconocido, aparece indica en el IOS, pero todavia desconozco si su existencia es real o cual podria ser su verdadero uso o nombre.
- /dev_hdd0: La unidad principal del disco duro interno de la consola, donde por ejemplo estarian las demos, etc.
- /dev_hdd1: Segunda unidad del disco principal, usada principalmente como cache.
- /dev_usb: Unidad generica de usb.
- /dev_usb000 – 127: Unidad usb especificando el puerto a usar por el numero siendo el 0 el puerto de mas a la derecha de los que tenga la maquina. El 1 seria el adyacente hacia la izquierda, y asi danddo la vuelta por todos los numeros.
- /dev_cf: Unidad Compact Flash.
- /dev_sd: Unidad para tarjetas SD.
- /dev_ms: Unidad para las Memory Stick.
Sabiendo esto pasare a explicar los codigos de error que nos podremos encontrar en el caso de un montaje o desmontaje fallido:
- ERROR_KERNEL_ARGUMENTO_INVALIDO: 0×80010002 -> Este error surge cuando especificamos algun argumento a la llamada de la SYSCALL de forma incorrecta o inexistente, por ejemplo un puntero nulo, pero tambien pude ser reportado en el caso de que se envie una combinacion no reconocida o una mala combinacion de parametros al lv2.
- ERROR_KERNEL_DEVICE_BUSY: 0x8001000A -> Este error aparece cuando intentamos desmontar una unidad que todavia tiene algun vinculo activo, por ejemplo un file descriptor, etc.
- ERROR_KERNEL_I/O_ERROR: 0x8001002B -> Aparece cuando NO existe en ese modelo de maquina / firmware un determinado IOS , o cuando pese a ser una combinacion correcta de parametros lo que es la unidad no puede ser encontrada, por ejemplo, un usb insertado en el puerto adecuado, etc.
- ERROR_KERNEL_INVALID_MEMORY: 0x8001000D -> Cuando especificamos un puntero de forma incorrecta o en una region de memoria no permitida.
- ERROR_KERNEL_8001003B: 0x8001003B -> Aparece si se monta mal una unidad bdvd, pero desconozco su significado real.
- ERROR_KERNEL_ILLEGAL_ACTION: 0×80010009 -> Precisamente eso mismo, algun chequeo de seguridad del firmware evita que esa accion se pueda realizar.
- SUCCESS: 0 -> El valor retornado en caso de exito.
Tras estas explicaciones pasamos a ver la SYSCALL que afectan a lo que nos referimos.
DESMONTAJE:
——————————————————————-
Tal y como aparece indicado en el post
Es por ello que usaremos la SYSCALL 838 -> lv2FsUnMount de esta forma:
Por ejemplo, para desmontar la flash principal:
” int ret = lv2FsUnMount(“/dev_flash”);”
La unidad especificada tiene que existir o de lo contrario recibiremos el error de ARGUMENTO_INVALIDO, del mismo modo la unidad tiene que estar libre de estar ocupada, o de lo contrario nos encontraremos con el error DEVICE_BUSY.
Una vez realizada con EXITO esta operacion, la unidad estara desmontada y POR LO TANTO NO ACCESIBLE.
Por ejemplo, para que probeis esta SYSCALL realizar un programa que desmonte la unidad de BDVD, instalarlo en la maquina, y luego introducir en el XMB un juego de PS3, cuando el XMB lo reconozca arrancar vuestra aplicacion y que desmonte la unidad, luego salir de ella, cuando volvais al XMB la unidad de disco sigue apareciendo visible, con el nombre del juego incluso (esto es debido a que el VSH guarda informacion de que estuvo, y su param.sfo), pero si intentais acceder al disco vereis que os devuelve un error de que la unidad no esta montada,
INFORMACION ACERCA DE ‘ALEJANDRO’:
En este punto pasare a explicar como funcionaba ‘Alejandro’ para poder realizar con exito el desmontado de la flash principal.
Como podreis comprobar si realizais un programa que intente desmontar la flash desde el XMB, os encontrareis al final con el error de DEVICE_BUSY. Esto es normal.
Entonces, como desmontaba ‘Alejandro’ la unidad? Realmente ‘Alejandro’ no la desmontaba, lo que hacia era cambiar el nombre en la tabla de montajes de la “/dev_flash”, para que luego el siguiente montado pudiera realizarse.
ADVERTENCIA!: Para el sistema en el caso de que no se arreglase de nuevo el nombre de la unidad a lo que era, al salir al XMB, el sistema pensaria que no existe flash pues para el estaba desmontada. Es por ello que si ‘Alejandro’ fallaba en algun punto del proceso se expecificaba que se apagase la consola con el cable de red o con el interruptor trasero.
Es por ello que si queremos realizar alguna accion con una unidad ya existente, lo primero que tenemos que hacer es desmontarla usando la SYSCALL o sino forzando el “desmontado” en la tabla de montajes.
MONTAJE:
——————————————————————–
Tal y como pone en el post:
En efecto, la SYSCALL clave en este proceso es la SYSCALL 837 -> lv2FsMount.
Para montar la unidad flash usariamos esta sentencia, presumiento que la anterior estuviera desmontada:
“int ret = lv2FsMount(“CELL_FS_IOS:BUILTIN_FLSH1″, “CELL_FS_FAT”, “/dev_flash”, 0, MODO, 0, 0, 0);”
Donde MODO puede ser un valor entre 0 / 1.
Siendo:
- WRITE_PROTECTED: 1
- WRITE_NOT_PROTECTED: 0
Como podemos comprobar aqui NO era ningun exploit ni nada por el estilo como algun usuario se empeño en decir SIN TENER NI IDEA de como funcionaba el programa “Alejandro” y lo que es peor sin ni siquiera saber como funcionaba el sistema interno de la PS3.
Por supuesto pruebas como montar la unidad BDVD con permiso de escritura logicamente fallaran,
Espero que con este post haya quedado algo mas claro el sistema de montajes, accesos y permisos de escritura.
Ahora solo os queda probar con todos ellos, POR SUPUESTO CON EXTREMO CUIDADO, antes de hacer una estupidez pensar las consecuencias.
Las utilidades que tiene esto son infinitas, desde el ejemplo dado con ‘Alejandro’ hasta crear unidades emuladas virtualmente, por ejemplo, de disco, usb (esto lo realiza el sistema), y un largo etc.
FUENTE