PS2 Quick guide: save extraction from broken HDD logic

Berion

Developer
If Your HDD partition index or OPL partition goes broken, PS2 will not read it it's contents, nor any PC tool. Yet still there is a way to safe game saves. And this cover up this mini tutorial.
  1. Open PS2 HDD in hex editor (any, I prefer HxD).
  2. Take to Your hands game box or game disc and read the product code from it (i.e SLUS-21201).
  3. Search values "BASLUS-21201" (the larger disk is, the longer process it will be). Why not only SLUS-21201? Because You will find garbage data not related to game save. Why "BA" prefix? Because it is prefix which game developers mandatory adding to save folders on Memory Cards ("BA" for NTSC-U, "BI" for NTSC-J, "BC" for NTSC-A, "BE" for PAL).
  4. When You got one shot it means You have found VMC with this save, so You must now find the beginning of VMC which is easy because MC (so VMC too) starting always from "Sony PS2 Memory Card Format" string. Look for this value from pointer of BA* in UP direction (important!). After few seconds You will find VMC start address.
  5. Set start from it and now mark first 8MiB (in HxD it is option called Choose Block). Length for 8MiB is 800000h, for 16MiB is 1000000, for 32MiB is 2000000 and so on. Copy selected block and paste into new file. Save as i.e "survivor.vmc".
  6. Run uLE, mount this VMC from i.e USB ("mass:/"; FAT32 on MBR), go to "vmc0:/", mark the save folder, press R1, choose copy, go back to "mass:/", press R1 and choose "PSU Paste".
ps2_hdd_sav_res_1.png ps2_hdd_sav_res_2.png
ps2_hdd_sav_res_3.png
 
Last edited:
If user has been bought professional license of IsoBuster, he can use custom signature script engine to be used as Memory Card and Saves finder. In attachment You can find Save Data Crawler which can be used to find all PSX and PS2 Memory Cards formats, all PSX saves (PS2 saves doesn't have signatures) and PSV containers. Script can be used in none-commercially and even commercially; You are totally free to use it whatever purpose You want. ^^

1. Run the app and go to "Options" > "File System settings" > "SIG".

2a. Check option "Limit the size of found files to:" and write "65536" value.

This is because largest VMC created by OPL cannot be larger than 64MiB but of course if You know that used virtual memory cards are larger or smaller, increase or decrease this number (i.e raw PSX memory cards cannot be larger than 128KiB, so if You looking only those, write "128"). Engine trying guess the file size but technically it is not possible to always automatically determine proper size so found saves or virtual memory cards can be larger than they really are, because there are other data between their signatures and next found signature.

2b. Check option "Use custom defined rules" and choose file "Save Data Crawler.rules" from Your disk (which You must of course download and unpack from this post). To eliminate possibility of false positive scan results, also check option "Only custom defined rules".

2c. Click "OK" to save changes. ;p

isobuster_sdcrawler_1.png


Note: if You always want to use this script, in addition, without any limitations on demand like size etc., put *.rules file in "Plugins" dir where You have installed IsoBuster. It will be automatically read on application start.

3. Open disk image (by "File" > "Open Image File ") or real device like connected disk, pendrive etc. (by clicking on "Select a drive"). IsoBuster will interpret image/device logic. If it is unknown or beyond repair You can scan only whole file/device, but if it understandable, it will show partitions/areas and user would be able to choose scan only selected part of data.

In example below, it is disk image comes from PS2 HDD. Knowing that only on "__common" partition I have PSX memory cards, I selecting this specific partition to shorten scanning time. Under right mouse menu, I choose option "Find missing files and folders".

isobuster_sdcrawler_2.png


4. After scan is done, under rectangle symbolizing file system type, appears rectangle with "SIG" letters. This is place where You can find all found files by signature scan and under right mouse menu on files, be able to extract them. On example below, there is PSX memory card image and several PSX saves.

isobuster_sdcrawler_3.png


Note: none of the files have original file names because those are not part of files but file system tables which aren't used for signature scan. Also file size could not be true (some can be larger than they should). It is totally normal behaviour.

Note2: if looking data was fragmented, recovered files can be "damaged" because algorithm doesn't know where another parts of data are. Signature scan always works best on not fragmented files.

Code:
\%        ____  ____  __
\%       /\  _`\  /\  _`\  /\ \__            version 1.1
\%       \ \ \L\_\  __  __  __  __  \ \ \/\ \  __  \ \  _\  __            by Berion
\%        \/_\__ \  /'__`\  /\ \/\ \  /'__`\  \ \ \ \ \  /'__`\ \ \ \/  /'__`\
\%        /\ \L\ \/\ \L\.\_\ \ \_/ |/\  __/  \ \ \_\ \/\ \L\.\_\ \ \_/\ \L\.\_
\%        \ `\____\ \__/.\_\\ \___/ \ \____\  \ \____/\ \__/.\_\\ \__\ \__/.\_\
\%        \/_____/\/__/\/_/ \/__/  \/____/  \/___/  \/__/\/_/ \/__/\/__/\/_/
\%        ____  ____  ______  __  __  __  ____  ____
\%        /\  _`\  /\  _`\ /\  _  \/\ \  __/\ \/\ \  /\  _`\ /\  _`\
\%        \ \ \/\_\\ \ \L\ \ \ \L\ \ \ \/\ \ \ \ \ \  \ \ \L\_\ \ \L\ \
\%        \ \ \/_/_\ \ .  /\ \  __ \ \ \ \ \ \ \ \ \  __\ \  _\L\ \  . /
\%        \ \ \L\ \\ \ \\ \\ \ \/\ \ \ \_/ \_\ \ \ \L\ \\ \ \L\ \ \ \\ \
\%        \ \____/ \ \_\ \_\ \_\ \_\ `\___^___/\ \____/ \ \____/\ \_\ \_\
\%        \/___/  \/_/\/ /\/_/\/_/'\/__//__/  \/___/  \/___/  \/_/\/ /
\%
\%
\% Place this script inside Plugins dir where You have installed IsoBuster then use on selected track or partition "Find missing files and
\% folders". After signature scan end, new square "SIG" should appear with found data. None of the files will have original file names and
\% will be duplicated with already visible data. That's the normal behavior and nature of file seeking by value patterns.
\%
\% =======================================================================================================================================
\%                          Sony PlayStation Memory Card images
\% =======================================================================================================================================

\% VM1, MCR and several other extensions used by emulators are the same raw dumps of Memory Card. Just rename the files. ;)
\% SAVERAM is actually combined two Memory Card images so signature scan will not found any, instead it shows it as separated VM1.

