Real Time Memory Editor (Retail PS4)

Descripción

Mi principal objetivo en PS4 era desarrollar un sistema que me permitiera editar la memoria de los juegos que se estan ejecutandose en la PS4 con el fin de poder crear modificaciones de los juegos y trampearlos.
Este sistema es muy similar al que antiguamente se usaba en PS3 (ps3tmapi que es el metodo que usan las consolas debug o ccapi, desarrollado por Enstone y que permite editar la memoria de los juegos en consolas retail).
El sistema que hoy os muestro esta basado en la llamada al sistema ptrace y que en la PS4 corresponde a la syscall 26.

El sistema se ejecuta a través de el exploit de WebKit publicado por cTurt y que permite ejecucion aleatoria de codido.
Una vez que conseguimos ejecución de codigo en el sistema, se elevan privilegios con el exploit dlclose descubierto por cTurt y publicado por kR105. Cabe destacar que mientras se esta ejecutando el thread que eleva privilegios hay un momento en el que se activa la escritura directa en memoria que además de ser usada por el exploit también la uso para desactivar el ASLR (Address Space Layout Randomization) que es un metodo que implementan los sistemas operativos modernos para hacer “aleatoria” la zona de memoria donde comienza un proceso cuando se carga en memoria principal, los juegos normalmente se ejecutan a partir de 0x400000 tras desactivar el ASLR. En PS4 este sistema fue implementado a partir de la version 1.70. (Gracias a ZiL0G80).

Tambien se modifica la version del sistema (Spoofing gracias a zecoxao) para evitar que cuando se inicie un juego se evite que este solicite una actualización.
El codigo que se ejecuta en la PS4 se conecta mediante sockets con la direccion 192.168.1.38 por el puerto 4321. En el ordenador tenemos que tener nuestro servidor ejecutandose que será a través del cual enviaremos las ordenes de lectura y escritura de datos.

Funcionamiento

Primero de todo ejecutamos el servidor en el ordenador (Si usais el servidor precompilado teneis que cambiar la direccion de vuestro ordenador a 192.168.1.38 ya que el servidor esta configurado para usar esa, si no podeís recompilar ambos binarios).
Se pondrá a esperar a la solicitud que realizara la consola.
En la PS4 teneis que ir a una web donde este el PS4 Playground y activais la ejecucion de codigo.
Desde el terminal de vuestro Linux ejecutais

nc -w 3 PS4_IP 9023 < Debugger-Payload.bin
        

Vereís que en el servidor hemos obtenido una respuesta.
Ahora hay que introducir el nombre del proceso (juego normalmente) que queremos modificar. Los procesos de casi todos los juegos se suelen llamar “eboot.bin” o como en Call of Duty Ghosts que se llama “default_mp.elf”
Si habeis escrito el nombre de un proceso valido se activara la consola (>)
Podeis escribir “help” para ver los comando posibles.

Comandos:

  • Leer de memoria: r 0xOffset
  • Escribir en memoria: w 0xOffset 0xValor Buscar en adelante: u 0xOffset 0xValor (Busca entre Offset y Offset+0x1000)
  • Buscar antes: d 0xOffset 0xValor (Busca entre Offset y Offset-0x1000)
  • Nuevo proceso: p Nombre_del_Proceso

Aqui os dejo algunos Offsets de Call of Duty Ghosts version 1.00:

Name: 0x1F0F29C
        Principal weapon: 0x1F0C26C
        Secondary weapon: 0x1F0C270
        Enable fps: 0x81B09A Enable: 80 78 10 01
        Primary Ammo: 0x1f0c454
        Primary FullAmmo: 0x1f0c3d4
        Primary Cammo: 0x1F0C26D
        Primary Accesory: 0x1F0C26E
        Secondary Ammo: 0x1f0c460
        Secondary FullAmmo: 0x1f0c3dc
        Tactical Granade Ammo: 0x1f0c43c
        Special Granade Ammo: 0x1f0c448
        

Demo en Call of Duty Ghosts: Video

Importante

Dar las gracias a @TheoryWrong por responder todas esas dudas de principiante.
Esto solamente es una pequeña demo y probablemente tenga bastantes fallos.
Poco a poco quiero ir mejorando el sistema, hacer interfaz gráfica y portarlo a windows con algun programa y alguna libreria para que mas gente desarrolle Tools como las que se hacian para PS3.

Descarga

PS4 Real Time Memory Editor GitHub