Jump to content
suloku

My Pokemon Ranch Savedata Tools v2 (added region changing)

Recommended Posts

UPDATE 4: About Japanesse My Pokemon Ranch:

- Region code seems to be 0x00 for normal japanesse my pokemon ranch. Seems totally compatible with the other versions (NTSC and PAL using regionchanger).

About the Platinum update savegame:

- savedata.bin is bigger, seems that space was added for 500 player pokemon and 500 hayley's pokemon (a total of 3000 pokemon in the ranch). Some more Ranch data is added as well (for the new features I guess, like song changing, that setting may be saved as well).

- The start offset of mii data has changed, since some more data for the ranch save was added, the start offset of mii data has changed. Since I wrote these tools with a hardcoded offset instead of reading the offset from the header (because I discovered that later) the only tools that will work with the platinum update savegame are hashupdater and regionchanger. I may rewrite my tools to clean the code and add compatibility with the platinum update savegame.

- For platinum update the region code seems to be 0x40. I think that these region codes are actually only bitmasks, since my pal savegame was updated to 0x60 (bit 6 was enabled) and not 0x40.

- A platinum update savegame will NOT work on any non platinum update game. The game will say the save is corrupted (but it is not, it must make some kind of filesize check).

UPDATE 3: I tested a little with dolphin and found the header value that defines de region/language of the savegame. I've updated the post with the new information, and I've also attached a new file with the updated information and a new app: PR-regionchanger.exe, which has a region selector (jap, NTSC-U, PAL: english, dutch, french, german, spanish, italian) and also updates the file's hash.

UPDATE 2: I made a quick test with a pal savedata I found. The PAL ranch save seems to be language locked and the "connect to wii" option will only appear in the DS games of the same language (english, deutch, french, italian and spanish). I couldn't find any obvious value in the savefile storing the language setting. The lack of a language setting in the NTSC-U savefile might be what prevents the save from loading on the PAL game. I could create several new savefiles in different languages and compare them, but as I said I'm not working on this anymore.

UPDATE: Released extractor, id changer and hash updater!

Only tested with PAL and NTSC-U savefiles.

FAQ:

- What are these for?

With these tools you can extract the .pkm files from My Pokemon Ranch savedata and take ownership of all the pokemon in the ranch, so you can withdraw them with any NDS cart.

- How do I get the savefile from my wii?

You will need a homebrew enabled wii (aka Homebrew Channel) and you'll need to use Savegame Manager Gx.

- Can I use the savegame copied from the system menu?

No, you can't. Either way, if you can copy it it means your wii is homebrew enabled, since you aren't supposed to be able to copy that savegame.

- Can I know my secret trainer ID with these tools?

Yes you can. Each .pkm file extracted with PR-extractor contains in its filename the TID and SID of the trainer that deposited the pokemon in decimal (normal numbers, not hex like the .tnr files).

Alternative method for pokemon extracting:

If you use PR-extractor, you can check data of the trainer that deposited the pokemon (TID and SID). You can check the name at My pokemon Ranch screen or using pokegen and opening the .pkm file (only if the pokemon belonged to this same trainer).

If you edit your NDS savegame so it matches the TID, SID and name of the trainer that deposited the pokemon, you can withdraw them.

Quick Instructions:

I'll briefly explain the process of changing all pokemon from a savefile to a specified trainer.

0.- Connect to My Pokemon Ranch with your DS trainer and deposit a pokemon. If the ranch is full see side notes*

1.- Use Savegame Manager Gx to extract your savegame (extract, not copy).

2.- Put savedata.bin in the same folder as the PR tools.

3.- Run PR-extractor.exe. Sort by number.

4.- Get the .tnr file of the LAST pokemon extracted. This file contains the hex data from your trainer (TID, SID and Name).

5.- Drag and drop your .tnr file to "Insert_tnr_and_update_hash.bat". The file "savedata_hashed.bin" will be created. The program will ask you if the trainer had connected to the ranch, select YES if the new trainer information matches any of the ranch trainers.

