Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,7 @@ _UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
*.vshost.* #ignore vshost files...

# Python (tools/)
__pycache__/
*.pyc
Binary file modified Latest Compiled Version/PS3DumpChecker.exe
Binary file not shown.
2 changes: 1 addition & 1 deletion Latest Compiled Version/PS3DumpChecker.exe.md5
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0CAC8E2164D7AF81CEBB66ECEEBFB697
486A0D9A65E3E02409300E2DC2FDA409
2 changes: 1 addition & 1 deletion Latest Compiled Version/PS3DumpChecker.exe.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.0.505.0
1.0.506.0
4 changes: 4 additions & 0 deletions Latest Compiled Version/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
Build 506 2026-08-27:
- Changed: The embedded 4.92 patch replaced by a 4.93 patch built from Evilnat's 4.93 custom firmware CoreOS.
- Added: OFW and Patched 4.93 ROS hashes.
- Added: tools/ to decrypt CoreOS from a PUP, build ROS hashes, and validate the data files.
Build 505 2025-03-07:
- Changed: The embedded 4.91 patch replaced by a 4.92 patch built from Evilnat's 4.92 custom firmware CoreOS.
- Added: OFW and Patched 4.92 ROS hashes.
Expand Down
6 changes: 6 additions & 0 deletions Latest Compiled Version/default.hashlist
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
<offset fsize="268435456" type="ROS" name="009.05 ROS1 Hash" size="6FFFE0">7C0020</offset>
</offsets>
<type name="ROS">
<hash name="4.93 CEX Patched (Evilnat based)" size="6FFFE0" patched="true">
505788E2430D1573D925E713EA58CA23
</hash>
<hash name="4.93 CEX" size="6FFFE0">
7C54192073537CD1C448971547086423
</hash>
<hash name="4.92 CEX Patched (Evilnat based)" size="6FFFE0" patched="true">
36BD44795F06B59EECBDAAD6982BE426
</hash>
Expand Down
2 changes: 1 addition & 1 deletion Latest Compiled Version/default.hashlist.md5
Original file line number Diff line number Diff line change
@@ -1 +1 @@
81CD7ECFF0F7AF98158F1BD2CE61C8DD
3DB50FC7A2EE7F244F429A09212B158C
Binary file modified src/PS3DumpChecker/Patches/patch.bin
Binary file not shown.
2 changes: 1 addition & 1 deletion src/PS3DumpChecker/Patches/patch_info.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
noFSM 4.92 (Evilnat based)
noFSM 4.93 (Evilnat based)
4 changes: 2 additions & 2 deletions src/PS3DumpChecker/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,5 @@
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]

[assembly: AssemblyVersion("1.0.505.0")]
[assembly: AssemblyFileVersion("1.0.505.0")]
[assembly: AssemblyVersion("1.0.506.0")]
[assembly: AssemblyFileVersion("1.0.506.0")]
6 changes: 6 additions & 0 deletions src/PS3DumpChecker/hashlist.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
<offset fsize="268435456" type="ROS" name="009.05 ROS1 Hash" size="6FFFE0">7C0020</offset>
</offsets>
<type name="ROS">
<hash name="4.93 CEX Patched (Evilnat based)" size="6FFFE0" patched="true">
505788E2430D1573D925E713EA58CA23
</hash>
<hash name="4.93 CEX" size="6FFFE0">
7C54192073537CD1C448971547086423
</hash>
<hash name="4.92 CEX Patched (Evilnat based)" size="6FFFE0" patched="true">
36BD44795F06B59EECBDAAD6982BE426
</hash>
Expand Down
103 changes: 103 additions & 0 deletions tools/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# tools

Helpers for adding support for a new PS3 firmware release.

Adding a firmware has always been a manual process: unpack two PUPs, decrypt
the CoreOS out of each, MD5 the ROS region, hand-edit `hashlist.xml`, and drop
the new payload in as `patch.bin`. These scripts cover the parts that can be
checked by a machine, so a typo in a hex digit fails here instead of on a
user's dump.

Python 3. No third-party packages.

## ros_hash.py

