Difference between revisions of "Savegame Files"
Bitflusher (talk | contribs) (link to Wii_Savegame_Parser) |
(→Header) |
||
Line 27: | Line 27: | ||
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x000B | | 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: #ddd;" | 4 | ||
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | size of header ( | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | size of header (0x72C0 or 0xF0C0) |
|- style="background-color: #ddd;" | |- 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: #ded;" | 0x000C | ||
Line 72: | Line 72: | ||
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x84BF | | 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: #ddd;" | 4608 | ||
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon1 (optional, present if size of header is | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon1 (optional, present if size of header is 0xF0C0) |
|- style="background-color: #ddd;" | |- 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: #ded;" | 0x84C0 | ||
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x96BF | | 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: #ddd;" | 4608 | ||
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon2 (optional, present if size of header is | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon2 (optional, present if size of header is 0xF0C0) |
|- style="background-color: #ddd;" | |- 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: #ded;" | 0x96C0 | ||
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xA8BF | | 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: #ddd;" | 4608 | ||
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon3 (optional, present if size of header is | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon3 (optional, present if size of header is 0xF0C0) |
|- style="background-color: #ddd;" | |- 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: #ded;" | 0xA8C0 | ||
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xBABF | | 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: #ddd;" | 4608 | ||
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon4 (optional, present if size of header is | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon4 (optional, present if size of header is 0xF0C0) |
|- style="background-color: #ddd;" | |- 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: #ded;" | 0xBAC0 | ||
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xCCBF | | 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: #ddd;" | 4608 | ||
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon5 (optional, present if size of header is | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon5 (optional, present if size of header is 0xF0C0) |
|- style="background-color: #ddd;" | |- 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: #ded;" | 0xCCC0 | ||
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xDEBF | | 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: #ddd;" | 4608 | ||
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon6 (optional, present if size of header is | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon6 (optional, present if size of header is 0xF0C0) |
|- style="background-color: #ddd;" | |- 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: #ded;" | 0xDEC0 | ||
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0xF0BF | | 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: #ddd;" | 4608 | ||
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon7 (optional, present if size of header is | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | icon7 (optional, present if size of header is 0xF0C0) |
|} | |} | ||
− | |||
== Bk Header == | == Bk Header == |
Revision as of 23:19, 9 April 2008
(Feel free to fix or enhance this page)
Format
A savegame consists of a Header, followed by a Bk Header and a set of files contained in a files section.
Header
The Header is 0xF0C0 bytes long. It is encrypted (AES128-CBC) using the "sd-key" and the "sd-iv" initialization vector.
The plaintext header contents are described in the following table.
Start | End | Length | Description |
0x0000 | 0x0007 | 8 | Savegame ID |
0x0008 | 0x000B | 4 | size of header (0x72C0 or 0xF0C0) |
0x000C | 0x000C | 1 | permissions |
0x000D | 0x000D | 1 | ?? unknown |
0x000E | 0x001D | 16 | md5 of plaintext header with md5 blanker applied |
0x001E | 0x001F | 2 | ?? unknown |
0x0020 | 0x003F | 16 | ?? unknown |
0x0040 | 0x00BF | 128 | title (?? in utf16) |
0x00C0 | 0x60BF | 24576 | banner (192x64) |
0x60C0 | 0x72BF | 4608 | icon0 (48x48) |
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 Header
The Bk Header is 0x80 bytes long. It is not encrypted.
Start | End | Length | Description |
0x000 | 0x003 | 4 | magic1 (0x00000070) |
0x004 | 0x005 | 2 | magic2 ('Bk') |
0x006 | 0x007 | 2 | magic3 (0x0001) |
0x008 | 0x00B | 4 | NG id |
0x00C | 0x00F | 4 | number of files |
0x010 | 0x013 | 4 | size of files |
0x014 | 0x017 | 4 | ?? unknown |
0x018 | 0x01B | 4 | ?? unknown |
0x01C | 0x01F | 4 | total size |
0x020 | 0x05F | 64 | ?? unknown |
0x060 | 0x063 | 4 | ?? unknown |
0x064 | 0x067 | 4 | Game ID (ex. 'RMGP' for Super Mario Galaxy) |
0x068 | 0x06B | 4 | ?? unknown |
0x06C | 0x06F | 4 | ?? unknown |
0x070 | 0x07F | 16 | null padded |
Files
A savegame consists of several files up to the number specified in the Bk Header. Each file is described using a File Header and a File Data section. Files are stored immediately after the Bk Header using the format described in the next sections.
File Header
The file header is 0x80 bytes long. It is not encrypted.
Start | End | Length | Description |
0x000 | 0x003 | 4 | magic1 (0x03adf17e) |
0x004 | 0x007 | 4 | size of file |
0x008 | 0x008 | 1 | permissions |
0x009 | 0x009 | 1 | attributes |
0x00A | 0x00A | 1 | type (1=file, 2=directory) |
0x00B | variable | variable | name (null terminated) |
... | ... | ... | ... |
0x050 | 0x05F | 16 | IV for file data decryption |
0x060 | 0x07F | ... | ?? unknown |
File Data
File data comes after the 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 parsed with the savegame parser