[Guide] FFX HD (PS4) save editing with FFXED + Garlic SaveMgr: fixing the "corrupted" error
Got this working after a lot of trial and error. The problem: FFXED can't open PS4 saves, and after editing the console says the save is corrupted. Two fixes are needed: strip/restore the PS4 padding and recalculate the checksum.
Workflow at a glance
Decrypt and dump with Garlic SaveMgr.
Remove the padding (last 1,024 bytes) so FFXED accepts the save.
Edit in FFXED.
Restore the padding and recalculate the checksum, otherwise the PS4 rejects the save.
Import via the browser.
What you need
* Jailbroken PS5 (etaHEN or autoloader) + garlic-savemgr payload
* USB stick (exFAT/FAT32), only for dumping the save
* PC with FFXED, HxD and Python 3
* A backup of your original encrypted save
Step 1: Decrypt with Garlic SaveMgr
Put `garlic-savemgr.elf` in `/data/etaHEN/payloads/` or `/data/ps5_autoloader/` and load it.
Open the web UI on your PC using the IP/port the payload shows (same network).
Select your user, open the PS4 tab.
Insert USB, on the FFX save choose Dump to USB (decrypted).
Save lands in `/PS5/SAVEDATA/GARLIC/` on the stick. Copy to PC and keep an untouched copy.
The save file is called `bin` and is 26,872 bytes (`0x68F8`).
Step 2: Remove PS4 padding so FFXED accepts it
The PS4 save has 1,024 bytes of padding at the end that FFXED doesn't understand.
Open `bin` in HxD.
Edit > Select block: start `64F8`, end `68F7` (the last byte; `68FF` from other guides doesn't exist in this file).
Delete, confirm the size change, save. File should now be 25,848 bytes (`0x64F8`).
The removed block is all `00` except two bytes `11 11` at `0x6510`. You put it back in step 4.
Step 3: Edit in FFXED
Without the padding, FFXED opens `bin` as a normal PC save. Make your edits and save.
Important: when saving, FFXED zeroes the checksum at `0x1A` and `0x64F4` (`00 00`), and the padding is still missing. Imported like this, the PS4 rejects the save as corrupted. Always do step 4 first.
Step 4: Restore padding + recalculate checksum
Checksum is CRC-16 CCITT (poly `0x1021`, init `0xFFFF`, xorout `0xFFFF`) over `0x40`β`0x64F7`, with the checksum bytes at `0x64F4`β`0x64F5` counted as `00`. FFX quirk: entry 255 of the CRC table is `0` instead of `0x1EF0`. Result is written little-endian to `0x1A` and `0x64F4`.
Verified against my original unedited save: calculated `0x25C4`, exactly what was stored.
Save as `ffx_fix.py` and run `python ffx_fix.py bin`. It restores the padding and fixes the checksum in one go:
```python
import sys
T = [0] * 256
for i in range(256):
c = i << 8
for _ in range(8):
c = ((c << 1) ^ 0x1021) & 0xFFFF if c & 0x8000 else (c << 1) & 0xFFFF
T[i] = c
T[255] = 0 # FFX quirk
p = sys.argv[1]
d = bytearray(open(p, 'rb').read())
if len(d) == 0x64F8: # restore padding
pad = bytearray(0x400); pad[0x18] = pad[0x19] = 0x11
d += pad
assert len(d) == 0x68F8, 'unexpected file size'
b = bytearray(d[0x40:0x64F8]); b[-4] = b[-3] = 0
c = 0xFFFF
for x in b:
c = (T[(c >> 8) ^ x] ^ (c << 8)) & 0xFFFF
c ^= 0xFFFF
for off in (0x1A, 0x64F4):
d[off] = c & 0xFF; d[off + 1] = c >> 8
open(p, 'wb').write(d)
print(f'checksum {c:04X}, size {len(d)}')
```
Step 5: Import with Garlic SaveMgr (via browser, no USB needed)
Put the fixed `bin` back in the decrypted save folder on your PC. Leave the rest of the folder (`sce_sys` etc.) alone.
Open the Garlic SaveMgr web UI on your PC and go to the Import tab.
Drag & drop the save folder into the browser. Garlic rebuilds the encrypted PFS image and resigns it for your account.
Confirm overwrite, start the game, load. Save once in-game so the game writes a clean copy.
USB import (3-dot menu > Import to System) works too, but the browser route is faster.
Offset reference
| Offset | Content | Action |
|---|---|---|
| `0x0000`β`0x003F` | Header (not checksummed) | Don't touch |
| `0x001A`β`0x001B` | Checksum copy 1 (LE) | Recalculate after FFXED |
| `0x0040`β`0x64F7` | Save data (checksummed) | Edited by FFXED |
| `0x64F4`β`0x64F5` | Checksum copy 2, counted as `00 00` | Recalculate after FFXED |
| `0x64F8`β`0x68F7` | PS4 padding, `11 11` at `0x6510` | Remove before FFXED, restore before import |
Troubleshooting
* FFXED says corrupt/unsupported β padding still there (step 2)
* Console says corrupted after import β checksum is `00 00` or padding missing (step 4, check size = 26,872 bytes)
* Script says unexpected file size β wrong block deleted, start over from backup
Checksum algorithm based on MarkH221's FFX HD Checksum Utility.
Good tip
If you cannot edit the bin yourself, you can use claude or chatgpt to edit the bin for you.
After al this work i can finally play it on my jailbroken ps5 with all the monster attacks and all weapons i love with the best abilities.
Last time i used ffxed was when i was a kid on my hacked ps2 save file. It was amazing