Ps5-dpi-server
ps5-dpi-serveur Un paquet distant autonome installe le démon pour PlayStation 5 changements climatiques · Le nom de l'utilisateur est le suivant:...
Choisir une liste...
ps5-dpi-serveur
Un paquet distant autonome installe le démon pour PlayStation 5
Changements climatiques· 简体中文
Features· Run· HTTP API· Build· Notes· Troubleshooting· Credits
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 port
curl, un script ou tout client HTTP
Exécuter
Exigences
- Une jailbroken PS5 avec lecture/écriture du noyau disponible
- 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
- Exécutez l'exploitation du noyau et démarrez votre chargeur ELF.
- Envoyer
ps5-dpi-server.elf. - Attendez la notification de la console
ps5-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_idetcontent_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 ensceAppInstUtil.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
- 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.
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.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.- 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 comme
400, ou obtenir double-encodé et revenir comme403. - 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. - ETA montre un nombre énorme— il ne devrait pas ; le démon normalise
le sentinelle "inconnue" de console
0. Si vous le voyez, vous exécutez une construction D'avant cette réparation. - Port déjà utilisé— passer un port différent comme premier argument.
- 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.