Ps5-dpi-server

aydencharles aydencharles
Dépôt créer le : 21/09/2026
Forks: 0 Watcher: 0 4
Choisir une liste...
FR

ps5-dpi-server

ps5-dpi-serveur
Un paquet distant autonome installe le démon pour PlayStation 5

Changements climatiques· 简体中文

Features· Run· HTTP API· Build· Notes· Troubleshooting· Credits

license PlayStation 5 C++ CMake

ps5-dpi-server est une petite charge utile de fond qui transforme la console en un
installer la cible. Il accepte une URL de paquet sur HTTP, la livre au système
installateur, et signale les progrès pendant l'installation. .


Caractéristiques

  • Standalone— un ELF, aucune charge utile et aucun fichier de configuration
  • Installation à distance— accepte une URL de paquet et démarre l'installation sur la console
  • Progrès réels— enquête sur l'installateur du système et expose les octets téléchargés/totals, le pourcentage, ETA, et l'état
  • API RESTful— Paramètres HTTP avec CORS pour l'installation, la progression, la liste des tâches et l'annulation
  • Notifications de la console— soulève une notification PS5 lorsque le démon commence, lorsqu'une installation commence et lorsqu'elle se termine ou échoue
  • Exploitation triple— log du noyau, stdout, et un fichier local rotatif
  • HTTP seulement— un protocole, un portcurl, un script ou tout client HTTP

Exécuter

Exigences

  1. Une jailbroken PS5 avec lecture/écriture du noyau disponible
  2. Un chargeur ELF sur votre hôte d'exploitation, pour envoyer la charge utile

Le démon essaie d'élever son propre processus authid au démarrage, ce qui est chemin d'installation du système attend. Cette étape nécessite une lecture/écriture du noyau. L'échec n'est pas fatal — le démon enregistre un avertissement et continue de fonctionner — chargez la charge utile après l'exploitation du noyau est en place, et vérifier le journal pour l'authid en fait si l'installation se comporte mal.

Chargez le démon

  1. Exécutez l'exploitation du noyau et démarrez votre chargeur ELF.
  2. Envoyerps5-dpi-server.elf.
  3. Attendez la notification de la consoleps5-dpi-server listening on port 9040.

Le port d'écoute par défaut à9040et peut être dépassé par un seul argumentation :

ps5-dpi-server.elf 9041

Le démon n'a pas de commande distante. Il court jusqu'à ce que la charge utile soit tuée ou la console redémarre.

Registres

Le démon écrit à trois endroits à la fois:

Destination Remarques - Oui. Log du noyau PS5 visible grâce à votre outil klog habituel Sensible lorsque la charge utile est lancée Autres/system_tmp/ps5-dpi-server.logRécipient à.log.1une fois passé 512 KB

Les 128 derniers KB du fichier journal local sont également lisibles sur HTTP — voir GET /api/logsci-dessous. C'est la meilleure façon de lire les journaux quand rien n'est attaché à la console.


API HTTP

Tous les paramètres sont en direct sur le port9040. Les réponses sont JSON avec uncodechamp, où0signifie le succès. Chaque réponse porte Access-Control-Allow-Origin: *, donc une page de navigateur sur une autre origine peut appeler le démon directement;OPTIONSrépond par204 No Content.

Le démon ne parle HTTP que. Une connexion qui ne commence pas avec un HTTP la ligne de requête est rejetée avec HTTP400plutôt que d'être interprété comme autre chose :

{
  "code": 400,
  "message": "HTTP requests only; the legacy raw TCP interface has been removed"
}

GET /health·GET /api/version

Sonde de vie et version de construction.

curl -X GET http://PS5_IP:9040/health
{
  "code": 0,
  "data": {
    "status": "ok",
    "service": "ps5-dpi-server",
    "version": "0.4.0"
  }
}

POST /api/install

Démarrer une installation à partir d'une URL de paquet.urlest nécessaire; le reste est facultatif.

Organisme de demande(application/json) :