Computes the ROS MD5 that `hashlist.xml` stores, and prints the XML entries
ready to paste.

```
python tools/ros_hash.py ofw_content cfw_content --version 4.93
python tools/ros_hash.py content --name "4.93 CEX"
python tools/ros_hash.py content --name "4.93 CEX Patched (Evilnat based)" --patched
```

Input is a *decrypted* CoreOS payload -- the `content` file from an unpacked
`CORE_OS_PACKAGE.pkg`, not the `.pkg` itself and not the PUP. It is the same
7,340,000-byte blob that ships as `Patches/patch.bin`.

The hash is the MD5 of the first `0x6FFFE0` bytes, matching
`HashCheck.CheckHash`. The byte-swapped MD5 is printed alongside it: NOR dumps
store the region swapped and NAND dumps do not, so seeing both makes a
mismatch obvious rather than silent.

Sanity check -- this reproduces the 4.92 entry already in `hashlist.xml`:

```
$ python tools/ros_hash.py src/PS3DumpChecker/Patches/patch.bin \
--name "4.92 CEX Patched (Evilnat based)" --patched
MD5 : 36BD44795F06B59EECBDAAD6982BE426
```

## validate_data.py

Checks `hashlist.xml` and `config.xml` before they ship. Run it after editing
either file.

```
python tools/validate_data.py
```

Catches duplicate MD5s, duplicate entry names, malformed hashes, non-hex size
and offset attributes, bad `patched` values, offsets missing attributes, and
hashes referencing a type that was never declared. Exits non-zero on error.

## coreos_decrypt.py

Decrypts `CORE_OS_PACKAGE.pkg` out of a PUP and writes the `content` blob --
the 7,340,000-byte ROS payload `ros_hash.py` needs.

```
python tools/coreos_decrypt.py PS3UPDAT.PUP out_dir
python tools/coreos_decrypt.py --extract-selfs PS3UPDAT.PUP out_dir
```

Requires `pycryptodome` (`python -m pip install --user pycryptodome`). No other
external tools -- reimplements `pupunpack`, `unpkg`, and `cosunpkg` from
fail0verflow/ps3tools in Python, using the public retail PKG keys embedded in
the script.

`--extract-selfs` writes each SELF from the decrypted content next to
`content`. Useful for sanity-checking the extraction (each file should start
with the `SCE\0` magic).

## Getting the decrypted CoreOS

1. Get both PUPs and verify them:
- official `PS3UPDAT.PUP` for the firmware, from Sony's update CDN
- the matching **CEX** Evilnat CFW -- not `noBD`, `noBT` or `noBD+noBT`,
which drop modules and therefore hash differently
2. `python tools/coreos_decrypt.py PS3UPDAT.PUP out_dir` on each. The
`out_dir/content` file is what `ros_hash.py` consumes.
3. `python tools/ros_hash.py ofw_out/content cfw_out/content --version X.XX`.

`pup_info.py` prints a PUP's entry table if you want to confirm the layout
before decrypting.

## Adding a firmware, end to end

1. Verify both PUP downloads against their published checksums. The Evilnat
`.rar` ships an `md5.txt`; the official PUP has a SHA-256 published
alongside it.
2. `python tools/coreos_decrypt.py OFW.PUP ofw_out` and again for the CFW.
3. `python tools/ros_hash.py ofw_out/content cfw_out/content --version X.XX`
4. Paste both entries at the top of `<type name="ROS">` in
`src/PS3DumpChecker/hashlist.xml`, newest first.
5. Copy the CFW `content` to `src/PS3DumpChecker/Patches/patch.bin` and update
`Patches/patch_info.txt` to `noFSM X.XX (Evilnat based)`.
6. `python tools/validate_data.py`
7. Bump `AssemblyVersion` and `AssemblyFileVersion` in
`Properties/AssemblyInfo.cs`, and add a changelog entry.
8. Build Release_Embedded. The post-build step refreshes
`Latest Compiled Version/`, which is what the in-app updater serves --
`default.cfg`, `default.hashlist` and their `.md5` files must be regenerated
or existing installs will keep fetching the old data.
Loading