Some interesting news, just to keep them posted and see if someone discovers something:
F-zero (and probably the other protected savegames) DOESN'T use the flash ID of the memory card to identify it, it uses the card serial number.
Now, what is the serial number? I'ts an 8 byte long hexadecimal string (or number or whathever). I suspect the Flash ID (probably unscrambled) is used with the SRAM Bias to generate the serial number. I'll explain.
A card's header has this componentes:
Scrambled flash ID (12 bytes) + Time of format (8 bytes, it is used to descramble the flash ID and obtain the REAL flash ID of the card (which for unofficial cards it's always 12 zeroes)) + SRAM bias (4 bytes).
Well, these are the components that influence the serial number (as far as I know). Interesting fact: 2 different memory cards can theoretically have the same serial number, even though they have different flash IDs.
This means that If we find how the serial number is generated, then it will be possible to assign that serial number to a raw image (or .hdr file), making the f-zero savegame usable.
The use of .hdr files would be useful in order to not unnecessarily write all the card, just block 1.
I'm gonna continue research on this, but from wednesday onwards I'll only be able to test in dolphin...
BTW, here's an old post I had saved from tehskeen forums by jeremy654:
The dol that marc_max posted will tell you your memcard serial number. It is a hex string. One of my cards was ba c8 b7 da d5 d6 91 d5 (I added spaces to make it easier to read).
Looking in my f-zero save, I found the serial number. It was split up. ba c8 was at 20A6-20A7. b7 da was at 20A0-20A1. d5 d6 was at 75C0-75C1. 91 d5 was at 2240-2241.
I confirmed this by looking at f-zero saves from three different memory cards. The unique serial number for each card waw found in the same locations. I tried changing them for different memory cards, but it didn't work. That must be the checksum. I have no idea how checksums work, so if anyone else wants to take a crack at it, go for it. But at least we now know how to find the serial number. Good luck.
Also, If the f-zero save is backed up, I think it has to be restored to the same spot on the memory card, although I'm not entirely sure. I think I read something about this once. The block offset for all gc saves is supposed to be located at 0036-0037. This is the block on the memory card where the save begins. I tried changing this along with the serial number and I think I got the save file in the right spot, but it didn't work.
And if my explanation confused you, sorry, I don't know much about hex either.
As for other copy protected saves, Medal of Honor: Frontline and Fire Emblem are the only other games I have that appear to be copy protected. I can backup the fire emblem save to the sd card and transfer it to another memory card without problems. I'm not sure about the MoH save though.
Edit: serial number byte 4 is the sram language of cards header..
EDIT2: nope, byte 4 isn't the sram language, sram language influences byte 4, what happened is that in one of my cards what appears in serial number is the sram language.
// Serial in libogc
u8 serial
[12]; //0x0000 12 ?
u64 formatTime
; //0x000c 8 time of format (OSTime value)
u32
SramBias; //0x0014 4 sram bias at time of format
u32
SramLang; //0x0018 4 sram language
u8
Unk2[4]; //0x001c 4 ? almost always 0
The 4 unkwnown bytes have a rol in the 4 last bytes of the serial number
EDIT3: ok, after some testing I've found an "easy" way of setting a cards serial number
Sram bias affects the last 4 bytes of the serial number
Sram lang affects the first 4 bytes of the serial number
The 4 unkwnown bytes affect the same bytes as sram bias, but if set to 0 they are neutral.
The scrambled flash id first 8 bytes work as a base, then the remaining 4 bytes of flash id, format time, sram bias, sram lang and unknown modify it, either at the first 4 bytes or at the last 4 bytes.
Right now I'm gonna try manually getting a card to have the same serial as an f-zero savegame I have, if it works I'll look into generating the serial, in order to be able to change it at will.
EDIT4: OK, works with dolphin. Tomorrow I'll test with real hardware. If it woks it's just a matter of writing a function to get the serial, forcing a cards serial is easy, as explained above.