Type de champ requis Description - Oui. AutresurlChaîne de caractères , oui , Paquet URL la console récupère. Doit être une adresse que la console peut atteindre Autrescontent_idTranscription de la chaîne de caractères Autrescontent_nameAfficher le nom de la notification de console AutrestitleChaîne de caractèrescontent_name, utilisé lorsquecontent_nameest vide autresicon_urlChaîne de caractères # URL de l'image de couverture pour l'interface utilisateur d'installation

curl -X POST http://PS5_IP:9040/api/install \
  -H "Content-Type: application/json" \
  -d '{
    "url": "http://192.168.1.100:8080/game.pkg",
    "content_id": "EP0001-PPSA01234_00-0000000000000000",
    "content_name": "Game Title",
    "icon_url": "http://192.168.1.100:8080/game.png"
  }'

Réponse— toujours HTTP200, avec le code de retour de l'installateur danscode:

{
  "code": 0,
  "message": "success",
  "data": {
    "task_id": "EP0001-PPSA01234_00-0000000000000000",
    "content_id": "EP0001-PPSA01234_00-0000000000000000",
    "status": "initiated"
  }
}

Un disparuurlest le seul cas qui répond à HTTP400:

{
  "code": 400,
  "message": "missing 'url' parameter in json body"
}

Notes sur les paramètres:

  • url— la console fait la récupération, donc ceci doit être une adresse console peut route vers.127.0.0.1ne fonctionnera pas, et l'URL devrait porter non pourcentage d'évasions (voirTroubleshooting).
  • content_id— laisse tomber à moins que tu ne sois certain. L'installateur lit l'identifiant de contenu réel à partir de l'en-tête du paquet et le rapporte; si votre devine En désaccord avec le paquetage, l'installation est rejetée.task_idet content_iddans la réponse sont l'ID la console assignée.
  • content_name— montré dans la notification de la console. Retour àtitle, puis vers l'URL.
  • icon_url— image de couverture optionnelle pour l'interface utilisateur d'installation.

GET /api/status

Interroger la tâche active, ou une tâche spécifique parcontent_id/task_id. Les deux sont lus à partir de la chaîne de requête.

curl -X GET "http://PS5_IP:9040/api/status?content_id=EP0001-PPSA01234_00-0000000000000000"
{
  "code": 0,
  "data": {
    "task_id": "EP0001-PPSA01234_00-0000000000000000",
    "content_id": "EP0001-PPSA01234_00-0000000000000000",
    "content_name": "Game Title",
    "icon_url": "http://192.168.1.100:8080/game.png",
    "url": "http://192.168.1.100:8080/game.pkg",
    "state": "transferring",
    "status": "transferring",
    "src_type": "http",
    "downloaded_bytes": 10737418240,
    "total_bytes": 42949672960,
    "progress_percent": 25.00,
    "remain_time_seconds": 320,
    "promote_progress": 0,
    "error_code": 0,
    "error_desc": "",
    "is_active": true,
    "created_at": 1700000000,
    "updated_at": 1700000010
  }
}

Sans paramètres de requête, il retourne la tâche actuellement active. Quand rien correspond, il répond HTTP404:

{
  "code": 404,
  "message": "no active or matching install task found"
}

stateest la propre vue du démon et passe à traverspending→triggered→ transferring→promoting→completedou se termine àerror/cancelled. .statusest la chaîne brute rapportée par la consolesrc_typeest le protocole de transfert utilisé.

remain_time_secondsest0alors que la console n'a pas encore d'estimation utilisable — traiter 0comme "inconnu", pas comme "finissant maintenant".progress_percentest dérivé de downloaded_bytes / total_byteset est serré à100.

GET /api/tasks

Énumérez chaque tâche que le démon connaît dans cette session.

curl -X GET http://PS5_IP:9040/api/tasks
{
  "code": 0,
  "data": [
    { "task_id": "EP0001-PPSA01234_00-0000000000000000", "state": "completed", "...": "..." }
  ]
}

