Generic Xbox 360 File Container

From Free60

Jump to: navigation, search

Contents

[edit] Generic Xbox 360 File Container Info

PIRS or LIVE are the magic bytes that start most files on the Xbox 360. This is a generic container file that holds the real files along with metadata that the dashboard reads like title, description and icon.

LIVE files come from Xbox Live. PIRS files are used to store information like gamer tags or themes. The console itself also creates files. These files start with the string 'CON '. They are slightly different from LIVE and PIRS files, mainly at the begin.

Some CON files have multiple revisions of the directory listing and the embedded files. In such cases, the information below is incorrect.

[edit] Tool

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

2008-08-03 : add support for XUIZ files

Serious contributions are welcome.


[edit] Format

Titles and Descriptions are Unicode strings, start with 2 nulls and are null padded. Some PIRS files do not have the icon data at 0x5714 and onwards. It is unknown if this data is relocated or simply not included in these PIRS files.

For LIVE/PIRS files :

Offset Size Description
0x0000 4 'PIRS' or 'LIVE' Magic Int
0x0004 256 2048-bit Certificate (signed SHA1 hash of the entire file?)
0x0104 552 Data

For CON files :

Offset Size Description
0x0000 4 'CON ' Magic Int
0x0004 424 Constant header/certificate, console specific ?
0x01A8 388 File specific data

The CON file contains readable text, console specific

Offset Size Description
0x000A 3X80345-001 the build number ( what line its from )
0x0020 12-07-05 Manufacturing date
0x03FD OS8A1JY00C4313 Device id

The format below is common for LIVE/PIRS.

The following table is completely wrong for CON files.


Offset Size Description
0x032C 20 SHA1 hash of 0x0344 - 0xB000 (0x0344-0xA000 for CON files)
0x340 4 Entry id for above hash
0x344 4 Content type (see below)
0x0410 256 English Title
0x0510 256 Japanese Title
0x0610 256 German Title
0x0710 256 French Title
0x0810 256 Spanish Title
0x0910 256 Italian Title
0x0A10 256 Korean Title
0x0B10 256 Chinese Title
0x0C10 256 Portuguese Title
0x0D10 256 English Description
0x0E10 256 Japanese Description
0x0F10 256 German Description
0x1010 256 French Description
0x1110 256 Spanish Description
0x1210 256 Italian Description
0x1310 256 Korean Description
0x1410 256 Chinese Description
0x1510 256 Portuguese Description
0x1610 128 Publisher (one language only)
0x1690 128 Filename (one language only)
0x1710 2 Value, either 0 or 0x00c0
0x1712 4 Icon length of first icon
0x1716 4 Icon length of second icon
0x171A Null padded big icon
0x571A Null padded small icon
ss sl table of SHA1 hashes of payload of file (see below)
ls ll File listing
cs cl Content start

The content type is a or-ed value of the following flags, it is also the name of the subdirectory which must contain the file.

0x00100000 Movie
0x00200000 TV
0x00300000 Music Video
0x00400000 Game Video
0x00500000 Podcase Video
0x00600000 Viral Video
0x000F0000 License Store (?)
0x00900000 Video
0x000A0000 Game Title
0x000B0000 Installer
0x000C0000 Game Trailer
0x000D0000 Arcade
0x000E0000 XNA
0x00080000 Game Demo
0x00020000 Gamer Picture
0x00030000 Thematic Skin
0x00040000 Cache
0x00050000 Storage Download
0x00060000 Xbox Saved Game
0x00070000 Xbox Download
0x00010000 Profile
0x00000001 Saved Game
0x00000002 Market Place
0x00000003 Publisher
0x00000FFD IPTV DVR
0x00002000 XNA Community
0x00001000 Xbox 360 Title
0x00005000 Xbox Title

The values of ss and sl are:

  • for LIVE/PIRS files: 0xB000 and 4096
  • for CON files: 0xA000 and 8192 (sometimes only the first 4096 bytes are used).

The value of ls is:

  • For CON files: 0xC000
  • For LIVE/PIRS files: 0xC000 or 0xD000 if the word value at 0xC032 is unequal to 0xFFFF (indicating an entry in the root directory). The value 0xD000 is only used on kiosk discs.

The value of cs is equal to ls + the word value at (ls + 0x2F). The value of ll is equal to cs-ls. The value of cl is equal to the file length minus cs, meaning that the rest of the file contains the contents.

Each embedded file starts at a 4096 byte boundary. The optional space between embedded files is filled with null bytes.

The file listing consists of entries which have the format below. The listing ends with an entry consisting of only null bytes.

Offset Size Description
0x00 40 File name, null-padded
0x28 1 Length of file name, plus flags
0x29 3 Size of file in 4096 byte blocks (little endian)
0x2C 3 Copy of 0x29
0x2F 3 Starting cluster number of file (little endian)
0x32 2 Path indicator (big endian)
0x34 4 Size of file in bytes (big endian)
0x38 4 Update date/time stamp of file
0x3C 4 Access date/time stamp of file

