Skip to content

Commit 137f065

Browse files
committed
feat(release): v0.4.0 - extended firmware support to 7.00-12.70
This release expands coverage from 1.00-5.50 + 9.00-12.00 to 1.00-5.50 + 7.00-12.70, integrates the P2JB chain for newer firmwares on a forked slopkit, adds a dedicated live progress UI for the long-running P2JB exploit, and improves autoload reliability. Key highlights: - **Extended Firmware Support (7.00-12.70)**: - Expanded poops to 7.00-8.60 (now 7.00-12.00) and integrated P2JB for 12.02-12.70 (hour-long chain), alongside existing umtx2 (1.00-5.50) with automatic firmware detection. - Forked slopkit to itsPLK/slopkit to include P2JB and future fixes; unified FORCE_EXPLOIT routing (auto | umtx2 | poops | p2jb). - Updated kexp handling to use our forked binary that receives offsets via an API table instead of binary-patching the kexp on the fly. - **Already-Jailbroken Shortcut (7.00-12.70)**: - If already jailbroken, launching the autoloader shortcut skips the kernel exploit and directly autoloads (Payload Manager or autoload.txt), so no reboot is required after the initial autoloader install to load your payloads — especially useful for P2JB after an initial install using the PC host to avoid waiting through the hour-long chain a second time. - **P2JB Live Progress & Autoload Reliability**: - New live statistics panel for P2JB showing phase and overall progress with ETA and worker status. - Autoload now polls for elfldr readiness on port 9021 instead of a fixed delay, for both fresh and already-jailbroken paths. - **Docs & Maintenance**: - Credits to soniciso1 for 7.00-8.60 and P2JB bring-up. - Build tooling updated for the new kexp naming and dual slopkit payloads; patch verification covers both chains.
1 parent 3e9b02d commit 137f065

18 files changed

Lines changed: 1144 additions & 135 deletions

.github/screenshots/p2jb_ui.jpeg

551 KB
Loading
603 KB
Loading
572 KB
Loading

.gitmodules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
url = https://github.com/itsPLK/ps5-unified-autoloader.git
44
[submodule "third_party/slopkit"]
55
path = third_party/slopkit
6-
url = https://github.com/jordyidk/slopkit.git
6+
url = https://github.com/itsPLK/slopkit.git
77
[submodule "third_party/umtx2"]
88
path = third_party/umtx2
99
url = https://github.com/idlesauce/umtx2.git

ARCHITECTURE.md

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
# PS5 WebKit Autoloader: Architecture
22

33
A persistent entry point for PS5 payloads that runs a WebKit/kernel exploit chain
4-
and autoloads your payloads fully offline. Two exploit chains are bundled and
4+
and autoloads your payloads fully offline. Three exploit chains are bundled and
55
selected by firmware:
66

7-
- **umtx2** (FW **1.00–5.50**) — idlesauce's umtx2 exploit.
8-
- **slopkit** (FW **9.00–12.00**) — the slopkit exploit chain.
7+
- **umtx2** (FW 1.00–5.50) — idlesauce umtx2 chain (`umtx2/`).
8+
- **poops** (FW 7.00–12.00) — slopkit poops chain (`slopkit/poops.html`).
9+
- **p2jb** (FW 12.02–12.70) — slopkit P2JB chain (`slopkit/p2jb.html`). Takes ~1 hour.
910

10-
Both converge on the same result: a `WKAL00001` homescreen app that runs the
11+
All three converge on the same result: a `WKAL00001` homescreen app that runs the
1112
exploit, boots elfldr, and autoloads your payload through it.
1213

1314
## Repository layout
@@ -40,26 +41,30 @@ instead of the unified-autoloader — so this flow installs the homescreen app.
4041
## Frontend (`frontend/autoloader/`)
4142

