Changes

Jump to navigation Jump to search
13,545 bytes removed ,  14:27, 23 December 2011
m
(Feel free to fix or enhance this page)
 
= Format =
A savegame consists of a [[#Header|Header]], followed by a [[#Bk Header|Bk Header]] and a set of files contained in a [[#Files|files]] section. The savgames are signed while being copied to the SD card using the Wii's private NG key.
== Header ==
The plaintext header contents are described in the following table.
It's divided in two parts: The "main header" and the "banner"
=== Main header ==={| styleclass="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;wikitable"|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #cdc;" | '''! Start'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccd;" | '''! End'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccc;" | '''! Length'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dcc;" | '''! Description'''|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x0000| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x0007| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 8| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Savegame ID|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x0008| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x000B| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | size of header banner (0x72a0 0x72A0 or 0xf0a00xF0A0, also seen 0xBAA0)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x000C| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x000C| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | permissions|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x000D| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x000D| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x000E| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x001D| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 16| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | md5 of plaintext header with md5 blanker applied|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x001E| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x001F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x0020| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x003F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 16| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x0040| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x00BF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 128| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | title (?? in utf16)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x00C0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x60BF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 24576| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | banner (192x64)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x60C0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x72BF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4608| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon0 (48x48)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x72C0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x84BF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4608| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon1 (optional, present if size of header is 0xf0a0)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x84C0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x96BF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4608| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon2 (optional, present if size of header is 0xf0a0)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x96C0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xA8BF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4608| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon3 (optional, present if size of header is 0xf0a0)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0xA8C0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xBABF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4608| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon4 (optional, present if size of header is 0xf0a0)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0xBAC0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xCCBF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4608| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon5 (optional, present if size of header is 0xf0a0)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0xCCC0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xDEBF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4608| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon6 (optional, present if size of header is 0xf0a0)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0xDEC0| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xF0BF| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4608| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon7 (optional, present if size of header is 0xf0a0)
|}
=== Banner ==={| class="wikitable"|-! Start! End! Length! Description|-| 0x0020| 0x0023| 4| magic ('WIBN') (Wii Banner?)|-| 0x0024| 0x0027| 4| Flags - (Maskable) if set to 0x000001 the save cannot be copied from NAND via normal means, 0x000010 means to "Bounce" between 0 and the last frame. Setting it to 0x000000 makes the animation loop through all frames resetting to 0 on the final frame.|-| 0x0028| 0x002A| 2| AnimSpeed - Set per frame frameDelay*((animSpeed >> (2*nFrame))&3); 0 being no animation 1-3 being progressively slower, this is a little strange, but if the first two frames are set to 0, don't animate the icon.|-| 0x002B| 0x003F| 22| Reserved|-| 0x0040| 0x007F| 64| Game title (big endian Unicode)|-| 0x0080| 0x00BF| 64| Game subtitle (big endian Unicode)|-| 0x00C0| 0x60BF| 24576| banner (192x64) - RGB5A3 GX texture format|-| 0x60C0| 0x72BF| 4608| icon0 (48x48) - RGB5A3 GX texture format|-| 0x72C0| 0x84BF| 4608| icon1 (optional, present if size of header is 0xF0C0)|-| 0x84C0| 0x96BF| 4608| icon2 (optional, present if size of header is 0xF0C0)|-| 0x96C0| 0xA8BF| 4608| icon3 (optional, present if size of header is 0xF0C0)|-| 0xA8C0| 0xBABF| 4608| icon4 (optional, present if size of header is 0xF0C0)|-| 0xBAC0| 0xCCBF| 4608| icon5 (optional, present if size of header is 0xF0C0)|-| 0xCCC0| 0xDEBF| 4608| icon6 (optional, present if size of header is 0xF0C0)|-| 0xDEC0| 0xF0BF| 4608| icon7 (optional, present if size of header is 0xF0C0)|} == Bk ("BacKup") Header ==
The Bk Header is 0x80 0x70 bytes long(plus 0x10 bytes of padding/aligning). It is not encrypted.
{| styleclass="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;wikitable"|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #cdc;" | '''! Start'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccd;" | '''! End'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccc;" | '''! Length'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dcc;" | '''! Description'''|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x000| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x003| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | magic1 Size of the header (0x00000070)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x004| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x005| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | magic2 magic ('Bk')|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x006| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x007| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 2| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | magic3 magic2 or version (0x0001)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x008| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x00B| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | NG id|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x00C| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x00F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | number of files|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x010| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x013| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | size of files|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x014| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x017| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x018| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x01B| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x01C| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x01F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | total size|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x020| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x05F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 64| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x060| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x063| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x064| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x067| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Game ID (ex. 'RMGP' for Super Mario Galaxy)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x068| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x06B0x06D| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 46| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknownMac address of the wii|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x06C0x06E| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x06F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 42| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x070| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x07F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 16| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | null padded
|}
 
== Files ==
The file header is 0x80 bytes long. It is not encrypted.
{| styleclass="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;wikitable"|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #cdc;" | '''! Start'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccd;" | '''! End'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ccc;" | '''! Length'''| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dcc;" | '''! Description'''|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x000| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x003| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | magic1 (0x03adf17e)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x004| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x007| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | size of file|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x008| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x008| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | permissions|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x009| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x009| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | attributes|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x00A| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x00A| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 1| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | type (1=file, 2=directory)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x00B| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | variable| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | variable| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | name (null terminated)|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | ...| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | ...| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | ...| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ...|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x050| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x05F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 16| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | IV for file data decryption|- style="background-color: #ddd;"| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x060| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x07F| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | ...| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? unknown
|}
File data comes after the [[#File Header|File Header]]. Each file actually occupies the length specified in the file header rounded up to the next 64 byte boundary. Data is encrypted (AES128-CBC) using the "sd-key" and the initialization vector specified in the File Header.
=== Parsing savegames ===
 
Savegames can be decrypted and unpacked with segher's tachtig and created with his twintig.
 
== See Also ==
=== Parsing savegames ===* [[FE100]]* [[Wii Savegame Parser]]
Savegames can be parsed with the [[Wii_Savegame_Parser|savegame parserCategory:File formats]]
9

edits

Navigation menu