Skip to content

V1.3

Choose a tag to compare

@alfizari alfizari released this 15 Oct 20:00
· 3 commits to main since this release
e18cb16

PS5 Debug Studio: ShnExt, scanner undo and game naming update

This release adds full ShnExt support (AOBs, hooks, code caves, item dropdowns) on both import and export, undo for the scanner, inputs for code caves, and one naming standard for games that reads the title id and app version straight from the console.

ShnExt

  • Export to .ShnExt. A new file type in the export dialog, written the way the ShnExt app writes it. ShnExt export is built into the released .exe; it is not available when running from source.
  • AOBs, hooks and code caves are kept. Before, a cheat had to be fixed byte patches to export. Now AOB finders, hooks into code caves, cave blocks that jump between each other, data values and inputs are all written as ShnExt patches.
  • Item lists become dropdowns. An input that picks from an item list is exported as a ShnExt dictionary dropdown, with the whole list inside the file.
  • Round trips are exact. Importing a ShnExt project and exporting it again gives back the same patches, including the original code text, the label names and the value types.
  • Decrypted projects import fully. .ProjReap projects bring their game name, title id, version and item dictionaries. Values shared between patches are linked, and the description tells you which cheat to turn on first.
  • Original bytes for fixed sites. When a hook or patch sits at a fixed offset, the dialog can read the game's original code for it with "Read original bytes".
  • The export list shows what each patch holds, e.g. "ok – 1 AOB, 1 hook, 1 input".
  • Long patches are split at 1,024 bytes, onionHEN's limit.
  • Negative or huge offsets are refused instead of being written wrong.
  • Fixes:
    • Register jumps like jmp rax were reported as missing labels.
    • nop:N inside longer code, dword [x] without ptr, // comments and movabs with a variable now assemble.

Tested:

  • 589 public Reaper trainers: 5,614 of 5,633 cheats import, and 5,603 come back identical after export.
  • 1,585 GoldHEN cheat files converted to ShnExt read back identically in onionHEN.
  • The Dark Souls 3 and Dark Souls Remastered projects (18 patches) come back identical.

Game names, title ids and versions

Every game, file and export now uses the same standard as GoldHEN, ShnExt and Reaper Studio:

Field Example
Title id CUSA08155, PPSA01341
App version 01.03 (PS4), 01.004.000 (PS5)
Content id (optional, new) UP0700-CUSA08155_00-DARKSOULS3BST000
Process eboot.bin
File name CUSA08155_01.03.json, PPSA01341_01.004.000.ps5c
  • From console. With the game running, New game and Export fill in the title id, content id and app version. The version comes from the game's param.sfo (or param.json), the same source Reaper Studio uses. This needs a ps5debug-NG version with the foreground-app command; older payloads still give the title id, and you type the version. The console doesn't report game titles, so the game name is yours to type; it's reused when the library already has that game.

  • Older files are corrected. When a cheat file is loaded or imported, the tool fixes:

    • lower-case title ids
    • title ids that only appear in the game name or content id
    • versions like 1.4 or v01.03, which are written in full
    • an empty process, which is set to eboot.bin

    The untouched original of each library file is kept in deleted\<name>_before_naming.json.

  • New and imported files are named <TITLEID>_<VERSION>.json. Existing library files keep their names.

  • Versions never mix. An import no longer merges cheats for a different app version into the same file, since the offsets differ.

  • Our own exports follow the standard too. .ps5c and tool JSON exports now have the same header as the console formats, need a title id and version, and are named <TITLEID>_<VERSION>.ps5c.

  • Version warning. Turning on a cheat made for a different app version than the running game writes a warning to the log. AOB cheats usually still work.

  • Record from Caller and "Save as cheat" from a code cave fill in the version and content id.

Scanner

  • The options column scrolls when the window is short. Range search options were cut off before.
  • Undo scan and scan history. Each scan step's results are kept, up to 1,000,000 addresses per step, for 1–8 byte and float types. Going back re-reads only those addresses and continues from there.

Code caves (Disassembler)

  • Inputs and buffers have defaults. Every $input and @buffer the cave code uses is listed with a type and a default value, like the Caller's assembler. The defaults are used for the preview and for Enable.
  • Saved cheats keep them. The cheat gets the inputs with their types and defaults, and an alloc step for each buffer. "Insert step into Cheat Editor" adds the inputs too.
  • Float inputs go into the assembly as their IEEE bits (mov eax, $speed).

Import

  • No doubled "(master code)" in cheat names.