\x31\x32\x33\x2D\x34\x35\x36\x2D\x53\x54\x44\x00\x00\x00\x00\x00\|.gme|134976
\x56\x67\x73\x4D\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\|.mem|131136
\x00\x50\x4D\x56\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\|.vmp|131200
\x4D\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\|.VM1|131072

\% =======================================================================================================================================
\%                            Sony PlayStation Save Data
\% =======================================================================================================================================

\% Retrieve GameID and SubID from vaild saves written in memory card index.
\% You can find single saves also in PSX VRAM uncompressed dumps.

\x53\x43\x1?\|.raw

\% =======================================================================================================================================
\%                          Sony PlayStation 2 Memory Card images
\% =======================================================================================================================================

\% Cannot determine if Memory Card images is ECC or None-ECC so both can be found and named VM2.
\% ECC = 8650752*n (*.ps2, *.vm2,), None-ECC = 8388608*n (*.bin, *.vmc).

\x53\x6F\x6E\x79\x20\x50\x53\x32\x20\x4D\x65\x6D\x6F\x72\x79\x20\x43\x61\x72\x64\x20\x46\x6F\x72\x6D\x61\x74\x20\x??\x2E\x??\x2E\|.VM2

\% =======================================================================================================================================
\%                      Sony PlayStation 2 Save Data & application resources
\% =======================================================================================================================================

\% Signature for both *.elf and *.irx is the same, so scan cannot tell the differences. File will be saved just as ELF.
\% Single saves or other save resources cannot be retrieved by signature because they are data stream fully designed by game devs.
\% By default, search is disabled. Remove "\%" in rule line if You need it.

\% \x01\x00\x00\x0?\x00\x0?\x0?\x4?\x00\x0?\x0?\x1?\x00\x00\x0?\x??\|.kelf
\% \x7F\x45\x4C\x46\x01\x01\x01\x00\|.elf
\% CNF_version\|.cnf
\% BOOT =\|.cnf
\% BOOT2 =\|.cnf

\% \x50\x53\x32\x44\x00\x00\x1C\x00\x00\x00\x00\x00\x10\x00\x00\x00\|.sys
\% \x00\x00\x01\x00\x01\x00\x00\x00\|.ico

\% =======================================================================================================================================
\%                        Sony PlayStation & PlayStation 2 exported saves
\% =======================================================================================================================================

\% File name is part of validation (PS3 will reject different), however this information can be retrieved from PSV header.

\x00\x56\x53\x50\x00\x00\x00\x00\|.psv
\x27\x84\x00\x00\x??\x00\x00\x00\|.psu

\% =======================================================================================================================================
\%                          Sony PlayStation System File Objects
\% =======================================================================================================================================

\% By default, search is disabled. Remove "\%" in rule line if You need it.

\% \x00\x50\x53\x46\x01\x01\x00\x00\|.sfo


\% ---------------------------------------------------------------------------------------------------------------------------------------
\%                                script examples
\% ---------------------------------------------------------------------------------------------------------------------------------------
\% "Text"       ASCII instead of hex values
\% "\s(1)"       skip one byte
\% "\xAA"       hex value AAh
\% "\x??"       can be any hex value
\% "o(3)AA\o()BB\o()CC\o()"   possible only one of this three values: AAh, BBh or CCh
\% "\<\x03"       possible only 00h, 01h and 02h values
\% "\|.xxx"       adds extension *.xxx to found files
\% "|1"         file length can be only 1 byte
- - -
Later I'll try to make script for free tool: PhotoRec.
 

Attachments

Similar threads

Back
Top