Chaque élément utilise la même forme d'objet queGET /api/status. Une liste vide est {"code":0,"data":[]}.

POST /api/cancel

Annuler une installation.content_idest accepté dans le corps JSON ou comme une requête paramètre;task_idest accepté dans le corps. Avec aucun, il annule la une tâche active.

curl -X POST http://PS5_IP:9040/api/cancel \
  -H "Content-Type: application/json" \
  -d '{"content_id": "EP0001-PPSA01234_00-0000000000000000"}'
{
  "code": 0,
  "message": "cancelled successfully"
}

En cas de défaillancecodeporte l'erreur d'installation etmessageest "cancel failed".

GET /api/logs·GET /logs

Retourne la queue de/system_tmp/ps5-dpi-server.logcomme text/plain; charset=utf-8, plafonné aux 128 derniers KB. Utile pour lire les journaux sur le réseau lorsque la console est sans tête.

curl -X GET http://PS5_IP:9040/api/logs

Construire

Dépendances

Dépendance - Oui. AutresPS5 Payload SDKProspero compilateur, en-têtes cibles, runtime et CMake toolchain CMake 3.10+.Configurer et construire la charge utile

Construire

Pointez le script à votre SDK, ou laissez-le revenir à~/sdk/ps5-payload-sdk:

export PS5_PAYLOAD_SDK=/path/to/ps5-payload-sdk
./build.sh

build.shrésout le SDK dans cet ordre —PS5_PAYLOAD_SDK,PS5_SDK, ,PROSPERO_SDK,~/sdk/ps5-payload-sdk,/opt/ps5-payload-sdk— alors configure avec la chaîne d'outils Prospero, construit et imprime l'ELF résultant.

À la main :

cmake -B build -DCMAKE_TOOLCHAIN_FILE=/path/to/ps5-payload-sdk/toolchain/prospero.cmake
cmake --build build

Produit

Description du chemin - Oui. Autresbuild/ps5-dpi-server.elfLa charge utile que vous envoyez à la console

Tout atterritbuild/. Il n'y a pas de répertoire de mise en scène séparé — envoyer build/ps5-dpi-server.elfdirectement.

Construire des drapeaux

CMakeLists.txtépingles-O0 -DDEBUGsur le but, donc un rapport d'accident source. Une marqueReleasebuild type annexes-O3 -DNDEBUG aprèsces drapeaux et les outrepasse silencieusementbuild.shpar défaut pour un type de construction vide. Surpasser avecBUILD_TYPE=Release ./build.shseulement si vous voulez vraiment-O3.

-fstack-protector-allest délibéré — voirTechnical notes.


Mise en page du répertoire

.
├── source/
│   ├── main.cpp             Entry point, port selection, log setup
│   ├── http_server.cpp      HTTP server and all routes
│   ├── task_manager.cpp     Install calls, polling, task registry
│   ├── privilege.cpp        Process authid handling
│   ├── logger.cpp           klog + stdout + rotating file
│   ├── notify.cpp           Console notification popups
│   ├── json_utils.h         Minimal JSON reading and escaping
│   └── sceAppInstUtil.h     System installer ABI declarations
├── build.sh                 SDK discovery, configure, build
├── CMakeLists.txt           Target, sources, flags, linked system libraries
└── build/                   Generated build tree (ignored)

Notes techniques

Le démon parle à l'installateur du système à travers une poignée de structures dont mise en page est un contrat ABI dur. Se tromper ne manque pas de compiler — il corrompt la mémoire à l'exécution. Deux d'entre eux nous ont mordus, donc les deux sont maintenant épinglés:

  • MetaInfodoit être de 56 octets. Les deux qui suiventuint32les champs sont lus inconditionnellement par l'installateur même quand PlayGo est inutilisé, donc un plus court struct le fait lire après la fin. Cinqstatic_asserts en sceAppInstUtil.hépingler chaque taille et compenser ce qui compte.
  • La structure d'état d'installationest documenté comme 600 octets, mais la console écrit 112 octets passé que — il est vraiment 712 octets. Plutôt que de deviner où ces octets appartiennent, le démon garde la disposition documentée, met le tampon et lui donne une queue de 4 KB empoisonnée. N'importe quelle terre envahie dans notre propre la mémoire au lieu d'un canari de pile, et le démon enregistre jusqu'où il est allé.