4243
- A splash screen, a log terminal and a progress bar. The exploit runs in a **hidden**
43-
same-origin iframe. On load, `app.js` picks the chain from the firmware in the
44-
user-agent (`PlayStation 5/x.xx`): **umtx2** (`umtx2/index.html?autoload=payload.elf`)
45-
for 1.00–5.50, **slopkit** (`slopkit/slopkit/poops.html?go=1&auto=1&...`) for 9.00–12.00.
46-
Firmware outside both ranges shows a clean error and never arms the iframe.
47-
- A `FORCE_EXPLOIT` build-time override (or a `?force=` query) bypasses the table so a
48-
specific chain can be exercised on any firmware for testing; the exploit's own
49-
firmware guard still applies.
44+
same-origin iframe. On load, `app.js` picks the chain from the firmware in
45+
the user-agent (`PlayStation 5/x.xx`): **umtx2** for 1.00–5.50, **poops** for 7.00–12.00,
46+
and **p2jb** for 12.02–12.70.
47+
- A `FORCE_EXPLOIT` build-time override (`auto | umtx2 | poops | p2jb`; or a `?force=`
48+
query) bypasses the table so a specific chain can be exercised on any firmware; the
49+
exploit's own firmware guard still applies.
5050
- umtx2 auto-runs its chain via the `on_load_autorun` sessionStorage key (set by
51-
`app.js` before arming); slopkit runs via its `?go=1&auto=1` query.
51+
`app.js` before arming); poops and p2jb run via their `?go=1&auto=1` query.
5252
- On `window.load` the iframe is armed; at script parse it is blanked to `about:blank` so a
5353
WebProcess-crash page restore never auto-runs the chain. Before arming, `clearSlopkitState()`
54-
removes slopkit's one-shot latch and "stopped at …" markers from sessionStorage so every
55-
launch restarts the full ladder.
56-
- `app.js` mirrors the chain's screen/stage/early/summary into the log (errors, stage changes
57-
and summary verdicts) and receives the `?autoload` result via `postMessage`.
54+
removes the slopkit one-shot latch and "stopped at …" markers from sessionStorage (shared
55+
`slopkit-poops:*` keys used by both chains) so every launch restarts the full chain.
56+
- `app.js` mirrors each chain's screen/stage/early/summary into the log (errors, stage changes
57+
and summary verdicts) and receives the `?autoload` result via `postMessage`. For p2jb it
58+
additionally parses the exploit's pinned `#livestat` readout (upstream repaints it at 1 Hz)
59+
and renders a dedicated statistics panel (`#p2jbStats`) below the log with phase and overall
60+
progress bars, clocks, and live worker metrics. While visible, the panel replaces the slim
61+
progress bar and collapses once the payload is sent. All DOM updates are change-guarded and
62+
polling synchronizes with upstream's 1 Hz ticker so UI updates do not contend with exploit execution.
5863

5964
`payload.elf` is a virtual name: the PC host serves the installer ELF there, the homescreen app
60-
serves the real unified-autoloader. Both exploits autoload the same `payload.elf`. umtx2 (FW
65+
serves the real unified-autoloader. All exploits autoload the same `payload.elf`. umtx2 (FW
6166
1.00–5.50) boots its **own bundled elfldr** (`/app/<version>/umtx2/payloads/elfldr-ps5.elf`, kept
62-
from the umtx2 submodule like stock umtx2); slopkit (9.00–12.00) boots the **shared elfldr**
67+
from the umtx2 submodule like stock umtx2); poops and p2jb (7.00–12.70) boot the **shared elfldr**
6368
(`/app/<version>/shared/elfldr-ps5.elf`).
6469

6570
## Native installer (`src/`)
@@ -121,7 +126,8 @@ dev server.
121126
staging handoff (`dist/VERSION`), writes the `__complete__` marker, substitutes the tokens
122127
in the pointer page and the app's versioned `index.html`, lists the pointer and marker LAST
123128
in the manifest, and replaces the `[[EXPLOIT_MODE]]` token in `app.js` from the
124-
`FORCE_EXPLOIT` env (default `auto`). Unused exploit payloads and assets are filtered out.
129+
`FORCE_EXPLOIT` env (`auto | umtx2 | poops | p2jb`, default `auto`). Unused exploit payloads
130+
and assets are filtered out.
125131
- `build_release.sh` builds the ELF in a Dockerized SDK and the host script; CI
126132
(`.github/workflows/release.yml`) produces the versioned artifacts and the Windows `.exe`.
127133
`FORCE_EXPLOIT` is forwarded into the Docker build explicitly.
@@ -130,19 +136,24 @@ dev server.
130136

