XContent

From Xenon Wiki
Revision as of 01:43, 20 August 2010 by 75.80.241.65 (talk) (→‎Tools)
Jump to navigation Jump to search

XContent packages store a wide range of files for the Xbox 360 created locally or downloaded. From save game files to marketplace items, these packages are everywhere, and are secured through the use of cryptographic hashes (SHA-1) and signed and verified using the console's unique RSA-2048 private key. They store files through the use of STFS and information about the package through use of a metadata structure.

XContent Header

Offset Length Type Information
0x0 0x4 unsigned int Signature Type

The signature type can be one of the following:

Signature Type Information
"CON " Signed by a console. Found on many files such as cache files, profiles, saved games.
PIRS Signed by Microsoft. Found on files delivered by Microsoft through non-Xbox Live means such as system updates.
LIVE Signed by Microsoft. Found on files delivered over Xbox Live such as items from the Marketplace like themes.

For console signed ("CON ") packages, the Console Security Certificate is used.

For remotely signed (LIVE/PIRS) packages, the following format is used:

Offset Length Type Information
0x4 0x100 bytes Package Signature
0x104 0x128 bytes Padding

The Package Signature is generated using the value at 0x32C (Content ID/Header SHA1).

XContent Metadata

Offset Length Type Information
0x22C 0x100 license entries (see below) Licensing Data (used to check package owner)
0x32C 0x14 bytes Content ID / Header SHA1 Hash
0x340 0x4 unsigned int Entry ID
0x344 0x4 signed int Content Type (see below)
0x348 0x4 signed int Metadata Version (see below)
0x34C 0x8 signed long Content Size
0x354 0x4 unsigned int Media ID
0x358 0x4 signed int Version (system/title updates)
0x35C 0x4 signed int Base Version (system/title updates)
0x360 0x4 unsigned int Title ID
0x364 0x1 byte Platform (xbox/gfwl?)
0x365 0x1 byte Executable Type
0x366 0x1 byte Disc Number
0x367 0x1 byte Disc In Set
0x368 0x4 unsigned int Save Game ID
0x36C 0x5 bytes Console ID
0x371 0x8 bytes Profile ID
0x379 0x1 byte Volume Descriptor Structure Size (usually 0x24)
0x37A Volume Descriptor Structure Size - 1 structure Volume Descriptor
0x379 + Volume Descriptor Structure Size 0x4 signed int Data File Count
0x37D + Volume Descriptor Structure Size 0x8 signed long Data File Combined Size
0x385 + Volume Descriptor Structure Size 0x8 bytes Reserved
0x38D + Volume Descriptor Structure Size 0x4C bytes Padding
0x3D9 + Volume Descriptor Structure Size 0x14 bytes Device ID
0x3ED + Volume Descriptor Structure Size 0x900 (each 0x80 = different locale) unicode string Display Name
0xCED + Volume Descriptor Structure Size 0x900 (each 0x80 = different locale) unicode string Display Description
0x15ED + Volume Descriptor Structure Size 0x80 unicode string Publisher Name
0x166D + Volume Descriptor Structure Size 0x80 unicode string Title Name
0x16ED + Volume Descriptor Structure Size 0x1 byte Transfer Flags (see below)
0x16EE + Volume Descriptor Structure Size 0x4 signed int Thumbnail Image Size
0x16F2 + Volume Descriptor Structure Size 0x4 signed int Title Thumbnail Image Size
0x16F6 + Volume Descriptor Structure Size 0x4000 (thumbnail size) image Thumbnail Image
0x56F6 + Volume Descriptor Structure Size 0x4000 (title thumbnail size) image Title Thumbnail Image

Version 2

If the Metadata Version field is set to 2, the format is slightly changed:

Offset Length Type Information
0x38D + Volume Descriptor Structure Size 0x10 bytes Series ID
0x39D + Volume Descriptor Structure Size 0x10 bytes Season ID
0x3AD + Volume Descriptor Structure Size 0x2 signed short Season Number
0x3B1 + Volume Descriptor Structure Size 0x2 signed short Episode Number
0x3B3 + Volume Descriptor Structure Size 0x28 bytes Padding
0x16ED + Volume Descriptor Structure Size 0x3D00 (thumbnail size) image Thumbnail Image
0x53F6 + Volume Descriptor Structure Size 0x300 (each 0x80 = different locale) image Additional Display Names
0x56F6 + Volume Descriptor Structure Size 0x3D00 (title thumbnail size) image Title Thumbnail Image
0x93F6 + Volume Descriptor Structure Size 0x300 (each 0x80 = different locale) image Additional Display Descriptions

License Entries

For every entry in the license data field:

Offset Length Type Information
0x0 0x8 signed long License ID (XUID / PUID / console id)
0x8 0x4 signed int License Bits
0xC 0x4 signed int License Flags

Content Types

Value Description
0xD0000 Arcade Title
0x9000 Avatar Item
0x40000 Cache File
0x2000000 Community Game
0x80000 Game Demo
0x20000 Gamer Picture
0xA0000 Game Title
0xC0000 Game Trailer
0x400000 Game Video
0x4000 Installed Game
0xB0000 Installer
0x2000 IPTV Pause Buffer
0xF0000 License Store
0x2 Marketplace Content
0x100000 Movie
0x300000 Music Video
0x500000 Podcast Video
0x10000 Profile
0x3 Publisher
0x1 Saved Game
0x50000 Storage Download
0x30000 Theme
0x200000 TV
0x90000 Video
0x600000 Viral Video
0x70000 Xbox Download
0x5000 Xbox Original Game
0x60000 Xbox Saved Game
0x1000 Xbox 360 Title
0x5000 Xbox Title
0xE0000 XNA

Transfer Flags

Value Description
0x00 DeviceID and ProfileID Transfer
0x20 Move Only Transfer
0x40 DeviceID Transfer
0x80 ProfileID Transfer
0xC0 None

Tools

An (old) tool (Python 2.5 required) to analyze and extract these archive files is available at extract360.py (2008-08-03, 23056 bytes, MD5 = 3aa517c83d01c618927b78d0ca665d02)

wxPirs 1.1 can extract from LIVE/PIRS files fine, but as it doesn't use hash tables properly it doesn't work well with CON files.

A newer tool was released by DJ Shepherd called Le Fluffie, which can create and extract from CON/LIVE/PIRS files (but it has some problems with creation, some prefer to use XLAST)

XLAST inside the Xbox 360 SDK can create LIVE/PIRS packages, but it is illegal to share it.