Les deux sont longuement commentés ensource/sceAppInstUtil.h. Si vous changez struct, lesstatic_asserts vous le dira avant la console.

Deux détails connexes valent la peine de savoir si vous touchez le code de filetage:

  • Le fil du moniteur obtient un explicite1 pile MB, parce que l'installation les structures sont grandes et la pile par défaut n'était pas suffisante.
  • -fstack-protector-allest tenu exprès. C'est ce qui a fait surface. struct overrun au lieu de lui laisser en silence corrompre la mémoire adjacente. Ne pas Enlevez-le pour faire disparaître un crash.

Dépannage

  1. Aucune notification au chargement— la charge utile n'a pas commencé. Vérifiez que le ELF chargeur accepté, et que l'exploitation du noyau est déjà en place.
  2. nc PS5_IP 9040n'installe rien— l'ancienne interface TCP brute était enlevé volontairement; le démon répond maintenant400à tout ce qui n'est pas un Demande HTTP. UtilisationPOST /api/install.
  3. 0x80B2116Fde/api/install— l'installateur a rejeté la demande avant de créer une tâche. Si cela revient bien sous une seconde, la console jamais essayé de récupérer quoi que ce soit, alors regardez les paramètres de requête plutôt que à l'accessibilité de l'URL. Le démon enregistre l'authid qu'il détient, alors vérifiez la réussite de l'escalade.
  4. Installer commence mais ne progresse jamais— la console n'a pas pu atteindre URL du paquet. Rappelez-vous que la console est le client : utilisez une adresse qu'elle peut parcourir à, pas loopback, et vérifier que l'URL ne porte pas de pourcentage d'évasion — le installateur réencode le chemin, de sorte qu'un nom échappé peut se transformer en un espace nu et revenir comme400, ou obtenir double-encodé et revenir comme403.
  5. Les progrès s'arrêtent à un certain pourcentage— lire/api/logs; les enregistrements du démon le code d'erreur et la description de l'installateur danserror_code/error_descquand la console signale une défaillance.
  6. ETA montre un nombre énorme— il ne devrait pas ; le démon normalise le sentinelle "inconnue" de console0. Si vous le voyez, vous exécutez une construction D'avant cette réparation.
  7. Port déjà utilisé— passer un port différent comme premier argument.
  8. Lors de la déclaration d'un problème, inclure firmware, exploiter hôte, version SDK, la demande complète, et l'extrait de journal pertinent.

Crédits

Sur la base

  • ps5-ezremote-dpi— cy33hc; charge utile en amont ce projet est une fourche de. Le démon original et son install flow vient de là. Cette fourche conserve le même port par défaut, et ajoute l'API HTTP, le registre des tâches avec le vote en direct, le privilège et les corrections ABI décrites ci-dessus. Notez que l'interface de l'amont estpasreporté: cette fourche ne parle HTTP que, donc un client qui installe en passant une URL nue dans le port 9040 doit se déplacer àPOST /api/install.

Construit avec

  • PS5 Payload SDK— Prospéro chaîne d'outils, en-têtes cibles, et l'exécution.

Licence

Ce projet est autorisé en vertu de laGNU General Public License v3.0, hérité du projet en amont. Composantes tierces les licences et avis respectifs.

C'est un projet de homebrew non officiel et n'est pas affilié à Sony Divertissement interactif. Utilisez-le seulement sur le matériel que vous possédez et à votre propre risque. Aucune garantie n'est fournie.

Contributeurs GitHub

cy33hc
cy33hc
12 contributions
aydencharles
aydencharles
4 contributions