6.- Delete savedata.bin inside the folder you extracted with Savegame Manager Gx (0001000157424d50 for PAL savefile, 0001000157424d45 for NTSC-U savefile).

7.- Copy savedata_hashed.bin to that folder and rename it as savedata.bin.

8.- Restore your savegame to your wii with Savegame Manager Gx.

9.- You should now be able to extract all the pokemon with the specified trainer

-----------

Side notes:

*: if the ranch is full, backup the savefile, then erase it and start a new game in my pokemon ranch, deposit a pokemon and extract this new savefile (in another location, don't overwrite the save with the pokemon you want to obtan!). The use this savefile to obtain your .tnr file. If you do that, select NO in step 5.

If you want to change the savegame's region/language, drag and drop savedata_hashed.bin on PR-regionchange.exe after step 5 and use the new created file instead in further steps.

Savedata structure information:

Savedata header information.png

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Structure of My pokemon ranch savegame file (pal and usa, japanesse version unknown).

(I know this information is poorly written)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

1.- The savefile starts with a header of unknown size (probably 0x108 or 0x112 bytes), the following information is knwon:

0x00-0x19: SHA-1 hash of all the following data in the file

0x24-0x27: start offset of mii data entries in the ranch

0x2C-0x2F: start offset of "mii-trainer" data entries in the ranch

0x34-0x37: start offset of pokemon data

0x3C-0x3F: ending offset of pokemon data (after this the savegame is all 0x00)

0x53: language setting. Single language games (NTSC) seem to ignore this setting. More information in the side notes.*

0x60-0x63: unknown, maybe date/time? Value increases everytime the game saves.

2.- From 0x070 to 0x22A8 all is 0x00 on a new savefile, with never connected DS trainers or deposited pokemon. In used savefiles one can find a register of ds trainer names (ascii, not hex) and other data, which I think it may be visitors, maybe somewhere is the ranch's level... On two different savegames I also found 3 trainer entries (TID, SID, Name), but these didn't seem to affect editing the savegame in any way (maybe it is a register of last connected trainers, I don't have 2 game cartriges, so I can't test).

3.-

0x22A8-0x22AB: 00 00 00 28 , seems a marker that the previous section of the savefile has ended.

0x22AC-0x22AF: number of mii stored

Variable size: mii data, each mii takes 40 bytes. These are the Mii available at the ranch.

4 bytes: 00 00 00 2C in various savefiles, again it seems a marker that the data ended.

4 bytes: number of trainer-Mii links

Variable size: trainer-mii entries, 44 bytes long each entry (each mii in the Ranch is assigned a trainer)

4 bytes: unknown data; 00 00 00 A4 in several savegames, seems the end of data marker/marker of start of pokemon data

4 bytes: total number of pokemon in the ranch (includes Hayleys pokemon)

4.- POKEMON ENTRIES (164 bytes each), structured as following:

-136 bytes: encrypted .pkm file (readable by pokegen)

-28 bytes: 4 bytes (**read below), then TID (2 bytes), SID (two bytes), trainer name (16 bytes) and 4 more unknown bytes. This data is unencrypted.

** These value seems to be 01 00 00 00 for trainers, 05 00 00 00 for pokemon traded to Hayley, 04 00 00 00 for Hayley's pokemon, and 04 00 00 02 for pokemon that are tradeable with the player and are currently at the ranch (check here for those pokemon: http://bulbapedia.bulbagarden.net/wiki/Hayley%27s_trades).

I have found 01 00 00 01 on one ocasion, I think that this is used to indicate to differentiate between two trainers with the same TID, SID and NAME, as it happened to me that I added my trainer TID, SID and NAME to all pokemon in the game and changed the one in the mii-trainer entry, and still my game was recognized as a different trainer. That might have been because I edited a NTSC-U savefile and I was using it on my PAL system. This can probably be changed in the mii-trainer entry, but I couldn't the value (if it was there). It maybe have been also an unfortunate outcome of using a converted savegame. (By the way, PAL saves work on NTSC-U version of My Pokemon Ranch, but NTSC-U pokemon ranch saves don't seem to work directly on the PAL version).