131137
`slopkit` is a pinned, **pristine** submodule. The build copies it to the gitignored
132138
`frontend/autoloader/slopkit/` and applies `patches/slopkit-autoload.patch` there
133-
(`tools/apply_slopkit_patch.sh`, run automatically by the Makefile).
139+
(`tools/apply_slopkit_patch.sh`, run automatically by the Makefile). Its bundled `payloads/`
140+
dir is embedded as-is apart from the unused `.elf` files it ships — the registry/host filters
141+
keep only `kexp*.bin` from it, so bumping the submodule never requires script changes.
134142

135-
The patch (in `slopkit/slopkit/poops.html` and `slopkit/slopkit/poops.js`):
143+
The patch (in `slopkit/slopkit/poops.html`, `poops.js` and `p2jb.html`):
136144

137145
- `?autoload=<name>`: after the chain finishes and elfldr is up, sends the named payload from
138-
`../../payloads/`. Upstream's `exactQuery()` (which refuses non-canonical URLs) is relaxed to
139-
tolerate the extra `autoload` query key, and the iframe URL is the canonical production query
140-
(`go=1&auto=1&production=1&trigger=netcontrol&attempts=8&only=<full ladder>&log=debug&payload=1`)
141-
plus `autoload=payload.elf&v=final`.
142-
- A hidden `payload.elf` entry in slopkit's `PAYLOADS` list so `payloadIsListed()` accepts it.
143-
- Posts `{type:"wkal", kind:"autoload", ok, bytes}` to the parent page.
144-
- Loads the **shared elfldr** from `../../shared/elfldr-ps5.elf` instead of its bundled copy
145-
(the kexp shellcode stays slopkit's own — it is firmware-specific).
146+
`../../payloads/`. Upstream's `exactQuery()` (which refuses non-canonical URLs) is relaxed in
147+
both pages to tolerate the extra `autoload` query key. The iframe URLs are the canonical
148+
production queries — poops (`go=1&auto=1&production=1&trigger=netcontrol&attempts=8&only=<full
149+
ladder>&log=debug&payload=1`) plus `autoload=payload.elf&v=final`, p2jb
150+
(`go=1&auto=1&production=1&log=debug&payload=1`) plus the same autoload suffix.
151+
- A hidden `payload.elf` entry in each page's `PAYLOADS` list so `payloadIsListed()` accepts it.
152+
- Posts `{type:"wkal", kind:"autoload", ok, bytes}` (or `{ok:false, why}`) to the parent page —
153+
poops from the end of its ladder, p2jb from its `showWin()` win handler after a 4 s wait for
154+
elfldr to bind port 9021.
155+
- Loads the **shared elfldr** instead of the bundled copies: poops fetches
156+
`../../shared/elfldr-ps5.elf` in `poops.js`, and p2jb's `P2JB_ELF_URL` points at the same file.
146157

147158
To update slopkit: `git -C third_party/slopkit fetch && git -C third_party/slopkit checkout <commit>`,
148159
re-run the script, and regenerate the patch if it no longer applies
@@ -180,12 +191,11 @@ re-run the script, and regenerate `patches/umtx2-autoload.patch` if it no longer
180191

181192
## Shared elfldr
182193

183-
slopkit boots the **shared** elfldr, served at `/app/<version>/shared/elfldr-ps5.elf` (staged
184-
from `frontend/autoloader/shared/`). `tools/download_deps.sh` fetches it from the pinned
194+
Both slopkit chains boot the **shared** elfldr, served at `/app/<version>/shared/elfldr-ps5.elf`
195+
(staged from `frontend/autoloader/shared/`). `tools/download_deps.sh` fetches it from the pinned
185196
`itsPLK/ps5-elfldr` release (tag `ELFLDR_TAG`), sha256-verifies it, and caches the digest in a
186197
`.sha256` sidecar so offline rebuilds work. umtx2 (FW 1.00–5.50) boots its **own** elfldr from
187-
the umtx2 submodule instead, matching stock umtx2 behavior. Future shared chain binaries
188-
(e.g. a kexp) can live in the versioned `/app/<version>/shared/` dir too.
198+
the umtx2 submodule instead, matching stock umtx2 behavior.
189199

190200
## Payload dependency
191201

README.md

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
</p>
44
<h1 align="center">PS5 WebKit Autoloader</h1>
55
&nbsp;
6-
<p align="center">Automatically loads the WebKit exploit and your elf payloads.<br>Supports firmwares <b>1.00&ndash;5.50</b> and <b>9.00&ndash;12.00</b>.</p>
6+
<p align="center">Automatically loads the WebKit exploit and your elf payloads.<br>Supports firmwares <b>1.00&ndash;5.50</b> and <b>7.00&ndash;12.70</b>.</p>
77

8-
> [!NOTE]
9-
> Uses the [umtx2](https://github.com/idlesauce/umtx2) (FW 1.00–5.50) and [slopkit](https://github.com/jordyidk/slopkit) (FW 9.00–12.00) WebKit exploits under the hood with minimal changes (via patch files in `patches/`), so stability should match the originals.
8+
<p align="center">
9+
<a href=".github/screenshots/webkit_autoloader.jpeg"><img src=".github/screenshots/webkit_autoloader.jpeg" width="260" alt="WebKit Autoloader - exploit running" /></a>
10+
<a href=".github/screenshots/webkit_autoloader_installer.jpeg"><img src=".github/screenshots/webkit_autoloader_installer.jpeg" width="260" alt="Installer" /></a>
11+
<a href=".github/screenshots/p2jb_ui.jpeg"><img src=".github/screenshots/p2jb_ui.jpeg" width="260" alt="P2JB live progress" /></a>
12+
</p>
1013

1114
<p align="center">
1215
<b>Other Autoloaders:</b><br>
@@ -43,7 +46,7 @@ If you aren't jailbroken yet, you'll need to host the exploit locally on your PC
4346
1. Download `webkit-autoloader-host.py` (or the `.exe`) from the [Releases](https://github.com/itsPLK/ps5-webkit-autoloader/releases) and run it on a PC on your network.
4447
2. On your PS5, set your network's DNS server to your PC's IP address.
4548
3. Open the **User's Guide** from Settings to run the installer, which adds the **WebKit Autoloader** app to your homescreen.
46-
4. **Reboot once**, then launch **WebKit Autoloader** from the homescreen.
49+
4. Launch **WebKit Autoloader** from the homescreen.
4750

4851
## How to Use
4952

@@ -87,7 +90,7 @@ The latest installer payload will re-create the homescreen app and refresh the c
8790
<Details>
8891
<Summary><i>How to use a custom ELF Loader?</i></Summary>
8992

90-
On firmwares 9.00–12.00 (slopkit), the autoloader uses a custom version of **elfldr** that only accepts connections from the PS5 itself (localhost). This improves security by preventing unauthorized devices on your network from sending payloads to your console. On firmwares 1.00–5.50 (umtx2), the stock elfldr is booted.
93+
On firmwares 7.00–12.70 (slopkit: poops and p2jb), the autoloader uses a custom version of **elfldr** that only accepts connections from the PS5 itself (localhost). This improves security by preventing unauthorized devices on your network from sending payloads to your console. On firmwares 1.00–5.50 (umtx2), the stock elfldr is booted.
9194

9295
If you want to use a "normal" ELF Loader that allows sending payloads from any device, you can simply load it through **Payload Manager**.
9396

@@ -115,8 +118,9 @@ The technical internals and project architecture are documented in **[ARCHITECTU
115118

116119
## Credits
117120

118-
* **[idlesauce](https://github.com/idlesauce)** & contributors — [umtx2](https://github.com/idlesauce/umtx2), the WebKit/kernel exploit chain used for firmware 1.00–5.50.
119-
* **[jordyidk](https://github.com/jordyidk)** & contributors — [slopkit](https://github.com/jordyidk/slopkit), the WebKit/kernel exploit chain used for firmware 9.00–12.00.
121+
* **[idlesauce](https://github.com/idlesauce)** & contributors — [umtx2](https://github.com/idlesauce/umtx2)
122+
* **[jordyidk](https://github.com/jordyidk)** & contributors — [slopkit](https://github.com/jordyidk/slopkit)
123+
* **[soniciso1](https://github.com/soniciso1)**[pooP2JB](https://github.com/soniciso1/pooP2JB)
120124
* **[john-tornblom](https://github.com/john-tornblom)**[ps5-payload-sdk](https://github.com/ps5-payload-dev/sdk/) and [elfldr](https://github.com/ps5-payload-dev/elfldr)
121125
* **[Mark Adler](https://github.com/madler)**[puff.c](https://github.com/madler/zlib/tree/master/contrib/puff) (used to decompress embedded frontend files)
122126
* Everyone else contributing to the PS5 homebrew scene.

0 commit comments

Comments
 (0)