public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XbfsEntry:"); string fmt = formatted ? " " : ""; if (!Padding.IsArrayEmpty()) b.AppendLineSpace(fmt + "Padding != null"); b.AppendLine(); b.AppendLineSpace(fmt + "LBA: 0x" + LBA.ToString("X") + " (0x" + (LBA * 0x1000).ToString("X") + ")"); b.AppendLineSpace(fmt + "Length: 0x" + Length.ToString("X") + " (0x" + (Length * 0x1000).ToString("X") + ")"); b.AppendLineSpace(fmt + "Padding: " + Padding.ToHexString()); return b.ToString(); }
public string ToString(bool formatted, string header = "iQueSysAppSigArea") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; b.AppendLineSpace(fmt + $"RevocationAddr: 0x{RevocationAddr:X}"); b.AppendLineSpace(fmt + $"RevocationNameAddr: 0x{RevocationNameAddr:X}"); b.AppendLineSpace(fmt + $"AuthorityAddr: 0x{AuthorityAddr:X}"); b.AppendLine(); b.AppendLineSpace(fmt + "Unk8CC:" + Environment.NewLine + fmt + Unk8CC.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "Unk910:" + Environment.NewLine + fmt + Unk910.ToHexString()); b.AppendLine(); b.AppendLine(ContentMetadata.ToString(formatted, header + ".BbContentMetadataHead")); b.AppendLine(); b.AppendLine(Certificate.ToString(formatted, header + ".iQueCertificate")); b.AppendLine(); b.AppendLine(Authority.ToString(formatted, header + ".iQueCertificate (Authority)")); b.AppendLine(); b.AppendLine(Revocation.ToString(formatted, header + ".iQueCertificateRevocation")); b.AppendLine(); return(b.ToString()); }
public string ToString(bool formatted) { string fmt = formatted ? " " : ""; var b = new StringBuilder(); b.AppendLineSpace(fmt + $"Magic: {new string(Magic)}"); b.AppendLineSpace(fmt + $"Format Version: 0x{FormatVersion:X}"); b.AppendLineSpace(fmt + $"Sequence Number: 0x{SequenceNumber:X}"); b.AppendLineSpace(fmt + $"Layout Version: 0x{LayoutVersion:X}"); b.AppendLineSpace(fmt + $"Reserved08: 0x{Reserved08:X}"); b.AppendLineSpace(fmt + $"Reserved10: 0x{Reserved10:X}"); b.AppendLineSpace(fmt + $"Reserved18: 0x{Reserved18:X}"); b.AppendLineSpace(fmt + $"Reserved3C0: {Reserved3C0.ToHexString()}"); b.AppendLineSpace(fmt + $"System XVID: {SystemXVID}"); b.AppendLineSpace(fmt + $"XBFS header hash: {Environment.NewLine}{fmt}{XbfsHash.ToHexString()}"); b.AppendLine(); for (int i = 0; i < Files.Length; i++) { XbfsEntry entry = Files[i]; if (entry.Length == 0) { continue; } b.AppendLine($"File {i}: {XbfsFile.XbfsFilenames[i]} {entry.ToString(formatted)}"); } return(b.ToString()); }
public string ToString(bool formatted, string header = "iQueCertificateRevocation") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; b.AppendLineSpace(fmt + $"CertName: {CertNameString}"); b.AppendLineSpace(fmt + $"Authority: {AuthorityString}"); b.AppendLineSpace(fmt + $"Timestamp: {TimestampDateTime} ({Timestamp})"); b.AppendLine(); b.AppendLineSpace(fmt + "Signature:" + Environment.NewLine + fmt + Signature.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + $"Unk200: 0x{Unk200:X}"); b.AppendLineSpace(fmt + $"Unk204: 0x{Unk204:X}"); b.AppendLineSpace(fmt + $"Unk208: 0x{Unk208:X}"); b.AppendLineSpace(fmt + $"Unk20C: 0x{Unk20C:X}"); b.AppendLine(); b.AppendLineSpace(fmt + $"Unk254: 0x{Unk254:X}"); return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLineSpace(SA1SigArea.ToString(formatted, "SKSA.SA1SigArea")); if (SA2IsValid) { b.AppendLine(); b.AppendLineSpace(SA2SigArea.ToString(formatted, "SKSA.SA2SigArea")); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcUpdateSegment"); b.AppendLine(); string fmt = formatted ? " " : ""; b.AppendLineSpace(fmt + $"PageNum: 0x{PageNum:X} (@ 0x{XvdMath.PageNumberToOffset(PageNum)})"); b.AppendLineSpace(fmt + $"Hash: 0x{Hash:X}"); return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcUpdateSegmentInfo"); b.AppendLine(); string fmt = formatted ? " " : ""; b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); b.AppendLineSpace(fmt + "Unknown3: 0x" + Unknown3.ToString("X")); return(b.ToString()); }
public string ToString(bool formatted, string header = "iQuePrivateData") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; b.AppendLineSpace(fmt + $"BB Model: {BBModelString}"); b.AppendLineSpace(fmt + $"BBID: 0x{BBID:X}"); b.AppendLineSpace(fmt + $"Timestamp: {TimestampDateTime} ({Timestamp})"); b.AppendLineSpace(fmt + $"SecureContentId: {SecureContentId}"); b.AppendLineSpace(fmt + $"CrlVersion: {CrlVersion}"); return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcRegionSpecifier"); b.AppendLine(); string fmt = formatted ? " " : ""; b.AppendLineSpace(fmt + $"Region ID: 0x{(uint)RegionId:X} {RegionId})"); b.AppendLineSpace(fmt + $"Key: {Key}"); b.AppendLineSpace(fmt + $"Value: {Key}"); if (Padding4 != 0) { b.AppendLineSpace(fmt + $"Padding4: 0x{Padding4:X}"); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XbfsEntry:"); string fmt = formatted ? " " : ""; if (!Padding.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Padding != null"); } b.AppendLine(); b.AppendLineSpace(fmt + "LBA: 0x" + LBA.ToString("X") + " (0x" + (LBA * 0x1000).ToString("X") + ")"); b.AppendLineSpace(fmt + "Length: 0x" + Length.ToString("X") + " (0x" + (Length * 0x1000).ToString("X") + ")"); b.AppendLineSpace(fmt + "Padding: " + Padding.ToHexString()); return(b.ToString()); }
public string ToString(bool formatted, string header = "BbRsaCert") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; if (iQueCertCollection.MainCollection == null) { b.AppendLineSpace(fmt + $"(Unable to verify RSA signature: cert.sys not found)"); } else { b.AppendLineSpace(fmt + $"(RSA signature {(IsSignatureValid ? "validated" : "appears invalid")})"); } b.AppendLineSpace(fmt + $"CertName: {CertNameString} ({(string.IsNullOrEmpty(AuthorityString) ? CertNameString : $"{AuthorityString}-{CertNameString}")})");
public string ToString(bool formatted, string header = "OSBbSaGameMetaData") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; // some stuff to alert me of unks that are different if (ThumbImgLength > 0x4000) { b.AppendLineSpace(fmt + "ThumbImgLength > 0x4000! (invalid?)"); } if (TitleImgLength > 0x10000) // unsure how this can even be possible, but it seems to get checked anyway { b.AppendLineSpace(fmt + "TitleImgLength > 0x10000! (invalid?)"); } if (ContentMetadata.ContentId > 99999999) { b.AppendLineSpace(fmt + "Ticket.ContentId > 99999999! (invalid?)"); } b.AppendLine(); b.AppendLineSpace(LaunchMetadata.ToString(formatted, header + ".LaunchMetadata")); b.AppendLineSpace(fmt + $"ThumbImgLength: {ThumbImgLength}"); b.AppendLineSpace(fmt + $"TitleImgLength: {TitleImgLength}"); b.AppendLine(); b.AppendLineSpace(fmt + "TitleName: " + TitleName + (!String.IsNullOrEmpty(ISBN) ? $" ({ISBN})" : "")); b.AppendLine(); b.AppendLineSpace(ContentMetadata.ToString(formatted, header + ".ContentMetadata")); b.AppendLine(); b.AppendLineSpace(Ticket.ToString(formatted, header + ".Ticket")); return(b.ToString()); }
public string ToString(bool formatted, string header = "BbCrlHead") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; if (UnusedPadding != 0) { b.AppendLineSpace(fmt + $"UnusedPadding != 0! (0x{UnusedPadding:X8})"); } b.AppendLineSpace(fmt + $"CertName: {CertNameString}"); b.AppendLineSpace(fmt + $"Authority: {AuthorityString}"); b.AppendLineSpace(fmt + $"Type: {Type}"); b.AppendLineSpace(fmt + $"SigType: {SigType}"); b.AppendLineSpace(fmt + $"VersionNumber: {VersionNumber}"); b.AppendLineSpace(fmt + $"Timestamp: {TimestampDateTime} ({Timestamp})"); b.AppendLineSpace(fmt + $"NumRevoked: {NumRevoked}"); b.AppendLine(); b.AppendLineSpace(fmt + "Signature:" + Environment.NewLine + fmt + Signature.ToHexString()); var decSig = DecryptedSignature; if (decSig != null) { b.AppendLine(); b.AppendLineSpace(fmt + "Expected Hash (decrypted from signature):" + Environment.NewLine + fmt + decSig.ToHexString()); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcRegionHeader (ID/EncryptionIV: 0x" + Id.ToString("X8") + "):"); string fmt = formatted ? " " : ""; if(Unknown1 != 0) b.AppendLineSpace(fmt + "Unknown1 != 0"); if (Unknown2 != 0) b.AppendLineSpace(fmt + "Unknown2 != 0"); if (Unknown3 != 0) b.AppendLineSpace(fmt + "Unknown3 != 0"); if (Unknown4 != 0) b.AppendLineSpace(fmt + "Unknown4 != 0"); if (Unknown5 != 0) b.AppendLineSpace(fmt + "Unknown5 != 0"); string keyid = KeyId.ToString("X"); if (KeyId == 0xFFFF) keyid += " (not encrypted)"; b.AppendLineSpace(fmt + "Description: " + Description.Replace("\0", "")); b.AppendLineSpace(fmt + "Key ID: 0x" + keyid); b.AppendLineSpace(fmt + "Flags: 0x" + Flags.ToString("X")); b.AppendLineSpace(fmt + "Offset: 0x" + Offset.ToString("X")); b.AppendLineSpace(fmt + "Length: 0x" + Length.ToString("X")); b.AppendLineSpace(fmt + "Region PDUID: 0x" + RegionPDUID.ToString("X")); b.AppendLine(); b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); b.AppendLineSpace(fmt + "Unknown3: 0x" + Unknown3.ToString("X")); b.AppendLineSpace(fmt + "Unknown4: 0x" + Unknown4.ToString("X")); b.AppendLineSpace(fmt + "Unknown5: 0x" + Unknown5.ToString("X")); return b.ToString(); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvdHeader:"); string fmt = formatted ? " " : ""; if (FormatVersion != 3) { b.AppendLineSpace(fmt + "FormatVersion != 3"); } if (Unknown1_HashTableRelated != 1) { b.AppendLineSpace(fmt + "Unknown1 != 1"); } if (Unknown2 != 0xAA000) { b.AppendLineSpace(fmt + "Unknown2 != 0xAA000"); } if (!Unknown3.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Unknown3 != null"); } if (Unknown4 != 0) { b.AppendLineSpace(fmt + "Unknown4 != 0"); } if (!Unknown5.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Unknown5 != null"); } if (Unknown6 != 0) { b.AppendLineSpace(fmt + "Unknown6 != 0"); } if (Unknown7 != 0) { b.AppendLineSpace(fmt + "Unknown7 != 0"); } if (!Unknown8.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Unknown8 != null"); } if (Unknown9 != 0) { b.AppendLineSpace(fmt + "Unknown9 != 0"); } if (!Reserved.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Reserved != null"); } if (!Enum.IsDefined(typeof(XvdContentType), ContentType)) { b.AppendLineSpace(fmt + "Unknown content type 0x" + ContentType.ToString("X")); } b.AppendLineSpace(fmt + (IsSignedWithRedKey ? "Signed" : "Not signed") + " with red key"); if (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.SystemFile)) { b.AppendLineSpace(fmt + "System file"); } b.AppendLineSpace(fmt + "Read-only flag " + (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.ReadOnly) ? "set" : "not set")); b.AppendLineSpace(fmt + (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.EncryptionDisabled) ? "Decrypted" : "Encrypted")); b.AppendLineSpace(fmt + (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.DataIntegrityDisabled) ? "Data integrity disabled (doesn't use hash tree)" : "Data integrity enabled (uses hash tree)")); b.AppendLineSpace(fmt + "Unknown flag 0x40 " + (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.Unknown) ? "set" : "not set")); b.AppendLine(); b.AppendLineSpace(fmt + "Magic: " + new string(Magic)); b.AppendLineSpace(fmt + "Volume Flags: 0x" + VolumeFlags.ToString("X")); string contentType = "0x" + ContentType.ToString("X") + " (" + ((XvdContentType)ContentType) + ")"; b.AppendLineSpace(fmt + "File Time Created: " + DateTime.FromFileTime(FileTimeCreated)); b.AppendLineSpace(fmt + "Drive Size: 0x" + DriveSize.ToString("X")); b.AppendLineSpace(fmt + "Format Version: 0x" + FormatVersion.ToString("X")); b.AppendLineSpace(fmt + String.Format("VDUID / Drive Id: {0} (UDUID / User Id: {1})", new Guid(VDUID), new Guid(UDUID))); b.AppendLineSpace(fmt + "Content Type: " + contentType); b.AppendLineSpace(fmt + "Embedded XVD PDUID/Build Id: " + new Guid(EmbeddedXVD_PDUID)); b.AppendLineSpace(fmt + "Embedded XVD Length: 0x" + EmbeddedXVDLength.ToString("X")); b.AppendLineSpace(fmt + "User Data Length: 0x" + UserDataLength.ToString("X")); b.AppendLineSpace(fmt + "XVC Data Length: 0x" + XvcDataLength.ToString("X")); b.AppendLineSpace(fmt + "Dynamic Header Length: 0x" + DynamicHeaderLength.ToString("X")); b.AppendLineSpace(fmt + "Top Hash Block Hash:" + Environment.NewLine + fmt + TopHashBlockHash.ToHexString()); b.AppendLineSpace(fmt + "Original XVC Data Hash:" + Environment.NewLine + fmt + OriginalXvcDataHash.ToHexString()); b.AppendLineSpace(fmt + "Sandbox Id: " + new string(SandboxId).Replace("\0", "")); b.AppendLineSpace(fmt + "Product Id: " + new Guid(ProductId)); b.AppendLineSpace(fmt + "PDUID/Build Id: " + new Guid(PDUID)); b.AppendLineSpace(fmt + String.Format("Package Version: {3}.{2}.{1}.{0}", PackageVersion1, PackageVersion2, PackageVersion3, PackageVersion4)); b.AppendLineSpace(fmt + String.Format("Required System Version: {3}.{2}.{1}.{0}", RequiredSystemVersion1, RequiredSystemVersion2, RequiredSystemVersion3, RequiredSystemVersion4)); b.AppendLineSpace(fmt + "Encrypted CIK:" + Environment.NewLine + fmt + EncryptedCIK.ToHexString()); b.AppendLineSpace(fmt + "PECatalogInfo0: 0x" + PECatalogInfo0.ToString("X")); string catalogInfo1 = ""; foreach (ulong catalogInfo in PECatalogInfo1) { catalogInfo1 += "0x" + catalogInfo.ToString("X") + " "; } b.AppendLine(fmt + "PECatalogInfo1: " + catalogInfo1); string catalogInfo2 = ""; foreach (ulong catalogInfo in PECatalogInfo2) { catalogInfo2 += "0x" + catalogInfo.ToString("X") + " "; } b.AppendLine(fmt + "PECatalogInfo2: " + catalogInfo2); b.AppendLine(fmt + "PECatalogInfo3: "); b.Append(fmt); foreach (ulong catalogInfo in PECatalogInfo3) { b.Append("0x" + catalogInfo.ToString("X") + " "); } b.AppendLine(); b.AppendLine(); b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1_HashTableRelated.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); b.AppendLineSpace(fmt + "Unknown3:" + Environment.NewLine + fmt + Unknown3.ToHexString()); b.AppendLineSpace(fmt + "Unknown4: 0x" + Unknown4.ToString("X")); b.AppendLineSpace(fmt + "Unknown5:" + Environment.NewLine + fmt + Unknown5.ToHexString()); b.AppendLineSpace(fmt + "Unknown6: 0x" + Unknown6.ToString("X")); b.AppendLineSpace(fmt + "Unknown7: 0x" + Unknown7.ToString("X")); b.AppendLineSpace(fmt + "Unknown8: " + Environment.NewLine + fmt + Unknown8.ToHexString()); b.AppendLineSpace(fmt + "Unknown9: 0x" + Unknown9.ToString("X")); if (!Reserved.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Reserved: " + Environment.NewLine + fmt + Reserved.ToHexString()); } return(b.ToString()); }
public string ToString(bool formatted, string header = "BbContentMetaDataHead") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; if (UnusedPadding != 0) { b.AppendLineSpace(fmt + $"UnusedPadding != 0! (0x{UnusedPadding:X8})"); } if (iQueCertCollection.MainCollection == null) { b.AppendLineSpace(fmt + $"(Unable to verify RSA signature: cert.sys not found)"); } else { b.AppendLineSpace(fmt + $"(RSA signature {(IsSignatureValid ? "validated" : "appears invalid")})"); } b.AppendLine(); b.AppendLineSpace(fmt + $"ContentId: {ContentId} (title: {TitleId}v{TitleVersion})"); b.AppendLineSpace(fmt + $"ContentSize: {ContentSize}"); b.AppendLineSpace(fmt + "ContentHash:" + Environment.NewLine + fmt + ContentHash.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + $"ContentFlags: 0x{ContentFlags:X8}"); b.AppendLineSpace(fmt + $"ExecutionFlags: 0x{ExecutionFlags:X8}"); b.AppendLineSpace(fmt + $"AccessRights: 0x{AccessRights:X8}"); b.AppendLineSpace(fmt + $"KernelRights: 0x{KernelRights:X8}"); if (BoundBBID != 0) // only output BoundBBID if it's actually set { b.AppendLineSpace(fmt + $"BoundBBID: {BoundBBID}"); } b.AppendLine(); b.AppendLineSpace(fmt + "TitleKey:" + Environment.NewLine + fmt + TitleKey.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "TitleKeyIV:" + Environment.NewLine + fmt + TitleKeyIV.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "EncryptionIV:" + Environment.NewLine + fmt + EncryptionIV.ToHexString()); b.AppendLineSpace(fmt + $"Authority: {AuthorityString}"); b.AppendLine(); b.AppendLineSpace(fmt + "Signature:" + Environment.NewLine + fmt + Signature.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "Ticket Hash:" + Environment.NewLine + fmt + TicketHash.ToHexString()); var decSig = DecryptedSignature; if (decSig != null) { b.AppendLine(); b.AppendLineSpace(fmt + "Expected Hash (decrypted from signature):" + Environment.NewLine + fmt + decSig.ToHexString()); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvdHeader:"); string fmt = formatted ? " " : ""; if (!Enum.IsDefined(typeof(XvdContentType), ContentType)) { b.AppendLineSpace(fmt + $"Unknown content type 0x{ContentType:X}"); } b.AppendLineSpace(fmt + $"Signed by: {SignedBy}"); b.AppendLineSpace(fmt + $"Using ODK keyslot: {ODKKeyslotID}"); b.AppendLineSpace(fmt + $"Read-only flag {(VolumeFlags.HasFlag(XvdVolumeFlags.ReadOnly) ? "set" : "not set")}"); b.AppendLineSpace(fmt + (VolumeFlags.HasFlag(XvdVolumeFlags.EncryptionDisabled) ? "Decrypted" : "Encrypted")); b.AppendLineSpace(fmt + (VolumeFlags.HasFlag(XvdVolumeFlags.DataIntegrityDisabled) ? "Data integrity disabled (doesn't use hash tree)" : "Data integrity enabled (uses hash tree)")); b.AppendLineSpace(fmt + (VolumeFlags.HasFlag(XvdVolumeFlags.LegacySectorSize) ? "Legacy Sector Size (512 bytes)" : "Sector Size (4096 bytes)")); b.AppendLineSpace(fmt + $"ResiliencyEnabled {(VolumeFlags.HasFlag(XvdVolumeFlags.ResiliencyEnabled) ? "set" : "not set")}"); b.AppendLineSpace(fmt + $"SraReadOnly {(VolumeFlags.HasFlag(XvdVolumeFlags.SraReadOnly) ? "set" : "not set")}"); b.AppendLineSpace(fmt + $"RegionIdInXts {(VolumeFlags.HasFlag(XvdVolumeFlags.RegionIdInXts) ? "set" : "not set")}"); b.AppendLineSpace(fmt + $"EraSpecific {(VolumeFlags.HasFlag(XvdVolumeFlags.EraSpecific) ? "set" : "not set")}"); b.AppendLine(); b.AppendLineSpace(fmt + $"Magic: {new string(Magic)}"); b.AppendLineSpace(fmt + $"Volume Flags: 0x{VolumeFlags:X}"); b.AppendLineSpace(fmt + $"Format Version: 0x{FormatVersion:X}"); b.AppendLineSpace(fmt + $"File Time Created: {DateTime.FromFileTime(FileTimeCreated)}"); b.AppendLineSpace(fmt + $"Drive Size: 0x{DriveSize:X}"); b.AppendLineSpace(fmt + $"VDUID / Drive Id: {new Guid(VDUID)}"); b.AppendLineSpace(fmt + $"UDUID / User Id: {new Guid(UDUID)}"); b.AppendLineSpace(fmt + $"Top Hash Block Hash: {Environment.NewLine}{fmt}{TopHashBlockHash.ToHexString()}"); b.AppendLineSpace(fmt + $"Original XVC Data Hash: {Environment.NewLine}{fmt}{OriginalXvcDataHash.ToHexString()}"); b.AppendLineSpace(fmt + $"XvdType: {Type}"); b.AppendLineSpace(fmt + $"Content Type: 0x{ContentType:X} ({ContentType})"); b.AppendLineSpace(fmt + $"Embedded XVD PDUID/Build Id: {new Guid(EmbeddedXVD_PDUID)}"); b.AppendLineSpace(fmt + $"Embedded XVD Length: 0x{EmbeddedXVDLength:X}"); b.AppendLineSpace(fmt + $"User Data Length: 0x{UserDataLength:X}"); b.AppendLineSpace(fmt + $"XVC Data Length: 0x{XvcDataLength:X}"); b.AppendLineSpace(fmt + $"Dynamic Header Length: 0x{DynamicHeaderLength:X}"); b.AppendLineSpace(fmt + $"BlockSize: 0x{BlockSize:X}"); b.AppendLineSpace(fmt + $"Ext Entries: {ExtEntries.Count(e => !e.IsEmpty)}"); foreach (XvdExtEntry entry in ExtEntries.Where(e => !e.IsEmpty)) { b.AppendLineSpace(fmt + entry.ToString(true)); } b.AppendLineSpace(fmt + $"Capabilities: {Capabilities.ToHexString()}"); b.AppendLineSpace(fmt + $"PE Catalog Hash: {PECatalogHash.ToHexString()}"); b.AppendLineSpace(fmt + $"Userdata hash: {UserDataHash.ToHexString()}"); b.AppendLineSpace(fmt + $"PE Catalog Caps: {PECatalogCaps.ToHexString()}"); b.AppendLineSpace(fmt + $"PE Catalogs: {PECatalogs.ToHexString()}"); b.AppendLineSpace(fmt + $"Writeable Expiration Date: 0x{WriteableExpirationDate:X}"); b.AppendLineSpace(fmt + $"Writeable Policy flags: 0x{WriteablePolicyFlags:X}"); b.AppendLineSpace(fmt + $"Persistent Local storage length: 0x{PersistentLocalStorageSize:X}"); b.AppendLineSpace(fmt + $"Mutable data page count: 0x{MutableDataPageCount:X} (0x{MutableDataLength:X} bytes)"); b.AppendLineSpace(fmt + $"Sandbox Id: {new string(SandboxId).Replace("\0", "")}"); b.AppendLineSpace(fmt + $"Product Id: {new Guid(ProductId)}"); b.AppendLineSpace(fmt + $"PDUID/Build Id: {new Guid(PDUID)}"); b.AppendLineSpace(fmt + $"Sequence Number: {SequenceNumber}"); b.AppendLineSpace(fmt + $"Package Version: {PackageVersion4}.{PackageVersion3}.{PackageVersion2}.{PackageVersion1}"); b.AppendLineSpace(fmt + $"Required System Version: {RequiredSystemVersion4}.{RequiredSystemVersion3}.{RequiredSystemVersion2}.{RequiredSystemVersion1}"); b.AppendLineSpace(fmt + $"ODK Keyslot ID: {ODKKeyslotID}"); b.AppendLineSpace(fmt + $"KeyMaterial: {Environment.NewLine}{fmt}{KeyMaterial.ToHexString()}"); b.AppendLineSpace(fmt + $"Resilient Data offset: 0x{ResilientDataOffset:X}"); b.AppendLineSpace(fmt + $"Resilient Data length: 0x{ResilientDataLength:X}"); if (Unknown271 != 0) { b.AppendLineSpace(fmt + $"Unknown271: 0x{Unknown271:X}"); } if (!Unknown272.IsArrayEmpty()) { b.AppendLineSpace(fmt + $"Unknown272: {Unknown272.ToHexString()}"); } if (!Reserved13C.IsArrayEmpty()) { b.AppendLineSpace(fmt + $"Reserved13C: {Environment.NewLine}{fmt}{Reserved13C.ToHexString()}"); } if (!Reserved13C.IsArrayEmpty()) { b.AppendLineSpace(fmt + $"Reserved13C: {Environment.NewLine}{fmt}{Reserved13C.ToHexString()}"); } if (!Reserved2A0.IsArrayEmpty()) { b.AppendLineSpace(fmt + $"Reserved2A0: {Environment.NewLine}{fmt}{Reserved2A0.ToHexString()}"); } return(b.ToString()); }
public string ToString(bool formatted) { string fmt = formatted ? " " : ""; var b = new StringBuilder(); b.AppendLineSpace("BootCapabilityCert:"); if (StructId == 0x00) { b.AppendLineSpace(fmt + "! No or invalid certificate (StructId: 0)\n"); return(b.ToString()); } b.AppendLineSpace(fmt + $"StructId: 0x{StructId:X}"); b.AppendLineSpace(fmt + $"Size: {Size} (0x{Size:X})"); b.AppendLineSpace(fmt + $"IssuerKeyId: {IssuerKeyId} (0x{IssuerKeyId:X})"); b.AppendLineSpace(fmt + $"IssueDate: {IssueDateTime}"); b.AppendLineSpace(fmt + $"SocId: {Environment.NewLine}{fmt}{SocId.ToHexString()}"); b.AppendLineSpace(fmt + $"GenerationId: {GenerationId} (0x{GenerationId:X})"); b.AppendLineSpace(fmt + $"AllowedStates: {AllowedStates} (0x{AllowedStates:X})"); b.AppendLineSpace(fmt + $"LastCapability: {LastCapability} (0x{LastCapability:X})"); b.AppendLineSpace(fmt + $"Flags: {Flags} (0x{Flags:X})"); var expiry = $"{ExpireCentury}{ExpireYear:00}-{ExpireMonth:00}-{ExpireDayOfMonth:00} {ExpireHour:00}:{ExpireMinute:00}:{ExpireSecond:00}"; if (ExpireCentury == 255) { expiry = "never!"; } b.AppendLineSpace(fmt + $"Expiration date: {expiry}"); b.AppendLineSpace(fmt + $"MinimumSpVersion: {MinimumSpVersion} (0x{MinimumSpVersion:X})"); b.AppendLineSpace(fmt + $"Minimum2blVersion: {Minimum2blVersion} (0x{Minimum2blVersion:X})"); b.AppendLineSpace(fmt + $"Nonce: {Environment.NewLine}{fmt}{Nonce.ToHexString()}"); b.AppendLineSpace(fmt + $"Reserved: {Environment.NewLine}{fmt}{Reserved.ToHexString()}"); b.AppendLineSpace(fmt + $"RsaSignature: {Environment.NewLine}{fmt}{RsaSignature.ToHexString()}"); b.AppendLineSpace(fmt + "Boot Capabilities:"); for (int i = 0; i < Capabilities.Length; i++) { BootCapability cap = Capabilities[i]; if (cap == BootCapability.CERT_CAP_NONE || cap == BootCapability.CERT_CAP_DELETED) { continue; } b.AppendLine($"{fmt}-{cap}"); } b.AppendLine(); return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); string fmt = formatted ? " " : ""; b.AppendLine("XvdMiscInfo:"); b.AppendLineSpace(fmt + "Block Count: 0x" + XvdDataBlockCount.ToString("X")); if (Header.EmbeddedXVDLength > 0) b.AppendLineSpace(fmt + "Embedded XVD Offset: 0x3000"); if(Header.UserDataLength > 0) b.AppendLineSpace(fmt + "User Data Offset: 0x" + UserDataOffset.ToString("X")); b.AppendLineSpace(fmt + "XVD Data Offset: 0x" + DataOffset.ToString("X")); if (IsDataIntegrityEnabled) { b.AppendLineSpace(fmt + "Hash Tree Block Count: 0x" + HashTreeBlockCount.ToString("X")); b.AppendLineSpace(fmt + "Hash Tree Levels: 0x" + HashTreeLevels.ToString("X")); b.AppendLineSpace(fmt + "Hash Tree Valid: " + (HashTreeValid ? "true" : "false")); if (!DisableDataHashChecking) b.AppendLineSpace(fmt + "Data Hash Tree Valid: " + (DataHashTreeValid ? "true" : "false")); } if(IsXvcFile) b.AppendLineSpace(fmt + "XVC Data Hash Valid: " + (XvcDataHashValid ? "true" : "false")); b.AppendLine(); b.Append(Header.ToString(formatted)); if (XvcInfo.ContentID == null) return b.ToString(); b.AppendLine(); if (formatted) { byte[] decryptKey; string licenseFile = GetXvcKey(0, out decryptKey); if (!String.IsNullOrEmpty(licenseFile)) { if (licenseFile != "testsigned") b.AppendLine("Decrypt key from license file " + licenseFile + " (key is wrong though until the obfuscation/encryption on it is figured out)"); else b.AppendLine("Decrypt key for test-signed package:"); b.AppendLine(decryptKey.ToHexString()); b.AppendLine(); } } b.AppendLine(XvcInfo.ToString(formatted)); if(RegionHeaders != null) for (int i = 0; i < RegionHeaders.Count; i++) { b.AppendLine(); b.AppendLine("Region " + i); b.Append(RegionHeaders[i].ToString(formatted)); } if (RegionHeaders != null) for (int i = 0; i < UpdateSegments.Count; i++) { if (UpdateSegments[i].Unknown1 == 0) break; b.AppendLine(); b.AppendLine("Update Segment " + i); b.Append(UpdateSegments[i].ToString(formatted)); } return b.ToString(); }
public string ToString(bool formatted, string header = "BbTicketHead") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; if (UnusedReserved != 0) { b.AppendLineSpace(fmt + $"UnusedReserved != 0! (0x{UnusedReserved:X4})"); } b.AppendLine(); b.AppendLineSpace(fmt + $"BBID: 0x{BBID:X}"); string ticketType = ""; if (IsTicketGlobal) { ticketType = "global"; } else if (IsTicketLimitedPlay) { ticketType = "limited play"; } else if (IsTicketPermanent) { ticketType = "permanent"; } b.AppendLineSpace(fmt + $"TicketId: 0x{TicketId:X8} ({ticketType} ticket)"); string trialType = TrialType == 1 ? "launch count" : (TrialType == 2 ? "time-limited" : "time-limited or not trial"); b.AppendLineSpace(fmt + $"TrialType: {TrialType} ({trialType})"); b.AppendLineSpace(fmt + $"TSCRLVersion / ticket_crl_version: {TSCRLVersion}"); b.AppendLine(); b.AppendLineSpace(fmt + "CMD_IV / titlekey_iv:" + Environment.NewLine + fmt + CMD_IV.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "ServerECCKey:" + Environment.NewLine + fmt + ServerECCKey.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + $"Authority: {AuthorityString}"); b.AppendLine(); b.AppendLineSpace(fmt + "Signature:" + Environment.NewLine + fmt + Signature.ToHexString()); var decSig = DecryptedSignature; if (decSig != null) { b.AppendLine(); b.AppendLineSpace(fmt + "Expected Hash (decrypted from signature):" + Environment.NewLine + fmt + decSig.ToHexString()); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcUpdateSegmentInfo"); b.AppendLine(); string fmt = formatted ? " " : ""; b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); b.AppendLineSpace(fmt + "Unknown3: 0x" + Unknown3.ToString("X")); return b.ToString(); }
public string ToString(bool formatted, string header = "iQueETicket") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; if (iQueCertCollection.MainCollection == null) { b.AppendLineSpace(fmt + $"(Unable to verify RSA signature: cert.sys not found)"); } else { b.AppendLineSpace(fmt + $"(RSA signature {(IsSignatureValid ? "validated" : "appears invalid")})"); } b.AppendLine(); b.AppendLineSpace(fmt + $"Authority: {AuthorityString}"); b.AppendLineSpace(fmt + $"ContentId: {ContentId}"); b.AppendLineSpace(fmt + $"ContentSize: {ContentSize}"); b.AppendLineSpace(fmt + "ContentHash:" + Environment.NewLine + fmt + ContentHash.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "TitleKey?:" + Environment.NewLine + fmt + TitleKey.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "TitleKeyAlt?:" + Environment.NewLine + fmt + TitleKeyAlt.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "Signature:" + Environment.NewLine + fmt + Signature.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "Unk2800:" + Environment.NewLine + fmt + Unk2800.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + $"Unk2808: 0x{Unk2808:X}"); b.AppendLineSpace(fmt + $"Unk2810: 0x{Unk2810:X}"); b.AppendLine(); b.AppendLineSpace(fmt + "Unk2814:" + Environment.NewLine + fmt + Unk2814.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + $"Unk2848: 0x{Unk2848:X}"); b.AppendLineSpace(fmt + $"Unk284C: 0x{Unk284C:X}"); b.AppendLineSpace(fmt + $"Unk2850: 0x{Unk2850:X}"); b.AppendLineSpace(fmt + $"Unk2854: 0x{Unk2854:X}"); return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvdFilesystem:"); string fmt = formatted ? " " : ""; if (_xvdFile.IsEncrypted) { b.AppendLineSpace(fmt + "Cannot get XvdFilesystem info from encrypted package"); return(b.ToString()); } var disk = OpenDisk(); if (disk == null) { b.AppendLineSpace(fmt + "No partition table found on disk!"); return(b.ToString()); } b.AppendLineSpace(fmt + "Partitions:"); var partitions = disk.Partitions; for (int i = 0; i < partitions.Count; i++) { var part = partitions[i]; b.AppendLineSpace(fmt + fmt + $"- Partition {i}:"); b.AppendLineSpace(fmt + fmt + fmt + $" BIOS-type: {part.TypeAsString} ({part.BiosType} / 0x{part.BiosType:X})"); b.AppendLineSpace(fmt + fmt + fmt + $" GUID-type: {part.GuidType}"); b.AppendLineSpace(fmt + fmt + fmt + $" First sector: {part.FirstSector} (0x{part.FirstSector:X})"); b.AppendLineSpace(fmt + fmt + fmt + $" Last sector: {part.LastSector} (0x{part.LastSector:X})"); b.AppendLineSpace(fmt + fmt + fmt + $" Sector count: {part.SectorCount} (0x{part.SectorCount:X})"); b.AppendLine(); } b.AppendLineSpace(fmt + "Filesystem content:"); try { for (int partitionNumber = 0; partitionNumber < partitions.Count; partitionNumber++) { b.AppendLineSpace(fmt + fmt + $":: Partition {partitionNumber}:"); foreach (var file in IterateFilesystem(partitionNumber)) { b.AppendLineSpace(fmt + fmt + FileInfoToString(file)); } } } catch (Exception e) { b.AppendLineSpace(fmt + fmt + $"Failed to list filesystem content. Error: {e}"); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XbfsHeader:"); string fmt = formatted ? " " : ""; if (Version != 1) { b.AppendLineSpace(fmt + "Version != 1"); } if (Unknown1 != 3) { b.AppendLineSpace(fmt + "Unknown1 != 3"); } if (Unknown2 != 0) { b.AppendLineSpace(fmt + "Unknown2 != 0"); } if (Unknown3 != 0) { b.AppendLineSpace(fmt + "Unknown3 != 0"); } if (Unknown4 != 0) { b.AppendLineSpace(fmt + "Unknown4 != 0"); } if (!Unknown5.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Unknown5 != null"); } if (!Unknown6.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Unknown6 != null"); } if (!Unknown7.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Unknown7 != null"); } b.AppendLine(); b.AppendLineSpace(fmt + "Magic: " + new string(Magic)); b.AppendLineSpace(fmt + "Version: 0x" + Version.ToString("X")); b.AppendLineSpace(fmt + "Boot Slot: 0x" + BootSlot.ToString("X")); b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); b.AppendLineSpace(fmt + "Unknown3: 0x" + Unknown3.ToString("X")); b.AppendLineSpace(fmt + "Unknown4: 0x" + Unknown4.ToString("X")); b.AppendLineSpace(fmt + "Unknown5: 0x" + Unknown5.ToHexString()); b.AppendLineSpace(fmt + "Unknown6: 0x" + Unknown6.ToHexString()); b.AppendLineSpace(fmt + "Unknown7: 0x" + Unknown7.ToHexString()); b.AppendLineSpace(fmt + "XBFS header hash: " + Environment.NewLine + fmt + XbfsHash.ToHexString()); for (int i = 0; i < Entries.Length; i++) { XbfsEntry entry = Entries[i]; b.AppendLine("Entry " + i); b.Append(entry.ToString(formatted)); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcInfo:"); string fmt = formatted ? " " : ""; if (Flags != 0) { b.AppendLineSpace(fmt + "Flags != 0"); } if (PaddingD1C != 0) { b.AppendLineSpace(fmt + "PaddingD1C != 0"); } if (UnknownD20 != 0) { b.AppendLineSpace(fmt + "UnknownD20 != 0"); } if (PreviewRegionId != 0) { b.AppendLineSpace(fmt + "PreviewRegionId != 0"); } if (PreviewOffset != 0) { b.AppendLineSpace(fmt + "PreviewOffset != 0"); } if (UnusedSpace != 0) { b.AppendLineSpace(fmt + "UnusedSpace != 0"); } if (!ReservedD54.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Reserved != null"); } var signType = "Unsigned/not crypted (/LU)"; if (KeyCount > 0) { if (IsUsingTestCik) { signType = "Test-crypted (/LT)"; } else if (!IsAnyKeySet) { signType = "Unsigned with KeyCount > 0"; } else { signType = "Submission-crypted (not using test key) (/L)"; } } b.AppendLineSpace(fmt + signType); b.AppendLineSpace(fmt + $"/updcompat type {(UpdateSegmentCount == 0 ? "1" : "2")}"); b.AppendLine(); b.AppendLineSpace(fmt + $"ContentID: {new Guid(ContentID)}"); for (int i = 0; i < EncryptionKeyIds.Length; i++) { if (!EncryptionKeyIds[i].IsKeyNulled) { b.AppendLineSpace(fmt + $"Encryption Key {i} GUID: {new Guid(EncryptionKeyIds[i].KeyId)}"); } } b.AppendLine(); b.AppendLineSpace(fmt + $"Description: {Encoding.Unicode.GetString(Description).Replace("\0", "")}"); b.AppendLineSpace(fmt + $"Version: 0x{Version:X}"); b.AppendLineSpace(fmt + $"Region Count: 0x{RegionCount:X}"); b.AppendLineSpace(fmt + $"Flags: 0x{Flags:X}"); b.AppendLineSpace(fmt + $"Key Count: 0x{KeyCount:X}"); b.AppendLineSpace(fmt + $"InitialPlay Region Id: 0x{InitialPlayRegionId:X}"); b.AppendLineSpace(fmt + $"InitialPlay Offset: 0x{InitialPlayOffset:X}"); b.AppendLineSpace(fmt + $"File Time Created: {DateTime.FromFileTime(FileTimeCreated)}"); b.AppendLineSpace(fmt + $"Preview Region Id: 0x{PreviewRegionId:X}"); b.AppendLineSpace(fmt + $"Update Segment Count: {UpdateSegmentCount}"); b.AppendLineSpace(fmt + $"Preview Offset: 0x{PreviewOffset:X}"); b.AppendLineSpace(fmt + $"Unused Space: 0x{UnusedSpace:X}"); b.AppendLine(); if (PaddingD1C != 0) { b.AppendLineSpace(fmt + $"PaddingD1C: 0x{PaddingD1C:X}"); } if (UnknownD20 != 0) { b.AppendLineSpace(fmt + $"UnknownD20: 0x{UnknownD20:X}"); } if (!ReservedD54.IsArrayEmpty()) { b.AppendLineSpace(fmt + $"ReservedD54: {Environment.NewLine}{fmt}{ReservedD54.ToHexString()}"); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine($"XvcRegionHeader (ID/EncryptionIV: 0x{(uint)Id:X} {Id}):"); string fmt = formatted ? " " : ""; if (Padding6 != 0) { b.AppendLineSpace(fmt + "Padding6 != 0"); } if (Unknown68 != 0) { b.AppendLineSpace(fmt + "Unknown68 != 0"); } if (Unknown70 != 0) { b.AppendLineSpace(fmt + "Unknown70 != 0"); } if (Unknown78 != 0) { b.AppendLineSpace(fmt + "Unknown78 != 0"); } string keyid = KeyId.ToString("X"); if (KeyId == XvcConstants.XVC_KEY_NONE) { keyid += " (not encrypted)"; } b.AppendLineSpace(fmt + $"Description: {Description.Replace("\0", "")}"); b.AppendLineSpace(fmt + $"Key ID: 0x{keyid}"); b.AppendLineSpace(fmt + $"Flags: 0x{(uint)Flags:X}"); if (Flags.HasFlag(XvcRegionFlags.Resident)) { b.AppendLineSpace(fmt + " - Resident"); } if (Flags.HasFlag(XvcRegionFlags.InitialPlay)) { b.AppendLineSpace(fmt + " - InitialPlay"); } if (Flags.HasFlag(XvcRegionFlags.Preview)) { b.AppendLineSpace(fmt + " - Preview"); } if (Flags.HasFlag(XvcRegionFlags.FileSystemMetadata)) { b.AppendLineSpace(fmt + " - FileSystemMetadata"); } if (Flags.HasFlag(XvcRegionFlags.Present)) { b.AppendLineSpace(fmt + " - Present"); } if (Flags.HasFlag(XvcRegionFlags.OnDemand)) { b.AppendLineSpace(fmt + " - OnDemand"); } if (Flags.HasFlag(XvcRegionFlags.Available)) { b.AppendLineSpace(fmt + " - Available"); } b.AppendLineSpace(fmt + $"Offset: 0x{Offset:X}"); b.AppendLineSpace(fmt + $"Length: 0x{Length:X}"); b.AppendLineSpace(fmt + $"Hash: 0x{Hash:X}"); b.AppendLineSpace(fmt + $"First Segment Index: {FirstSegmentIndex}"); b.AppendLine(); if (Unknown68 != 0) { b.AppendLineSpace(fmt + $"Unknown68: 0x{Unknown68:X}"); } if (Unknown70 != 0) { b.AppendLineSpace(fmt + $"Unknown70: 0x{Unknown70:X}"); } if (Unknown78 != 0) { b.AppendLineSpace(fmt + $"Unknown78: 0x{Unknown78:X}"); } if (Padding6 != 0) { b.AppendLineSpace(fmt + $"Padding6: 0x{Padding6:X}"); } return(b.ToString()); }
public string ToString(bool formatted) { string fmt = formatted ? " " : ""; var b = new StringBuilder(); b.AppendLineSpace("PspConsoleCert:"); b.AppendLineSpace(fmt + $"StructId: 0x{StructID:X}"); b.AppendLineSpace(fmt + $"Size: {Size} (0x{Size:X})"); b.AppendLineSpace(fmt + $"IssuerKeyId: {IssuerKeyId} (0x{IssuerKeyId:X})"); b.AppendLineSpace(fmt + $"ProtocolVer: {ProtocolVer} (0x{ProtocolVer:X})"); b.AppendLineSpace(fmt + $"IssueDateTime: {IssueDateTime} ({IssueDate})"); b.AppendLineSpace(fmt + $"PspRevisionId: {PspRevisionId} (0x{PspRevisionId:X})"); b.AppendLineSpace(fmt + $"SocId: {SocId.ToHexString()}"); b.AppendLineSpace(fmt + $"GenerationId: {GenerationId} (0x{GenerationId:X})"); b.AppendLineSpace(fmt + $"ConsoleRegion: {ConsoleRegion} (0x{ConsoleRegion:X})"); b.AppendLineSpace(fmt + $"ReservedByte: {ReservedByte} (0x{ReservedByte:X})"); b.AppendLineSpace(fmt + $"ReservedDword: {ReservedDword} (0x{ReservedDword:X})"); b.AppendLineSpace(fmt + $"VendorId: {VendorId.ToHexString()}"); b.AppendLineSpace(fmt + $"AttestationPubKey: {Environment.NewLine}{fmt}{AttestationPubKey.ToHexString()}"); b.AppendLineSpace(fmt + $"ReservedPublicKey: {Environment.NewLine}{fmt}{ReservedPublicKey.ToHexString()}"); b.AppendLineSpace(fmt + $"ConsoleSerialNumberString: {ConsoleSerialNumberString}"); b.AppendLineSpace(fmt + $"ConsoleSku: {ConsoleSku.ToHexString()}"); b.AppendLineSpace(fmt + $"ConsoleSettingsHash: {ConsoleSettingsHash.ToHexString(String.Empty)}"); b.AppendLineSpace(fmt + $"ConsolePartNumberString: {ConsolePartNumberString}"); b.AppendLineSpace(fmt + $"SomeData: {SomeData.ToHexString()}"); b.AppendLineSpace(fmt + $"RsaSignature: {Environment.NewLine}{fmt}{RsaSignature.ToHexString()}"); b.AppendLine(); return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcRegionHeader (ID/EncryptionIV: 0x" + Id.ToString("X8") + "):"); string fmt = formatted ? " " : ""; if (Unknown1 != 0) { b.AppendLineSpace(fmt + "Unknown1 != 0"); } if (Unknown2 != 0) { b.AppendLineSpace(fmt + "Unknown2 != 0"); } if (Unknown3 != 0) { b.AppendLineSpace(fmt + "Unknown3 != 0"); } if (Unknown4 != 0) { b.AppendLineSpace(fmt + "Unknown4 != 0"); } if (Unknown5 != 0) { b.AppendLineSpace(fmt + "Unknown5 != 0"); } string keyid = KeyId.ToString("X"); if (KeyId == 0xFFFF) { keyid += " (not encrypted)"; } b.AppendLineSpace(fmt + "Description: " + Description.Replace("\0", "")); b.AppendLineSpace(fmt + "Key ID: 0x" + keyid); b.AppendLineSpace(fmt + "Flags: 0x" + Flags.ToString("X")); b.AppendLineSpace(fmt + "Offset: 0x" + Offset.ToString("X")); b.AppendLineSpace(fmt + "Length: 0x" + Length.ToString("X")); b.AppendLineSpace(fmt + "Region PDUID: 0x" + RegionPDUID.ToString("X")); b.AppendLine(); b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); b.AppendLineSpace(fmt + "Unknown3: 0x" + Unknown3.ToString("X")); b.AppendLineSpace(fmt + "Unknown4: 0x" + Unknown4.ToString("X")); b.AppendLineSpace(fmt + "Unknown5: 0x" + Unknown5.ToString("X")); return(b.ToString()); }
public string ToString(bool formatted, string header = "iQueTitleData") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; // some stuff to alert me of unks that are different if (Unk18 != 0) { b.AppendLineSpace(fmt + "Unk18 != 0!"); } if (Unk1C != 0) { b.AppendLineSpace(fmt + "Unk1C != 0!"); } if (Unk20 != 0) { b.AppendLineSpace(fmt + "Unk20 != 0!"); } if (Unk24 != 0) { b.AppendLineSpace(fmt + "Unk24 != 0!"); } if (Unk28 != 0) { b.AppendLineSpace(fmt + "Unk28 != 0!"); } if (Unk2C != 0xB0000000) { b.AppendLineSpace(fmt + "Unk2C != 0xB0000000!"); } if (Unk30 != 1) { b.AppendLineSpace(fmt + "Unk30 != 1!"); } if (Unk34 != 0x400000) { b.AppendLineSpace(fmt + "Unk34 != 0x400000!"); } if (Unk38 != 0) { b.AppendLineSpace(fmt + "Unk38 != 0!"); } if (Unk3C != 0) { b.AppendLineSpace(fmt + "Unk3C != 0!"); } if (ThumbImgLength > 0x4000) { b.AppendLineSpace(fmt + "ThumbImgLength > 0x4000! (invalid?)"); } if (TitleImgLength > 0x10000) // unsure how this can even be possible, but it seems to get checked anyway { b.AppendLineSpace(fmt + "TitleImgLength > 0x10000! (invalid?)"); } if (Ticket.Unk2848 != 2) { b.AppendLineSpace(fmt + "Ticket.Unk2848 != 2!"); } if (Ticket.Unk284C != 0) { b.AppendLineSpace(fmt + "Ticket.Unk284C != 0!"); } if (Ticket.Unk2850 != 0x4000) { b.AppendLineSpace(fmt + "Ticket.Unk2850 != 0x4000!"); } if (Ticket.Unk2854 != 0) { b.AppendLineSpace(fmt + "Ticket.Unk2854 != 0!"); } if (Ticket.ContentId > 99999999) { b.AppendLineSpace(fmt + "Ticket.ContentId > 99999999! (invalid?)"); } if (!Unk29B6.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Unk29B6 != null!"); } b.AppendLine(); b.AppendLineSpace(fmt + $"EepromSize: {EepromSize} bytes (flags: 0x{EepromFlags:X8})"); b.AppendLineSpace(fmt + $"FlashSize: {FlashSize} bytes (flags: 0x{FlashFlags:X8})"); b.AppendLineSpace(fmt + $"SramSize: {SramSize} bytes (flags: 0x{SramFlags:X8})"); b.AppendLine(); b.AppendLineSpace(fmt + $"NumU0XFiles: 0x{NumU0XFiles:X}"); b.AppendLineSpace(fmt + $"ThumbImgLength: {ThumbImgLength}"); b.AppendLineSpace(fmt + $"TitleImgLength: {TitleImgLength}"); b.AppendLine(); b.AppendLineSpace(fmt + "TitleName: " + TitleName + (!String.IsNullOrEmpty(ISBN) ? $" ({ISBN})" : "")); b.AppendLine(); b.AppendLineSpace(fmt + $"BBID: 0x{BBID:X}"); string ticketType = ""; if (IsTicketGlobal) { ticketType = "global"; } else if (IsTicketLimitedPlay) { ticketType = "limited play"; } else if (IsTicketPermanent) { ticketType = "permanent"; } b.AppendLineSpace(fmt + $"TitleId: 0x{TitleId:X8} ({ticketType} ticket)"); b.AppendLineSpace(fmt + $"TimeLimitMinutes: {TimeLimitMinutes}"); b.AppendLine(); b.AppendLineSpace(fmt + $"CertName: {CertNameString}"); b.AppendLine(); b.AppendLineSpace(fmt + "Signature?:" + Environment.NewLine + fmt + Signature.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + $"Unk18: 0x{Unk18:X}"); b.AppendLineSpace(fmt + $"Unk1C: 0x{Unk1C:X}"); b.AppendLine(); b.AppendLineSpace(fmt + $"Unk20: 0x{Unk20:X}"); b.AppendLineSpace(fmt + $"Unk24: 0x{Unk24:X}"); b.AppendLineSpace(fmt + $"Unk28: 0x{Unk28:X}"); b.AppendLineSpace(fmt + $"Unk2C: 0x{Unk2C:X}"); b.AppendLine(); b.AppendLineSpace(fmt + $"Unk30: 0x{Unk30:X}"); b.AppendLineSpace(fmt + $"Unk34: 0x{Unk34:X}"); b.AppendLineSpace(fmt + $"Unk38: 0x{Unk38:X}"); b.AppendLineSpace(fmt + $"Unk3C: 0x{Unk3C:X}"); b.AppendLine(); b.AppendLineSpace(fmt + "Unk40:" + Environment.NewLine + fmt + Unk40.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "Unk29B6:" + Environment.NewLine + fmt + Unk29B6.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "Unk29BC:" + Environment.NewLine + fmt + Unk29BC.ToHexString()); b.AppendLine(); b.AppendLineSpace(fmt + "Unk29CC:" + Environment.NewLine + fmt + Unk29CC.ToHexString()); b.AppendLine(); b.AppendLineSpace(Ticket.ToString(formatted, header + ".iQueETicket")); return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XbfsHeader:"); string fmt = formatted ? " " : ""; if (Version != 1) b.AppendLineSpace(fmt + "Version != 1"); if (Unknown1 != 3) b.AppendLineSpace(fmt + "Unknown1 != 3"); if (Unknown2 != 0) b.AppendLineSpace(fmt + "Unknown2 != 0"); if (Unknown3 != 0) b.AppendLineSpace(fmt + "Unknown3 != 0"); if (Unknown4 != 0) b.AppendLineSpace(fmt + "Unknown4 != 0"); if (!Unknown5.IsArrayEmpty()) b.AppendLineSpace(fmt + "Unknown5 != null"); if (!Unknown6.IsArrayEmpty()) b.AppendLineSpace(fmt + "Unknown6 != null"); if (!Unknown7.IsArrayEmpty()) b.AppendLineSpace(fmt + "Unknown7 != null"); b.AppendLine(); b.AppendLineSpace(fmt + "Magic: " + new string(Magic)); b.AppendLineSpace(fmt + "Version: 0x" + Version.ToString("X")); b.AppendLineSpace(fmt + "Boot Slot: 0x" + BootSlot.ToString("X")); b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); b.AppendLineSpace(fmt + "Unknown3: 0x" + Unknown3.ToString("X")); b.AppendLineSpace(fmt + "Unknown4: 0x" + Unknown4.ToString("X")); b.AppendLineSpace(fmt + "Unknown5: 0x" + Unknown5.ToHexString()); b.AppendLineSpace(fmt + "Unknown6: 0x" + Unknown6.ToHexString()); b.AppendLineSpace(fmt + "Unknown7: 0x" + Unknown7.ToHexString()); b.AppendLineSpace(fmt + "XBFS header hash: " + Environment.NewLine + fmt + XbfsHash.ToHexString()); for(int i = 0; i < Entries.Length; i++) { XbfsEntry entry = Entries[i]; b.AppendLine("Entry " + i); b.Append(entry.ToString(formatted)); } return b.ToString(); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcInfo:"); string fmt = formatted ? " " : ""; if (Flags != 0) b.AppendLineSpace(fmt + "Flags != 0"); if (Unknown1 != 0) b.AppendLineSpace(fmt + "Unknown1 != 0"); if (Unknown2 != 0) b.AppendLineSpace(fmt + "Unknown2 != 0"); if (PreviewRegionId != 0) b.AppendLineSpace(fmt + "PreviewRegionId != 0"); if (PreviewOffset != 0) b.AppendLineSpace(fmt + "PreviewOffset != 0"); if (UnusedSpace != 0) b.AppendLineSpace(fmt + "UnusedSpace != 0"); if (!Reserved.IsArrayEmpty()) b.AppendLineSpace(fmt + "Reserved != null"); var signType = "Unsigned/not crypted (/LU)"; if (KeyCount > 0) if (IsUsingTestCik) signType = "Test-crypted (/LT)"; else if (!IsAnyKeySet) signType = "Unsigned with KeyCount > 0"; else signType = "Submission-crypted (not using test key) (/L)"; b.AppendLineSpace(fmt + signType); b.AppendLineSpace(fmt + "/updcompat type " + (UpdateSegmentCount == 0 ? "1" : "2")); b.AppendLine(); b.AppendLineSpace(fmt + "ContentID: " + new Guid(ContentID)); for(int i = 0; i < EncryptionKeyIds.Length; i++) if(!EncryptionKeyIds[i].IsKeyNulled) b.AppendLineSpace(fmt + "Encryption Key " + i + " GUID: " + new Guid(EncryptionKeyIds[i].KeyId)); b.AppendLine(); b.AppendLineSpace(fmt + "Description: " + Encoding.Unicode.GetString(Description).Replace("\0", "")); b.AppendLineSpace(fmt + "Version: 0x" + Version.ToString("X")); b.AppendLineSpace(fmt + "Region Count: 0x" + RegionCount.ToString("X")); b.AppendLineSpace(fmt + "Flags: 0x" + Flags.ToString("X")); b.AppendLineSpace(fmt + "Key Count: 0x" + KeyCount.ToString("X")); b.AppendLineSpace(fmt + "InitialPlay Region Id: 0x" + InitialPlayRegionId.ToString("X")); b.AppendLineSpace(fmt + "InitialPlay Offset: 0x" + InitialPlayOffset.ToString("X")); b.AppendLineSpace(fmt + "File Time Created: " + DateTime.FromFileTime(FileTimeCreated)); b.AppendLineSpace(fmt + "Preview Region Id: 0x" + PreviewRegionId.ToString("X")); b.AppendLineSpace(fmt + "Update Segment Count: 0x" + UpdateSegmentCount.ToString("X")); b.AppendLineSpace(fmt + "Preview Offset: 0x" + PreviewOffset.ToString("X")); b.AppendLineSpace(fmt + "Unused Space: 0x" + UnusedSpace.ToString("X")); b.AppendLine(); b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); if (!Reserved.IsArrayEmpty()) b.AppendLineSpace(fmt + "Reserved: " + Environment.NewLine + fmt + Reserved.ToHexString()); return b.ToString(); }
public string ToString(bool formatted) { var b = new StringBuilder(); string fmt = formatted ? " " : ""; b.AppendLine("XvdMiscInfo:"); b.AppendLineSpace(fmt + $"Page Count: 0x{Header.NumberOfHashedPages:X}"); b.AppendLineSpace(fmt + $"Embedded XVD Offset: 0x{EmbeddedXvdOffset:X}"); b.AppendLineSpace(fmt + $"MDU Offset: 0x{MduOffset:X}"); b.AppendLineSpace(fmt + $"HashTree Offset: 0x{HashTreeOffset:X}"); b.AppendLineSpace(fmt + $"User Data Offset: 0x{UserDataOffset:X}"); b.AppendLineSpace(fmt + $"XVC Data Offset: 0x{XvcInfoOffset:X}"); b.AppendLineSpace(fmt + $"Dynamic Header Offset: 0x{DynamicHeaderOffset:X}"); b.AppendLineSpace(fmt + $"Drive Data Offset: 0x{DriveDataOffset:X}"); if (IsDataIntegrityEnabled) { b.AppendLineSpace(fmt + $"Hash Tree Page Count: 0x{HashTreePageCount:X}"); b.AppendLineSpace(fmt + $"Hash Tree Levels: 0x{HashTreeLevels:X}"); b.AppendLineSpace(fmt + $"Hash Tree Valid: {HashTreeValid}"); if (!DisableDataHashChecking) { b.AppendLineSpace(fmt + $"Data Hash Tree Valid: {DataHashTreeValid}"); } } if (IsXvcFile) { b.AppendLineSpace(fmt + $"XVC Data Hash Valid: {XvcDataHashValid}"); } b.AppendLine(); b.Append(Header.ToString(formatted)); if (IsXvcFile && XvcInfo.ContentID != null) { b.AppendLine(); bool xvcKeyFound = GetXvcKey(0, out var decryptKey); if (xvcKeyFound) { b.AppendLine($"Decrypt key for xvc keyslot 0: {decryptKey.ToHexString()}"); b.AppendLine("(key is wrong though until the obfuscation/encryption on it is figured out)"); b.AppendLine(); } b.AppendLine(XvcInfo.ToString(formatted)); } if (RegionHeaders != null) { for (int i = 0; i < RegionHeaders.Count; i++) { b.AppendLine(); string presenceInfo = ""; if (RegionPresenceInfo != null && RegionPresenceInfo.Count > i) { var presenceFlags = RegionPresenceInfo[i]; presenceInfo = " ("; presenceInfo += (presenceFlags.HasFlag(XvcRegionPresenceInfo.IsPresent) ? "present" : "not present") + ", "; presenceInfo += presenceFlags.HasFlag(XvcRegionPresenceInfo.IsAvailable) ? "available" : "unavailable"; if (((int)presenceFlags & 0xF0) != 0) { presenceInfo += $", on disc {(int)presenceFlags >> 4}"; } presenceInfo += ")"; } b.AppendLine($"Region {i}{presenceInfo}"); b.Append(RegionHeaders[i].ToString(formatted)); } } if (UpdateSegments != null && UpdateSegments.Count > 0) { // have to add segments to a seperate List so we can store the index of them... var segments = new List <Tuple <int, XvcUpdateSegment> >(); for (int i = 0; i < UpdateSegments.Count; i++) { if (UpdateSegments[i].Hash == 0) { break; } segments.Add(Tuple.Create(i, UpdateSegments[i])); } b.AppendLine(); b.AppendLine("Update Segments:"); b.AppendLine(); b.AppendLine(segments.ToStringTable( new[] { "Id", "PageNum (Offset)", "Hash" }, a => a.Item1, a => $"0x{a.Item2.PageNum:X} (0x{XvdMath.PageNumberToOffset(a.Item2.PageNum):X})", a => $"0x{a.Item2.Hash:X}")); } if (RegionSpecifiers != null && RegionSpecifiers.Count > 0) { // have to add specifiers to a seperate List so we can store the index of them... var specs = new List <Tuple <int, XvcRegionSpecifier> >(); for (int i = 0; i < RegionSpecifiers.Count; i++) { specs.Add(Tuple.Create(i, RegionSpecifiers[i])); } b.AppendLine(); b.AppendLine("Region Specifiers:"); b.AppendLine(); b.AppendLine(specs.ToStringTable( new[] { "Id", "RegionId", "Key", "Value" }, a => a.Item1, a => $"0x{a.Item2.RegionId:X}", a => a.Item2.Key, a => a.Item2.Value)); } if (!IsEncrypted) { b.AppendLine(); try { b.Append(Filesystem.ToString(formatted)); } catch (Exception e) { b.AppendLine($"Failed to get XvdFilesystem info, error: {e}"); } } else { b.AppendLine($"Cannot get XvdFilesystem from encrypted package"); } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvcInfo:"); string fmt = formatted ? " " : ""; if (Flags != 0) { b.AppendLineSpace(fmt + "Flags != 0"); } if (Unknown1 != 0) { b.AppendLineSpace(fmt + "Unknown1 != 0"); } if (Unknown2 != 0) { b.AppendLineSpace(fmt + "Unknown2 != 0"); } if (PreviewRegionId != 0) { b.AppendLineSpace(fmt + "PreviewRegionId != 0"); } if (PreviewOffset != 0) { b.AppendLineSpace(fmt + "PreviewOffset != 0"); } if (UnusedSpace != 0) { b.AppendLineSpace(fmt + "UnusedSpace != 0"); } if (!Reserved.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Reserved != null"); } var signType = "Unsigned/not crypted (/LU)"; if (KeyCount > 0) { if (IsUsingTestCik) { signType = "Test-crypted (/LT)"; } else if (!IsAnyKeySet) { signType = "Unsigned with KeyCount > 0"; } else { signType = "Submission-crypted (not using test key) (/L)"; } } b.AppendLineSpace(fmt + signType); b.AppendLineSpace(fmt + "/updcompat type " + (UpdateSegmentCount == 0 ? "1" : "2")); b.AppendLine(); b.AppendLineSpace(fmt + "ContentID: " + new Guid(ContentID)); for (int i = 0; i < EncryptionKeyIds.Length; i++) { if (!EncryptionKeyIds[i].IsKeyNulled) { b.AppendLineSpace(fmt + "Encryption Key " + i + " GUID: " + new Guid(EncryptionKeyIds[i].KeyId)); } } b.AppendLine(); b.AppendLineSpace(fmt + "Description: " + Encoding.Unicode.GetString(Description).Replace("\0", "")); b.AppendLineSpace(fmt + "Version: 0x" + Version.ToString("X")); b.AppendLineSpace(fmt + "Region Count: 0x" + RegionCount.ToString("X")); b.AppendLineSpace(fmt + "Flags: 0x" + Flags.ToString("X")); b.AppendLineSpace(fmt + "Key Count: 0x" + KeyCount.ToString("X")); b.AppendLineSpace(fmt + "InitialPlay Region Id: 0x" + InitialPlayRegionId.ToString("X")); b.AppendLineSpace(fmt + "InitialPlay Offset: 0x" + InitialPlayOffset.ToString("X")); b.AppendLineSpace(fmt + "File Time Created: " + DateTime.FromFileTime(FileTimeCreated)); b.AppendLineSpace(fmt + "Preview Region Id: 0x" + PreviewRegionId.ToString("X")); b.AppendLineSpace(fmt + "Update Segment Count: 0x" + UpdateSegmentCount.ToString("X")); b.AppendLineSpace(fmt + "Preview Offset: 0x" + PreviewOffset.ToString("X")); b.AppendLineSpace(fmt + "Unused Space: 0x" + UnusedSpace.ToString("X")); b.AppendLine(); b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); if (!Reserved.IsArrayEmpty()) { b.AppendLineSpace(fmt + "Reserved: " + Environment.NewLine + fmt + Reserved.ToHexString()); } return(b.ToString()); }
public string ToString(bool formatted, string header = "BbLaunchMetadata") { var b = new StringBuilder(); if (!string.IsNullOrEmpty(header)) { b.AppendLine($"{header}:"); } string fmt = formatted ? " " : ""; if (ErrataSize != 0) { b.AppendLineSpace(fmt + $"ErrataSize != 0! (0x{ErrataSize:X8})"); } if (ErrataAddress != 0) { b.AppendLineSpace(fmt + $"ErrataAddress != 0! (0x{ErrataAddress:X8})"); } b.AppendLine(); b.AppendLineSpace(fmt + $"EepromAddress: 0x{EepromAddress:X8}, size: 0x{EepromSize:X}"); b.AppendLineSpace(fmt + $"FlashAddress: 0x{FlashAddress:X8}, size: 0x{FlashSize:X}"); b.AppendLineSpace(fmt + $"SramAddress: 0x{SramAddress:X8}, size: 0x{SramSize:X}"); b.AppendLine(); b.AppendLineSpace(fmt + $"ControllerPak0Address: 0x{ControllerPak0Address:X}"); b.AppendLineSpace(fmt + $"ControllerPak1Address: 0x{ControllerPak1Address:X}"); b.AppendLineSpace(fmt + $"ControllerPak2Address: 0x{ControllerPak2Address:X}"); b.AppendLineSpace(fmt + $"ControllerPak3Address: 0x{ControllerPak3Address:X}"); b.AppendLineSpace(fmt + $"ControllerPakSize: 0x{ControllerPakSize:X}"); b.AppendLine(); b.AppendLineSpace(fmt + $"RomBase: 0x{RomBase:X8}"); b.AppendLineSpace(fmt + $"TvType: 0x{TvType:X8}"); b.AppendLineSpace(fmt + $"MemSize: 0x{MemSize:X8}"); if (ErrataAddress != 0 || ErrataSize != 0) { b.AppendLineSpace(fmt + $"ErrataSize: 0x{ErrataSize:X8}"); b.AppendLineSpace(fmt + $"ErrataAddress: 0x{ErrataAddress:X8}"); } b.AppendLine(); b.AppendLineSpace(fmt + $"NumU0XFiles: 0x{NumU0XFiles:X}"); b.AppendLine(); b.AppendLineSpace(fmt + "Magic:" + Environment.NewLine + fmt + Magic.ToHexString()); return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); string fmt = formatted ? " " : ""; b.AppendLine("XvdMiscInfo:"); b.AppendLineSpace(fmt + "Block Count: 0x" + XvdDataBlockCount.ToString("X")); if (Header.EmbeddedXVDLength > 0) { b.AppendLineSpace(fmt + "Embedded XVD Offset: 0x3000"); } if (Header.UserDataLength > 0) { b.AppendLineSpace(fmt + "User Data Offset: 0x" + UserDataOffset.ToString("X")); } b.AppendLineSpace(fmt + "XVD Data Offset: 0x" + DataOffset.ToString("X")); if (IsDataIntegrityEnabled) { b.AppendLineSpace(fmt + "Hash Tree Block Count: 0x" + HashTreeBlockCount.ToString("X")); b.AppendLineSpace(fmt + "Hash Tree Levels: 0x" + HashTreeLevels.ToString("X")); b.AppendLineSpace(fmt + "Hash Tree Valid: " + (HashTreeValid ? "true" : "false")); if (!DisableDataHashChecking) { b.AppendLineSpace(fmt + "Data Hash Tree Valid: " + (DataHashTreeValid ? "true" : "false")); } } if (IsXvcFile) { b.AppendLineSpace(fmt + "XVC Data Hash Valid: " + (XvcDataHashValid ? "true" : "false")); } b.AppendLine(); b.Append(Header.ToString(formatted)); if (XvcInfo.ContentID == null) { return(b.ToString()); } b.AppendLine(); if (formatted) { byte[] decryptKey; string licenseFile = GetXvcKey(0, out decryptKey); if (!String.IsNullOrEmpty(licenseFile)) { if (licenseFile != "testsigned") { b.AppendLine("Decrypt key from license file " + licenseFile + " (key is wrong though until the obfuscation/encryption on it is figured out)"); } else { b.AppendLine("Decrypt key for test-signed package:"); } b.AppendLine(decryptKey.ToHexString()); b.AppendLine(); } } b.AppendLine(XvcInfo.ToString(formatted)); if (RegionHeaders != null) { for (int i = 0; i < RegionHeaders.Count; i++) { b.AppendLine(); b.AppendLine("Region " + i); b.Append(RegionHeaders[i].ToString(formatted)); } } if (RegionHeaders != null) { for (int i = 0; i < UpdateSegments.Count; i++) { if (UpdateSegments[i].Unknown1 == 0) { break; } b.AppendLine(); b.AppendLine("Update Segment " + i); b.Append(UpdateSegments[i].ToString(formatted)); } } return(b.ToString()); }
public string ToString(bool formatted) { var b = new StringBuilder(); b.AppendLine("XvdHeader:"); string fmt = formatted ? " " : ""; if (FormatVersion != 3) b.AppendLineSpace(fmt + "FormatVersion != 3"); if (Unknown1_HashTableRelated != 1) b.AppendLineSpace(fmt + "Unknown1 != 1"); if (Unknown2 != 0xAA000) b.AppendLineSpace(fmt + "Unknown2 != 0xAA000"); if (!Unknown3.IsArrayEmpty()) b.AppendLineSpace(fmt + "Unknown3 != null"); if (Unknown4 != 0) b.AppendLineSpace(fmt + "Unknown4 != 0"); if (!Unknown5.IsArrayEmpty()) b.AppendLineSpace(fmt + "Unknown5 != null"); if (Unknown6 != 0) b.AppendLineSpace(fmt + "Unknown6 != 0"); if (Unknown7 != 0) b.AppendLineSpace(fmt + "Unknown7 != 0"); if (!Unknown8.IsArrayEmpty()) b.AppendLineSpace(fmt + "Unknown8 != null"); if (!Reserved.IsArrayEmpty()) b.AppendLineSpace(fmt + "Reserved != null"); if (!Enum.IsDefined(typeof(XvdContentType), ContentType)) b.AppendLineSpace(fmt + "Unknown content type 0x" + ContentType.ToString("X")); b.AppendLineSpace(fmt + (IsSignedWithRedKey ? "Signed" : "Not signed") + " with red key"); if (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.SystemFile)) b.AppendLineSpace(fmt + "System file"); b.AppendLineSpace(fmt + "Read-only flag " + (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.ReadOnly) ? "set" : "not set")); b.AppendLineSpace(fmt + (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.EncryptionDisabled) ? "Decrypted" : "Encrypted")); if (Unk_0x2_Means_Test_ODK != 0) { if (Unk_0x2_Means_Test_ODK == 0x2) b.AppendLineSpace(fmt + "(using test ODK) (maybe)"); else b.AppendLineSpace(fmt + "Unk_0x2_Means_Test_ODK != 0 && != 2! (actually 0x" + Unk_0x2_Means_Test_ODK.ToString("X") + ")"); } b.AppendLineSpace(fmt + (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.DataIntegrityDisabled) ? "Data integrity disabled (doesn't use hash tree)" : "Data integrity enabled (uses hash tree)")); b.AppendLineSpace(fmt + "Unknown flag 0x40 " + (VolumeFlags.IsFlagSet((uint)XvdVolumeFlags.Unknown) ? "set" : "not set")); b.AppendLine(); b.AppendLineSpace(fmt + "Magic: " + new string(Magic)); b.AppendLineSpace(fmt + "Volume Flags: 0x" + VolumeFlags.ToString("X")); string contentType = "0x" + ContentType.ToString("X") + " (" + ((XvdContentType)ContentType) + ")"; b.AppendLineSpace(fmt + "File Time Created: " + DateTime.FromFileTime(FileTimeCreated)); b.AppendLineSpace(fmt + "Drive Size: 0x" + DriveSize.ToString("X")); b.AppendLineSpace(fmt + "Format Version: 0x" + FormatVersion.ToString("X")); b.AppendLineSpace(fmt + String.Format("VDUID / Drive Id: {0} (UDUID / User Id: {1})", new Guid(VDUID), new Guid(UDUID))); b.AppendLineSpace(fmt + "Content Type: " + contentType); b.AppendLineSpace(fmt + "Embedded XVD PDUID/Build Id: " + new Guid(EmbeddedXVD_PDUID)); b.AppendLineSpace(fmt + "Embedded XVD Length: 0x" + EmbeddedXVDLength.ToString("X")); b.AppendLineSpace(fmt + "User Data Length: 0x" + UserDataLength.ToString("X")); b.AppendLineSpace(fmt + "XVC Data Length: 0x" + XvcDataLength.ToString("X")); b.AppendLineSpace(fmt + "Dynamic Header Length: 0x" + DynamicHeaderLength.ToString("X")); b.AppendLineSpace(fmt + "Top Hash Block Hash:" + Environment.NewLine + fmt + TopHashBlockHash.ToHexString()); b.AppendLineSpace(fmt + "Original XVC Data Hash:" + Environment.NewLine + fmt + OriginalXvcDataHash.ToHexString()); b.AppendLineSpace(fmt + "Sandbox Id: " + new string(SandboxId).Replace("\0", "")); b.AppendLineSpace(fmt + "Product Id: " + new Guid(ProductId)); b.AppendLineSpace(fmt + "PDUID/Build Id: " + new Guid(PDUID)); b.AppendLineSpace(fmt + String.Format("Package Version: {3}.{2}.{1}.{0}", PackageVersion1, PackageVersion2, PackageVersion3, PackageVersion4)); b.AppendLineSpace(fmt + String.Format("Required System Version: {3}.{2}.{1}.{0}", RequiredSystemVersion1, RequiredSystemVersion2, RequiredSystemVersion3, RequiredSystemVersion4)); b.AppendLineSpace(fmt + "Encrypted CIK:" + Environment.NewLine + fmt + EncryptedCIK.ToHexString()); b.AppendLineSpace(fmt + "PECatalogInfo0: 0x" + PECatalogInfo0.ToString("X")); string catalogInfo1 = ""; foreach (ulong catalogInfo in PECatalogInfo1) catalogInfo1 += "0x" + catalogInfo.ToString("X") + " "; b.AppendLine(fmt + "PECatalogInfo1: " + catalogInfo1); string catalogInfo2 = ""; foreach (ulong catalogInfo in PECatalogInfo2) catalogInfo2 += "0x" + catalogInfo.ToString("X") + " "; b.AppendLine(fmt + "PECatalogInfo2: " + catalogInfo2); b.AppendLine(fmt + "PECatalogInfo3: "); b.Append(fmt); foreach (ulong catalogInfo in PECatalogInfo3) b.Append("0x" + catalogInfo.ToString("X") + " "); b.AppendLine(); b.AppendLine(); b.AppendLineSpace(fmt + "Unknown1: 0x" + Unknown1_HashTableRelated.ToString("X")); b.AppendLineSpace(fmt + "Unknown2: 0x" + Unknown2.ToString("X")); b.AppendLineSpace(fmt + "Unknown3:" + Environment.NewLine + fmt + Unknown3.ToHexString()); b.AppendLineSpace(fmt + "Unknown4: 0x" + Unknown4.ToString("X")); b.AppendLineSpace(fmt + "Unknown5:" + Environment.NewLine + fmt + Unknown5.ToHexString()); b.AppendLineSpace(fmt + "Unknown6: 0x" + Unknown6.ToString("X")); b.AppendLineSpace(fmt + "Unknown7: 0x" + Unknown7.ToString("X")); b.AppendLineSpace(fmt + "Unknown8: " + Environment.NewLine + fmt + Unknown8.ToHexString()); b.AppendLineSpace(fmt + "Unknown9/TestODK indicator: 0x" + Unk_0x2_Means_Test_ODK.ToString("X")); if (!Reserved.IsArrayEmpty()) b.AppendLineSpace(fmt + "Reserved: " + Environment.NewLine + fmt + Reserved.ToHexString()); return b.ToString(); }