5.- End of data mark? (4 bytes): 00 00 00 28. From this point until the end of the file everything is 0x00, because of the file size I suspect that the savefile has room for 20 mii entries, 8 mii-trainer entries (as stated in wikipedia, only eight carts can connect to the ranch, I can't test what happens when a 9th cart tries to connect), 1000 hayley pokemon and 1000 trainer pokemon (from those 8 allowed carts).

......................

Side notes:

TID: trainer ID

SID: secret trainer ID

Name: the trainer name (not in ascii, but as hex values for the game's character mapping)

*The language setting is 1 byte at 0x53 in savedata.bin file. These are the language values:

NTSC

--------------------

0x00 - English (NTSC-U?, maybe NTSC-J too)

0x02 - English (NTSC-U)

I found 0x02 on a NTSC-U savegame I downloaded and 0x00 on a savegame created on Dolphin running the NTSC-U "My Pokemon Ranch". Both load fine on the NTSC-U as is, probably because the single language games don't really have a language setting, as PAL savegames load fine on the NTSC-U version (on a PAL wii at least), so it doesn't really matter. I don't have a NTSC system for confirming, but I suspect 0x00 for NTSC-J and 0x02 for NTSC-U are the correct values.

PAL

--------------------

0x08 - English (PAL) and Dutch (PAL). Text is displayed in english for Dutch.

0x10 - German (PAL)

0x18 - French (PAL)

0x20 - Spanish (PAL)

0x28 - Italian (PAL)

On dolphin emulator, if the Language is set to Japanesse, Simplified Chinese, Traditional chinese or Korean the japanesse Safety Screen appears and the language defaults to English (PAL), meaning that My Pokemon Ranch will load English (PAL) savegames.

note: entering the DS link on dolphin will corrupt the savegmae

::::::::::::::::::::

Best Regards, suloku

This is the thread that originated it all: http://projectpokemon.org/forums/showthread.php?28382-Reading-My-Pokemon-Ranch-save)

Original post:

Hello, after reding this thread (http://projectpokemon.org/forums/showthread.php?28382-Reading-My-Pokemon-Ranch-save) and seeing that the offsets didn't match I looked at some savefiles and decided to code my own pokemon ranch extractor. It seems to work fine in several PAL and USA savefiles, japanesse are untested (with and without the platinum update).

I've also been coding an app that changes the owner of the pokemon in the ranch, but a problem arised: the savegame header seems to have a checksum of the file, and I don't know how to recalculate it, so the edited file won't work.

Also, I would almost surely need to delete all "mii-trainer" entries but one and change the trainer associated to that mii. That can be easily done, but until the cehcksum problem is solved, using and edited savegame can't be done.

Any help with that checksum will be appreciated.

UPDATE: it seems that deleting the "mii-trainer" entries is not necessary, the mii linked to a trainer remains even when no pokemon are stored in the ranch. I've attached my current code for the Ranch ID changer, it accepts manual entry of the TID, SID and name (in hex) or it can use a .tnr file generated by PR Extractor. The "only" thing it misses is updating the ranch's checksum, either someone updates my code or writes a separate app that calculates and writes the new checksum.

As an alternative method to get the pokemon in the ranch, since with the extractor we can know the TID, SID and Name, with an action replay device or editing the savegame the pokemon in the ranch can be retrieved. There's tutorials for that elsewhere.

Readme:

My Pokemon Ranch Exctractor v0.1 by suloku December 2014

------------------------------------------------------------

Copyright 2014 suloku <sulokutdcmago@gmail.com>

Licensed under the terms of the GNU GPL, version 2

http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt

------------------------------------------------------------

Usage:

1.- Extract my pokemon ranch savegame using Savegame Manager Gx (or any alternative) from your wii. You will need a soft-moded wii for that (aka homebrew channel).

2.- Place savedata.bin from the savedata you just extracted in the same folder as PR-extractor.exe

3.- Execute the Pr-extractor.exe

The pokemon are extracted as encrypted .pkm files compatible with latest pokegen. The filename includes the number of the pokemon in order it was deposited in the ranch, the trainer ID and secret trainer ID.

You will be asked if you want to sort the extracted pokemon by trainer ID or by deposition order (it just changes the way the files are named, useful if there are many pokemon from different trainers).

Hayleys pokemon are also extracted (with a different filename). Pokemon traded with Hayley are also extracted and the filename has the "traded" tag.

Some of Hayleys pokemon have the "tradeable" tag, wich only means that Hayley may ask to trade that pokemon for one of the wanted pokemon in the ranch, the .pkm file is as any other pokemon.

The extractor will create .tnr files, whichs filenames include the trainer ID, secret ID and trainer name in hexadecimal. De file itself contains that very same data. They have no use as of now (27th december 2014), but they are intended to be used by My Pokemon Ranch ID changer to make all the pokemon in the ranch belong to the specified TID, SID and name.

My Pokemon Ranch ID changer is an application under development, stalled because the header of My pokemon ranch savefile has a checksum and I don't know how to recalculate it.

-----------

Changelog:

+V0.1: initial release

-----------

Developer notes:

- The source is very ugly and poorly written, I know and I made what I could. It works, so meh.

- Any help with updating the checksum at the savefile header will be appreciated.

Savedata file structure information

(I know this information is poorly written)

The savefile has a header with some kind of checksum that prevents directly editing it. Any help would be appreciated.

Structure of My pokemon ranch savegame file (pal and usa, japanesse version unknown).

0x22AC-0x22AF: number of mii stored

Variable size: mii data, each mii takes 40 bytes. These are the Mii available at the ranch.

4 bytes: 00 00 00 2C in various savefiles

4 bytes: number of trainer-Mii links

Variable size: trainer-mii entries, 44 bytes long each entry (each mii in the Ranch is assigned a trainer)

4 bytes: unknown data; 00 00 00 A4 in two different savegames

4 bytes: number of pokemon in the ranch

POKEMON ENTRIES (164 bytes each), structured as following:

-136 bytes: encrypted .pkm file (readable by pokegen)

-28 bytes: 4 bytes (*read below), then TID (2 bytes), SID (two bytes), trainer name (16 bytes) and 4 more unknown bytes. This data is unencrypted.

End of file mark? (4 bytes): 00 00 00 28

* These value seems to be 01 00 00 00 for trainers, 05 00 00 00 for pokemon traded to Hayley, 04 00 00 00 for Hayley's pokemon, and 04 00 00 02 for pokemon that are tradeable with the player and are currently at the ranch (check here for those pokemon: http://bulbapedia.bulbagarden.net/wiki/Hayley%27s_trades).

PR-tools_v2.zip

PR-tools_v2.zip

583dd01c3cca9_Savedataheaderinformation.

Edited by suloku
Updated file and information
  • Like 3

Share this post


Link to post
Share on other sites

Thank you, I've looked at it, but I don't know visual basic (in fact, I know very little programming).

I've taken advantage of MPKR making a backup of the savefile to compare what happens when I withdraw a pokemon and deposit a different one. The result was that the only changes to the file are the ones shown in the following image (and obviously the 136 bytes correponding to the pokemon I deposited, which now take the place of the one I withdrawed):

ranchheader.png

EDIT: I also tried to just enter the ranch and save 2 times in a row, then extract the savedata. The only difference between the two savedata were the bytes marked in red in the image (0x00-0x19 and 0x63).

I also tried withdrawing the first pokemon deposited at the ranch, then depositing a different one, which shifts the whole pokemon data 164 bytes. But same result. Removing a pokemon has the same changes to the header (well, the pokemon start offset is updated, as stated below).

The checksum is definitely one of those, maybe 0x60-0x63 is the header checksum and 0x00-0x19 is the savedata header.

Also, I noticed some values in the header are offsets in the file:

- Underlined in the image, they seem to be just some index values

- In a black square I've marked the values of the offsets of different sections in the savegame:

0x00-0x19: SHA-1 hash of all the following data in the file

0x24-0x27: start offset of mii data entries in the ranch

0x2C-0x2F: start offset of "mii-trainer" data entries in the ranch

0x34-0x37: start offset of pokemon data

0x3C-0x3F: ending offset of pokemon data (after this the savegame is all 0x00)

[ATTACH=CONFIG]11917[/ATTACH]

UPDATE: found it! 0x00-0x19 is a SHA-1 checksum of the rest of the savedata. 0x60-0x63 might be a time value, since in subsecuent savefiles it only increases.

Thankully this is a very common checksum, so I will be able to update the id changer app myself!

UPDATE_2: I successfully edited my pokemon ranch savefile and could download all pokemon to a different diamond/pearl savegame, without modifying the nds savegame.

It required some extra tweaking, like adding TID, SID, Name to one of the mii-trainer entries (this one was expected). I need more testing, because in my successful attemp i just changed all the trainer data existing in the savefile (which only had had one trainer ever) to the new one and I don't know if changing them all is required, as my save had 3 consecutive TID, SID, Name for no apparent reason. Maybe it is a log of the last trainers that connected to the ranch for the ranch and wiiconnect features?

I'll do more testing tomorrow, but the big part is done.

UPDATE_3: The process is now automatic. I updated the id-changer and coded a program that updates the hash. I coded it as a separate application because that way one can manually modify the savefile, for example, to change a pokemon for other, and add event pokemon to the ranch for example.

With the information in this thread one could write a full save editor, that changes the trainers in the ranch and the pokemon they have stored. It would be nice for people who don't have access to AR or nds flashcarts to mingle with pearl/diamond savegames, but I'm not going to code it, and since my pokemon ranch is only for diamond/pearl I doubt anyone will take that much interest as to code it.

I'll update first post with new binaries and the info I've gathered later.

UPDATE_4: First post updated. I doubt I will work on this anymore, source and all the information I gathered is available in the rar attached to the first post.

UPDATE_5: updated first post with new information and a tool to change the savegame region/language setting

ranchheader.png.250fecb04bc39fb26ebdbfda

Edited by suloku
  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

I would like to thank you for this software it saved my two shinies from radar chaining in Diamond from being lost forever. When I randomly found a nand+keys backup of my long dead Wii on a sd card I was successful decrypting it and getting the Ranch save out. I found them and injected them back into Diamond and did all the transfers to bring them up to Omega Ruby. I'm really happy since I had permantly lost hope of finding them again.

Share this post


Link to post
Share on other sites

Hey

So despite being a habitual lurker I thought I should post this. I've written a Python 2.7 script that allows you to decompile and recompile My Pokémon Ranch saves, built upon the research of suloku.

If you want to add new pokémon to the ranch just decompile the save and add the encrypted 138 .pkm file to the "Pokemon" subfolder of the extraction folder and recompile. Make sure it isn't named similarly to the other files in there or the script may make a terrible mistake. It'll use the trainer link information from the last ranch pokemon in the list.

It isn't fully featured, it only really handles pokémon dynamically.

Script is here: http://pastebin.com/NnjYjqYR

Hope someone finds it useful.

PSA: Python scripts can be dangerous, don't run unknown scripts from somebody you don't trust. Get someone who knows what they're doing to read through them first to check they don't do anything bad.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...