Difference between revisions of "Content.bin file structure"

From WiiBrew
Jump to navigation Jump to search
(Redirecting to Content.bin#File structure)
 
(23 intermediate revisions by 10 users not shown)
Line 1: Line 1:
==The content.bin file structure ==
+
#REDIRECT [[Content.bin#File_structure]]
VC games and Wii channels, when saved to a SD card, will be stored in a file named "private/wii/title/XXXX/content.bin", where XXXX is the four-character name of the game/channel.
 
 
 
The general layout of this file is as follows. Most of the data here is sketchy, at best.
 
 
 
{| style="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;"
 
|- style="background-color: #ddd;"
 
| 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: #ddd;" | 0x0640
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Part A: Encrypted header
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | variable, padded to 64-byte boundary
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Part B: Encrypted game info
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 0x70, padded to 64-byte boundary
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Part C: Cleartext "Bk" header
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 0x1E4 + num_contents*0x24, padded to 64-byte boundary
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Part D: Cleartext TMD block, including content_records for the following files
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | num_contents*variable, padded to 64-byte boundary
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Part E: Encrypted data contents
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 0x340
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Part F: Cleartext certificates
 
|}
 
 
 
===Part A: Encrypted header===
 
The header is encrypted by the SD key and SD IV. When decrypted, it contains the following structure:
 
(* means the field is discussed below)
 
 
 
{| style="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;"
 
|- 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;" | 0x007
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 8
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Title ID (which is 00 01 00 01 followed by the four-character code)
 
|- 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;" | Size of part B
 
|- 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;" | 0x01B
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 16
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | MD5 Hash of header
 
|- 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;" | 0x02B
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 16
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | unknown_1 (crypto usage, md5 hash of something?)
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x02C
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x02F
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | * unknown_2
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x030
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x037
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 8
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | * Title-ID-reference_1
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x038
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x03F
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 8
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | * Title-ID-reference_2
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x040
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x07F
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 64
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | * Zeroes_1
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x080
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x09B
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 28
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | * IMET data
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x09C
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x0EF
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 42
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Channel name in Unicode, padded with 00 (Japanse version -- can be empty).
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x0F0
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x143
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 42
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Channel name in Unicode, padded with 00 (English version).
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x144
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x197
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 42
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Channel name in Unicode, padded with 00 (German version).
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x198
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x1EB
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 42
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Channel name in Unicode, padded with 00 (French version).
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x1EC
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x23F
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 42
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Channel name in Unicode, padded with 00 (Spanish version).
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x240
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x293
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 42
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Channel name in Unicode, padded with 00 (Italian version).
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x294
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x2E7
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 42
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Channel name in Unicode, padded with 00 (Dutch version).
 
|- style="background-color: #ddd;"
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x2E8
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x63F
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 0x358
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | * Padding (normally zero)
 
|}
 
 
 
===Part B: Encrypted game info===
 
 
 
This part is is also encrypted by the SD key and SD IV. The contents of this part has not yet been fully analyzed. It seems to contain information of what kind of system that is emulated, and probably the image to dislay on the channel selector for this VC game.
 
 
 
===Part C: Cleartext "Bk" header===
 
 
 
This part is not encrypted. It is similar to the Bk header found in savegames, but the contents only partially match.
 
The header could also be exactly 0x80 long; the size of 0x70 is a guess based on the first field being a size parameter.
 
 
 
{| style="border-collapse: collapse; padding: 0.2em 0.2em 0.2em 0.2em;"
 
|- 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;" | Size of this part (presumably; always 0x70)
 
|- 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;" | Magic word, always 0x42 0x6B 0x00 0x01 (Bk..)
 
|- 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;" | 0x06F
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 0x64
 
| style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | As of yet un-analyzed data, mostly zero.
 
|}
 
 
 
===Part D: Cleartext TMD block===
 
This part is not encrypted. It is well described on the [[Tmd_file_structure|TMD file format]] page. Some things to note:
 
* Only the tmd struct is included here, not the certificates.
 
* As described on the TMD file format page, after the main struct (with a size of 0x1E4), there follows an array of content_record structs.
 
* There is as many structs as the num_contents field in the tmd struct indicates. For VC, this seems to be always 7.
 
* The type and size file of the content_record is of special interest, since they describe part E.
 
* If type is 0x80 0x01, then the content is included in part E, and the size of the content is given by the size field.
 
* Otherwise, type will be 0x00 0x01, and the content is (presumably) shared between VCs and stored elsewere on the Wii.
 
 
 
===Part E: Encrypted data contents===
 
This part is encrypted. The encryption key is currently unknown. It might be unique to the Wii which saved the VC.
 
It consists of several separate "files", one for each of the contents with the 0x80 type flag in the TMD content_record, padded to 64-byte boundary.
 
 
 
===Part F: Cleartext certificates===
 
This part is not encrypted. The exact details of this field is not yet analyzed, but it is likely related to the chain of certificates as described on the [[Tmd_file_structure|TMD file format]] page.
 

Latest revision as of 01:39, 26 October 2008