Example #1
1
        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();
        }
Example #2
0
        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());
        }
Example #3
0
        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());
        }
Example #5
0
        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());
        }
Example #6
0
        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());
        }
Example #7
0
        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());
        }
Example #8
0
        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());
        }
Example #9
0
        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());
        }
Example #10
0
        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());
        }
Example #11
0
        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}")})");
Example #12
0
        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());
        }
Example #13
0
        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());
        }
Example #14
0
        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();
        }
Example #15
0
        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());
        }
Example #16
0
        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());
        }
Example #17
0
        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());
        }
Example #18
0
        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());
        }
Example #19
0
        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();
        }
Example #20
0
        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());
        }
Example #21
0
        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();
        }
Example #22
0
        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());
        }
Example #23
0
        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());
        }
Example #24
0
        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());
        }
Example #25
0
        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());
        }
Example #26
0
        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());
        }
Example #27
0
        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());
        }
Example #28
0
        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());
        }
Example #29
0
        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());
        }
Example #30
0
        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();
        }
Example #31
0
        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();
        }
Example #32
0
        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());
        }
Example #33
0
        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());
        }
Example #34
0
        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());
        }
Example #35
0
        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());
        }
Example #36
0
        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();
        }