Skip to content

The Account file is a HMAC-RC4 encrypted file stored in profiles to hold things such as the profiles gamertag, PUID (Passport User ID), online key and more.

Encryption

The file is encrypted with a custom form of HMAC-RC4, which is handled by the XeKeysUnobfuscate function. The key differs between retail and development consoles and is stored in key index 0x19.

  • Retail key
0xE1 0xBC 0x15 0x9C 0x73 0xB1 0xEA 0xE9 0xAB 0x31 0x70 0xF3 0xAD 0x47 0xEB 0xF3
  • Devkit key
0xDA 0xB6 0x9A 0xD9 0x8E 0x28 0x76 0x4F 0x97 0x7E 0xE2 0x48 0x7E 0x4F 0x3F 0x68

To decrypt the file:

  • Copy the first 16 bytes of the file to a buffer. This is the HMAC-SHA1 hash of the file which is made using one of the keys above.
  • Use HMAC-SHA1 on that buffer with a key from above to create the RC4 key, which is 0x10 bytes.
  • Decrypt 8 bytes after the hash of the file (at offset 0x10) using RC4. This is the confounder.
  • Decrypt 380 bytes after the confounder using RC4. This is the decrypted account data.
  • Make a hash of the confounder and decrypted data using HMAC-SHA1 and a key above and compare it to the first 16 bytes of the file, if it doesn't match then the decryption failed.

To encrypt the file:

  • Copy the decrypted data to offset 0x18
  • Create a random 8 byte confounder and copy this to offset 0x10.
  • Make a hash of the confounder and decrypted data using HMAC-SHA1 and a key above, resize it to 16 bytes and then copy that to the beginning of the file.
  • Use HMAC-SHA1 on that hash with a key from above to create the RC4 key, which is 0x10 bytes.
  • Encrypt 388 bytes from position 0x10 using RC4.

Decrypted File

Offset

Length

Type

Information

0

4

UInt32

Reserved(Flags)

4

4

UInt32

LiveFlags

8

16 chars/32 bytes

Unicode

Gamertag

40

8

ulong

XUID

48

4

UInt32

Cached User Flags

52

4

ASCII string

Xbox Live Service Provider

56

4

PasscodeKeys[4]

Passcode

60

20

ASCII string

Online Domain

80

24

ASCII string

Online Kerberos Realm

104

16

Bytes

Online Key

120

114

ASCII string

User Passport Membername

234

32

ASCII string

User Passport Password

266

114

ASCII string

Owner Passport Membername

  • Note Last 3 not used anymore(if ever).

Reserved(flags)

Name Value
Passcode Enabled 0x10000000
LIVE Enabled 0x20000000
Recovering 0x40000000

The flag at bit0 seems to be always set, not sure what it means though.

Cached User Flags

Bits Used Indices Field Name
0 Payment Instrument Credit Card
8-15 Country
16-19 Subscription Teir
24 Parental Controls Enabled
25-29 Language

The other bits are used, I'm just not sure what they all represent.

Passcode

The passcode is made up of these bytes:

Byte Button
0 Null
1 DPad Up
2 DPad Down
3 DPad Left
4 DPad Right
5 X
6 Y
7 A
8 B
9 Left Trigger
10 Right Trigger
11 Left Bumper
12 Right Bumper
  • Note A and B are not valid for passwords.

XUID

public class XUID { public System.UInt64 Value; public XUID(System.UInt64 _Value) { Value = _Value; } public System.Boolean IsOfflineXuid { get { return (Value & 17293822569102704640L) == 16140901064495857664L; } } public System.Boolean IsOnline { get { return (Value & 18446462598732840960L) == 2533274790395904L; } } public System.Boolean IsTeam//Guess this is todo with devs { get { return (Value & 18374686479671624000L) == 18302628885633696000L; } } public System.Boolean IsValidXuid { get { return IsOfflineXuid != IsOnlineXuid; } } }

Country

public enum XboxLiveCountry { Albania = 2, Algeria = 0x1b, Argentina = 4, Armenia = 3, Australia = 6, Austria = 5, Azerbaijan = 7, Bahrain = 10, Belarus = 14, Belgium = 8, Belize = 15, Bolivia = 12, Brazil = 13, BruneiDarussalam = 11, Bulgaria = 9, Canada = 0x10, Chile = 0x13, China = 20, Colombia = 0x15, CostaRica = 0x16, Croatia = 0x29, CzechRepublic = 0x17, Denmark = 0x19, DominicanRepublic = 0x1a, Ecuador = 0x1c, Egypt = 30, ElSalvador = 0x5f, Estonia = 0x1d, FaroeIslands = 0x21, Finland = 0x20, France = 0x22, Georgia = 0x24, Germany = 0x18, Greece = 0x25, Guatemala = 0x26, Honduras = 40, HongKong = 0x27, Hungary = 0x2a, Iceland = 0x31, India = 0x2e, Indonesia = 0x2b, Iran = 0x30, Iraq = 0x2f, Ireland = 0x2c, Israel = 0x2d, Italy = 50, Jamaica = 0x33, Japan = 0x35, Jordan = 0x34, Kazakhstan = 0x3a, Kenya = 0x36, Korea = 0x38, Kuwait = 0x39, Kyrgyzstan = 0x37, Latvia = 0x3f, Lebanon = 0x3b, LibyanArabJamahiriya = 0x40, Liechtenstein = 60, Lithuania = 0x3d, Luxembourg = 0x3e, Macao = 0x45, Macedonia = 0x43, Malaysia = 0x48, Maldives = 70, Mexico = 0x47, Monaco = 0x42, Mongolia = 0x44, Morocco = 0x41, Netherlands = 0x4a, NewZealand = 0x4c, Nicaragua = 0x49, Norway = 0x4b, Oman = 0x4d, Pakistan = 0x51, Panama = 0x4e, Paraguay = 0x55, Peru = 0x4f, Philippines = 80, Poland = 0x52, Portugal = 0x54, PuertoRico = 0x53, Qatar = 0x56, Romania = 0x57, RussianFederation = 0x58, SaudiArabia = 0x59, Singapore = 0x5b, Slovakia = 0x5d, Slovenia = 0x5c, SouthAfrica = 0x6d, Spain = 0x1f, Sweden = 90, Switzerland = 0x12, SyrianArabRepublic = 0x60, Taiwan = 0x65, Thailand = 0x61, TrinidadAndTobago = 100, Tunisia = 0x62, Turkey = 0x63, Ukraine = 0x66, UnitedArabEmirates = 1, UnitedKingdom = 0x23, UnitedStates = 0x67, Unknown = 0, Uruguay = 0x68, Uzbekistan = 0x69, Venezuela = 0x6a, Vietnam = 0x6b, Yemen = 0x6c, Zimbabwe = 110 }

SubscriptionTeir

enum SubscriptionTeir { NoSubcription, Silver = 3, Gold = 6, FamilyGold = 9 };

Language

enum ConsoleLanguage { None, English, Japanese, German, French, Spanish, Italian, Korean, TChinese, Portuguese, SChinese, Polish, Russian };

System Software