Byte 0x28 also has two flags: bit 6 and bit 7. The meaning of bit 6 is unknown, bit 7 indicates that the file is a directory.

The starting cluster number is relative to ls and counts in 4096 byte blocks. This means that ls+4096 is cluster 1, ls+8192 is cluster 2, etc.

The path indicator indicates the path of the file. 0xFFFF means that the file is in the 'root' directory, any other value V refers to the (sub)directory which is listed as the Vth entry in the listing (counting from 0). Directories can nest.

The FAT format is used for the date/time stamps of the files.

Note that the starting cluster as given in the directory (sc) entry might not be the real starting cluster. The following algorithm should be used to obtain the real starting cluster:

unsigned v0, offset;

offset = (filetype == LIVE || filetype == PIRS) && (ls == 0xC000) ? 0x1000 : 0x2000;
v0 = sc * 0x1000 + ls;
while (sc >= 170) {
    sc /= 170;
    v0 += (sc + 1) * offset;
}
return v0;

This algorithm was reverse engineered from a disassembly of wxPirs. To extract a file, sc and all clusters after sc (i.e. sc + 1, sc + 2, etc.) have to be calculated using the above algorithm.

The data between the clusters consists of the continuation of table T below. The cluster at 0xB6000 is an exception to this rule, as it is the first master table of SHA1 hashes. This master table contains 170SHA1 hashes of the first 170 sub hash tables (the 170-entry sub hash tables contain SHA1 hashes for each 4096 byte cluster).

The first entry at 0xB6000 is an SHA1 hash of the sub hash table at 0xB000 (ss). The DWORD at 0xB6FF0 is a count of valid entries in the combined sub hash tables (0x70E4 would be a full count, and an indicator that extra master hash tables exist).

If the file is large enough to warrant extra master hash tables, they are found roughly every 169*171*4096 bytes. For instance, the master hash entry #171 (second master table, first entry) is located at 0x719A000, and the DWORD at 0x719AFF0 is the total count of valid entries in the combined sub hash tables to this point.

EDIT: It's not 170*170*4096. It's 169*171*4096 (169 is the number of hash tables following the table, since the 1st one in each table hashes the previous master hash table. 171 is the number of clusters that every table hashes (1 cluster for the table + 170 for the data). 4096 is the size of a cluster. The result of that (118.370.304) is the data between master hash tables. (With the old formula, there was a difference of 1 cluster, so it was also "including" the hash table). Is this right?

  • A. Header
  • B. SubHash 0 (0xB000) (entries for data clusters 0-169)
  • C. Directory Structure (0xC000)
  • D. Data 0 ... Data 169 (next block after end of directory structure?)
  • E. MasterHash 0 (0xB6000) (entries for subhash blocks 0-169)
  • F. SubHash 1 (0xB7000) (entries for data clusters 170-339)
  • G. Data 170 .. Data 339
  • H. SubHash 2, Data ... Data (170 * 170)-1
  • I. Certificate Extension? (0x719A000)
  • J. MasterHash 1 (0x719B000)
  • K. SubHash 170 (0x719C000)
  • L. Data (170 * 170) ..........

[edit] Authentication

If the Xbox 360 needs to verify the value at 0x4, a calculation of a 1GB demo at 12X DVD speed would be horrendously slow. It is likely not to validate the entire file when launching a demo. This certificate may only sign the header portion of the file, which contains the master hash table for the rest of the file.

At ss, there is a table T of format:

typedef struct {
   uint8_t hash[20];
   uint32_t entryID;
} hashEntry;

The hash entry in each struct is an SHA-1 hash of a 4096 byte block B starting at ls. The entryID value gives the location of B relative to cs. The values of bit 31-28 are:

  • LIVE/PIRS files: 1, 0, 0, 0
  • CON files: 0/1, 1, 0, 0

The entryID value 0xX0FFFFFF indicates that this block either starts a new file or is the last block in the archive file.

Because 4096 mod 24 == 16, the last 16 bytes of each block B are set to 0x00.

[edit] Resign tool

Resign tools use keys obtained from the decrypted keyvault of an Xbox 360 console.

They can easily be found at almost every modding website, and there is no need to dispute as such.

[edit] STFS Header Information

Click here to view

[edit] File Containers

On your external harddrive you will find CON, PIRS, and LIVE files on 99% of your harddrive. This chart shows which files have which container:


Container Name File Type
CON Game data such as usermaps for halo 3
PIRS Game demos, Arcade games, Game Add-Ons
LIVE Gamer pictures, Dashboards, Updates

[edit] LIVE/PIRS INFO



Hello all, its opearn here. heres the info on PIRS files.

  • Edited by someone mysterious because of false info



Offset Length Description
0 4 Signature Magic (PIRS/LIVE)
4 0x100 RSA Signature
0x22C 0x118 The piece of the header the hash is taken that creates the above signature



Personal tools