Hacking BigBlueBox Says All the Other NSPS Are Wrong

tubebar

Well-Known Member
Member
Joined
May 17, 2009
Messages
227
Trophies
0
XP
517
Country
United States
The extra added xml files are generated from the NCAs during the NSP packing, hence you can repack ANY NSP and generate these files. The files are required for developers and for submission to Nintendo for review. Since we are not developing the game (it's already finished) and we are not submitting it to Nintendo for review (it's on the EShop) these are totally useless.

Unlike what you may think NSP's are NOT what eShop uses. eShop does NOT use a container file, they are raw separate files just like all Nintendo systems use. This was the case with Wii, 3DS and Wii U they are all raw files downloaded from eShop (not WADS, CIAS or NSPS). The containers were used for developers and submissions NOT for piracy and these extra files are useless and should be abandoned as the "proper way" to do retail pirated games.
 

Quicksilver88

Well-Known Member
Member
Joined
Jan 26, 2013
Messages
618
Trophies
1
Age
54
XP
753
Country
United States
All I know is every last NSP I have works just fine and my console will never touch an external network again. So even if they can ban/block all of the current NSPs downloaded with public certs with a firmware or server update it won't matter to me, I'm sure I can find something out of several hundred games I already have to play on older firmware...

Dude 6.x is already patched by SX and free CFW and there is a method to update your firmware (offline) and not burn you fuses (so you can downgrade). So if you have an exploitable model Switch there isn't crap N is going to be able to do about it going forward. Viva La CFW!

--------------------- MERGED ---------------------------

Has anyone go online with legit unbanned console recently since the big change in CDN system last week, and bought and installed an actual eShop game.

Then modded their Switch, and dump and extracted their nand backup, to see if 'nintendo' infact with legit game bought thru eShop, stores these so called extra worthless metadata (xml's/jpg's) files on your Switch nand.

Maybe the problem is two-fold, not only are the previous dumps 'wrong', but maybe the current nsp installers, are not 'installing and looking' for all the files that the real switch does with legit eshop.

Remember tinfoil and other apps are all based on devmenu and early cdn tools, and devmenu is from early system firmware, it does not mean that even tho everything works fine now without this 'extra metadata', that it is not at least tracked and logged or stored by nintendo themselves at some point during the whole actual legit eShop buy,fetch,install process on the switch.

And you got to remember also, even if the above is 'useless' right now, does not mean in future like with v6.0 firmware when 'paid online' launches in 3 to 4 weeks, that these 'files' are now 'needed' and 'logged' and 'looked for'. :)

Yeah but even if thats true what difference does it make? If you run any user installed .nsp it doesn't have a properly signed ticket and they know you are pirating. They don't need to track and care about random little files missing from install package. Plus apparently even if you run an .nro Nintendo knows that and can ban you. I have played a lot of .nsp installed games from CDN, scene, and .xci convert and no crashes or issues. I mean sure if I am collecting for 'posterity' then I would care but my hard drives are being burned on my funeral pyre so no concerns there.

Hopefully some form of EmuNand is coming soon and then all of us that saved our 'virgin' nand and stayed offline should have dual OFW/CFW capabilities and that's about as good as its gonna get. I don't think getting CFW playing online (like X360 dvd hack got to) is gonna be possible, unless maybe its by mounted .xci with proper certificate data.
 
  • Like
Reactions: Albytrozz

comput3rus3r

Well-Known Member
Member
Joined
Aug 20, 2016
Messages
3,580
Trophies
1
Age
123
XP
4,922
Country
United States
856 Mercenary Kings Limited Run Games, Inc.
USA.jpg
en BigBlueBox 2 LA-H-AEUWA 0100F900046C4000 391F4040 bbb-h-aeuwa Mercenary.Kings.USA.NSW-BigBlueBox 637452800 3.0.1 NSW Game 1

523 Mercenary Kings Tribute Games Inc.
WLD.jpg
en BigBlueBox 1 LA-N-AEUWA 0100F900046C4000 C1CCCDFB bbb-n-aeuwa Mercenary.Kings.eShop.NSW-BigBlueBox 251521886 3.0.1 eShop 1

what's the difference between north america and usa?
 

rrocha

Developer
Developer
Joined
Nov 21, 2016
Messages
137
Trophies
0
XP
1,816
Country
Portugal
856 Mercenary Kings Limited Run Games, Inc.
USA.jpg
en BigBlueBox 2 LA-H-AEUWA 0100F900046C4000 391F4040 bbb-h-aeuwa Mercenary.Kings.USA.NSW-BigBlueBox 637452800 3.0.1 NSW Game 1

523 Mercenary Kings Tribute Games Inc.
WLD.jpg
en BigBlueBox 1 LA-N-AEUWA 0100F900046C4000 C1CCCDFB bbb-n-aeuwa Mercenary.Kings.eShop.NSW-BigBlueBox 251521886 3.0.1 eShop 1

what's the difference between north america and usa?

I'm yet to put my hands on the switch scene rules nfo (if someone has it, please PM me) but I believe that XCI trumps NSP by scene standards. That being said, whenever a game is released in NSP/eShop format, a subsequent release in XCI is allowed. If it's the opposite, the NSP will be considered a dupe and will get nuked (unless it's an INTERNAL or PROPER release). Take a look at the WiiU scene rules for referrence:

1.3) WUD and File Format releases are acceptable.
1.3.1) WUD trumps SCRUBBED releases.
1.3.2) File Format rips must be tagged as SCRUBBED
1.3.3) WUD after SCRUBBED is allowed. SCRUBBED after WUD is not allowed.​

1.8) All previous File Format releases can be re-released as WUD.
1.8.1) Only WUD re-releases need to be tagged as COMPLETE. Future releases are unaffected.
1.8.2) All WUD re-releases can have region dupes.​
 

JupiterJesus

Active Member
Newcomer
Joined
Jul 14, 2018
Messages
44
Trophies
0
Age
40
XP
289
Country
United States
The extra added xml files are generated from the NCAs during the NSP packing, hence you can repack ANY NSP and generate these files. The files are required for developers and for submission to Nintendo for review. Since we are not developing the game (it's already finished) and we are not submitting it to Nintendo for review (it's on the EShop) these are totally useless.

Unlike what you may think NSP's are NOT what eShop uses. eShop does NOT use a container file, they are raw separate files just like all Nintendo systems use. This was the case with Wii, 3DS and Wii U they are all raw files downloaded from eShop (not WADS, CIAS or NSPS). The containers were used for developers and submissions NOT for piracy and these extra files are useless and should be abandoned as the "proper way" to do retail pirated games.

This is basically what I said earlier in the thread, but with fewer words, before I forgot about this thread.

I've been working lately on adding NSP extraction tools to my CDN program and finally got around to downloading a BBB release to see what the contents were for myself, and my suspicions (and your statements) were confirmed. The additional files are:

LEGAL-NCA-ID.legalinfo.xml
PROGRAM-NCA-ID.programinfo.xml
CONTROL-NCA-ID.nacp.xml
META-NCA-ID.cnmt.xml (this one does come in CDNSP repacks)

Also, the jpegs are in the format CONTROL-NCA-ID.nx.LANGUAGE.jpg

Every title comes with a Program type NCA, a Control type NCA and a LegalInformation type NCA.

The control NCA contains several icons, all in the form "icon_LANGUAGE.bin". They are actually jpegs, and you can rename .bin to .jpg. The control NCA also contains a file called control.nacp. This file contains localization stuff, like languages supported, the name of the title, developer, producer and lots of other metadata-type stuff. The XXX.nacp.xml file is generated by parsing this control.nacp file and spitting out the same information in XML format.

The legal information NCA contains a bunch of html files with documentation - IP information, legal notices, licensing, support, stuff like that. There's also a legalinfo.xml file. This legalinfo.xml file is COPIED DIRECTLY into the XXX.legalinfo.xml file, so it isn't even generated by parsing other data. It is copied over just like the jpegs are, but renamed.

The program one is the big one and contains the executable and most/all of the data. It is basically "the game". I don't know yet where the data in it comes from (there's no XML file to copy over, and there's no single obvious file that I've found like control.nacp). It contains highly technical information specific to the executable. Things like SDK version, build type (debug, release), middleware libraries (unity, unreal). It also seems to contain "UnresolvedApi" entries. I'm not sure what they're for - perhaps methods called by the executable that need to be resolved into library/middleware API calls during compilation? I don't know why that would be in an XML file though.

The Meta/cnmt file is included, and it is just data parsed from the Application_TITLEID.cnmt file inside of the Meta type NCA. It contains metadata (duh) like Title ID, Key Revision, Patch ID (the ID used to download patches from the CDN, which is pretty much always just TITLEID ORed with 0x800) and other system-level metadata. More importantly, it contains a list of all the OTHER NCAs in the program. So the CNMT must be downloaded first, then you use the NCA list to download the individual NCAs from the CDN by their IDs. It is just as redundant to include in the NSP as any of the other info, but it is cool to be able to see it in plain text. The actual game files are all binary files and impossible to read without a hex editor and a lot of patience.

A lot of the info needed to parse and include those files isn't widely available. I get my info from switchbrew, and the documentation there for Control.NACP is full of "Unknowns". In contrast, the BBB release has an nacp.xml file FULL of information that isn't even mentioned in the switchbrew documentation, never mind the programinfo.xml (I have no idea yet where that comes from).

I'm going to go at that control.nacp with a hex editor and the xml file, trying to find what goes where, so I can properly parse the control.nacp file myself and generate the XML. I may even be able to read some metadata from it without having to try and access the eshop for title information. For example, the developer is in the NACP file, something I'd otherwise have to enter manually or read from the eshop.

It isn't necessary to have those files, but I plan to fully implement them just for completeness sake, and then repack all of my personal NSPs with the new files. Just because. Programmers have weird motivations.
 

tubebar

Well-Known Member
Member
Joined
May 17, 2009
Messages
227
Trophies
0
XP
517
Country
United States
I can only take credit for the words, the actual technical details on what I said came from discussing with CaithSith2 when he was asked to add it in SD to NSP. Since users do not download these files from the eshop onto their Switch they are not required for end users.

Now - if we get "technical" for completeness (GoodSets, NoIntro, MAME, TOSEC etc.) I suppose they belong within an NSP container as it's part of the NSP specs (we can safely assume this much) Without documentation its hard to confirm. We need to get in contact w/ someone who has a Switch Dev kit and official specs and would "leak" that info (bet BBB has that but aren't sharing).

But if you want to put the extra work into it, I'd use it and repack for completeness. Unlike trimmed XCI's which are damaged data and certainly incomplete, these are simply optional. I have no strong opinion of saying don't do it - I just think they are not required and need not be any standard.
 

hippy dave

BBMB
Member
Joined
Apr 30, 2012
Messages
9,889
Trophies
2
XP
29,441
Country
United Kingdom
856 Mercenary Kings Limited Run Games, Inc.
USA.jpg
en BigBlueBox 2 LA-H-AEUWA 0100F900046C4000 391F4040 bbb-h-aeuwa Mercenary.Kings.USA.NSW-BigBlueBox 637452800 3.0.1 NSW Game 1

523 Mercenary Kings Tribute Games Inc.
WLD.jpg
en BigBlueBox 1 LA-N-AEUWA 0100F900046C4000 C1CCCDFB bbb-n-aeuwa Mercenary.Kings.eShop.NSW-BigBlueBox 251521886 3.0.1 eShop 1

what's the difference between north america and usa?
I believe the NA is actually "not applicable", used to mean region-free or multi-region, as opposed to north america. So the eshop release is the same for multiple/all regions, whereas the Limited Run cart release is a USA release (but still works on Switches from every region as the console itself is region-free).
 

JupiterJesus

Active Member
Newcomer
Joined
Jul 14, 2018
Messages
44
Trophies
0
Age
40
XP
289
Country
United States
Okay, so today I spent some time comparing control.nacp with *.nacp.xml (I used the game Flat Heroes... no particular reason). I finished writing my control file parser class. I figured I'd share, since I haven't been able to find any complete parsing code out there. It may exist and I'm bad at searching, and I'm sure there's private code out there, not to mention the Nintendo SDK.

Also, there may be errors. Some parts were obvious, while others I had to make educated guesses. I mean, if you know there are 96 bytes and 8 fields, you kinda have to guestimate the sizes of the fields sometimes. I also don't know all of the possible values for every field that has multiple possible values, so there are some places with made up enum values. If there's a source for the real values, I'd love to see it.

The final few fields in particular are a crapshoot. The end of the file is reserved and mostly 0s, but some chunk of it at the beginning is actually used - but all the values happened to be 0. 9 of the fields were 64-bit numbers, while 4 were enums and one was an arbitrary number (no idea the size). I went with 32-bit numbers for all 5, because that made the total size 0x60 bytes (and made the useable data end on a nice even 0x31A0 bytes), but those enums could be only a byte each for all I know...

Anyway, here's the C# class. I'm not including any of the support classes it needs - I'm sure anyone who cares about this would have no trouble adapting the code as-is. There isn't much commenting, but I did add comments on each data read with the address of the data, the length and what is supposed to be there. If anyone wants to update http://switchbrew.org/index.php?title=Control.nacp with that info, feel free. I probably won't.

The class is also tagged with XML attributes, so it automatically serializes correctly to the format expected by *.nacp.xml. Most of the XML attributes are redundant (element name is the same as the property name, which is the default) but I like to be thorough.

Code:
    [XmlRoot("Application", Namespace = null, IsNullable = false)]
    public class ControlData
    {
        private static readonly ILog logger = LogManager.GetLogger(typeof(ControlData));

        [XmlElement(ElementName = "Title")]
        public ControlTitle[] Titles { get; set; }

        [XmlElement(ElementName = "SupportedLanguage")]
        public string[] SupportedLanguages
        {
            get
            {
                List<string> r = new List<string>();
                for (uint i = 0, mask = 1; i < Titles.Length; i++, mask <<= 1)
                {
                    if ((SupportedLanguagesFlag & mask) != 0)
                        r.Add(((SwitchLanguage)i).ToString());
                }

                return r.ToArray();
            }
            set
            {
                int flag = 0;
                for (uint i = 0; i < value.Length; i++)
                {
                    string l = value[i];
                    if (!string.IsNullOrWhiteSpace(l))
                    {
                        if (Enum.TryParse(l, out SwitchLanguage lang))
                        {
                            flag |= (1 << (int)lang);
                        }
                    }
                }

                SupportedLanguagesFlag = flag;
            }
        }

        [XmlIgnore]
        public int SupportedLanguagesFlag { get; private set; }
       
        [XmlElement(ElementName = "ParentalControl")]
        public ParentalControlOption ParentalControl { get; set; }

        [XmlElement(ElementName = "Isbn")]
        public string Isbn { get; set; }

        [XmlElement(ElementName = "StartupUserAccount")]
        public StartupUserAccountOption StartupUserAccount { get; set; }

        [XmlElement(ElementName = "Screenshot")]
        public ScreenshotOption Screenshot { get; set; }

        [XmlElement(ElementName = "VideoCapture")]
        public VideoCaptureOption VideoCapture { get; set; }

        [XmlElement(ElementName = "TouchScreenUsagae")]
        public TouchScreenUsageOption TouchScreenUsage { get; set; }

        [XmlElement(ElementName = "PlayLogPolicy")]
        public PlayLogPolicyOption PlayLogPolicy { get; set; }

        [XmlElement(ElementName = "DataLossConfirmation")]
        public DataLossConfirmationOption DataLossConfirmation { get; set; }

        [XmlElement(ElementName = "Attribute")]
        public AttributeOption Attribute { get; set; }

        [XmlElement(ElementName = "PresenceGroupId")]
        public string PresenceGroupId { get; set; }

        [XmlElement(ElementName = "DisplayVersion")]
        public string DisplayVersion { get; set; }

        [XmlElement(ElementName = "AddOnContentBaseId")]
        public string AddOnContentBaseId { get; set; }

        [XmlElement(ElementName = "SaveDataOwnerId")]
        public string SaveDataOwnerId { get; set; }

        [XmlElement(ElementName = "UserAccountSaveDataSize")]
        public string UserAccountSaveDataSize { get; set; }

        [XmlElement(ElementName = "UserAccountSaveDataJournalSize")]
        public string UserAccountSaveDataJournalSize { get; set; }

        [XmlElement(ElementName = "DeviceSaveDataSize")]
        public string DeviceSaveDataSize { get; set; }

        [XmlElement(ElementName = "Rating")]
        public ControlRating[] Ratings { get; set; }

        [XmlElement(ElementName = "LocalCommunicationId")]
        public string[] LocalCommunicationIds { get; set; }

        [XmlElement(ElementName = "SeedForPseudoDeviceId")]
        public string SeedForPseudoDeviceId { get; set; }

        [XmlElement(ElementName = "BcatPassphrase")]
        public string BcatPassphrase { get; set; }

        [XmlElement(ElementName = "DeviceSaveDataJournalSize")]
        public string DeviceSaveDataJournalSize { get; set; }

        [XmlElement(ElementName = "BcatDeliveryCacheStorageSize")]
        public string BcatDeliveryCacheStorageSize { get; set; }

        [XmlElement(ElementName = "ApplicationErrorCodeCategory")]
        public string ApplicationErrorCodeCategory { get; set; }

        [XmlElement(ElementName = "LogoType")]
        public LogoTypeOption LogoType { get; set; }

        [XmlElement(ElementName = "LogoHandling")]
        public LogoHandlingOption LogoHandling { get; set; }

        [XmlElement(ElementName = "Icon")]
        public List<ControlIcon> Icons { get; set; }

        [XmlElement(ElementName = "CrashReport")]
        public CrashReportOption CrashReport { get; set; }

        [XmlElement(ElementName = "RuntimeAddOnContentInstall")]
        public RuntimeAddOnContentInstallOption RuntimeAddOnContentInstall { get; set; }

        [XmlElement(ElementName = "PlayLogQueryCapability")]
        public PlayLogQueryCapabilityOption PlayLogQueryCapability { get; set; }

        [XmlElement(ElementName = "ProgramIndex")]
        public uint ProgramIndex { get; set; }

        [XmlElement(ElementName = "AddOnContentRegistrationType")]
        public AddOnContentRegistrationTypeOption AddOnContentRegistrationType { get; set; }

        [XmlElement(ElementName = "UserAccountSaveDataSizeMax")]
        public string UserAccountSaveDataSizeMax { get; set; }

        [XmlElement(ElementName = "UserAccountSaveDataJournalSizeMax")]
        public string UserAccountSaveDataJournalSizeMax { get; set; }

        [XmlElement(ElementName = "DeviceSaveDataSizeMax")]
        public string DeviceSaveDataSizeMax { get; set; }

        [XmlElement(ElementName = "DeviceSaveDataJournalSizeMax")]
        public string DeviceSaveDataJournalSizeMax { get; set; }

        [XmlElement(ElementName = "TemporaryStorageSize")]
        public string TemporaryStorageSize { get; set; }

        [XmlElement(ElementName = "CacheStorageSize")]
        public string CacheStorageSize { get; set; }

        [XmlElement(ElementName = "CacheStorageJournalSize")]
        public string CacheStorageJournalSize { get; set; }

        [XmlElement(ElementName = "CacheStorageDataAndJournalSizeMax")]
        public string CacheStorageDataAndJournalSizeMax { get; set; }

        [XmlElement(ElementName = "CacheStorageIndexMax")]
        public string CacheStorageIndexMax { get; set; }

        [XmlElement(ElementName = "Hdcp")]
        public HdcpOption Hdcp { get; set; }

        [XmlIgnore]
        public byte[] Reserved { get; set; }

        public ControlData()
        {
        }

        public static ControlData Parse(string file)
        {
            using (var fs = File.OpenRead(file))
            {
                using (BinaryReader br = new BinaryReader(fs))
                {
                    ControlData data = new ControlData();

                    // Reading switch title control file (control.nacp)
                    // See http://switchbrew.org/index.php?title=Control.nacp

                    string parent = Path.GetDirectoryName(file);
                    data.Titles = new ControlTitle[0x10];
                    data.Icons = new List<ControlIcon>();

                    // 0x0 + 0x3000 (0x10 entries of 0x300 each) - language entries for developer (or publisher?) name and title name
                    for (int i = 0; i < data.Titles.Length; i++)
                    {
                        ControlTitle title = new ControlTitle();
                        title.Name = br.ReadUTF8NullTerminated(0x200);
                        title.Publisher = br.ReadUTF8NullTerminated(0x100);
                        title.Language = (SwitchLanguage)i;

                        if (!string.IsNullOrWhiteSpace(title.Name))
                            data.Titles[i] = title;

                        string icon = parent + Path.DirectorySeparatorChar + "icon_" + title.Language + ".bin";
                        if (File.Exists(icon))
                        {
                            string hash = Crypto.ComputeHash(File.OpenRead(icon)).ToHex();
                            data.Icons.Add(new ControlIcon { Language = title.Language, NxIconHash = hash });
                        }
                    }

                    // 0x3000 + 0x25 ISBN
                    data.Isbn = br.ReadUTF8NullTerminated(0x25);
                    if (string.IsNullOrWhiteSpace(data.Isbn)) data.Isbn = null;

                    // 0x3025 + 0x3 TouchScreenUsage, StartupUserAccount, ???
                    byte sa = br.ReadByte(); data.StartupUserAccount = (StartupUserAccountOption)sa;
                    byte t = br.ReadByte(); data.TouchScreenUsage = (TouchScreenUsageOption)t;
                    br.ReadByte();

                    // 0x3028 + 0x4 Attribute? None, Demo
                    uint a = br.ReadUInt32(); data.Attribute = (AttributeOption)a;

                    // 0x302C + 0x4 Supported languages, one bit for each supported language
                    // AmericanEnglish is the LSB, value&1. There are only 15 languages, so the 17 MS bits are 0
                    // If all languages are supported, the value if 00 00 7F FF (FF 7F 00 00 when written to disk)
                    data.SupportedLanguagesFlag = br.ReadInt32();

                    // 0x3030 + 0x4 Parental Control options flag
                    data.ParentalControl = (ParentalControlOption)br.ReadInt32();

                    // 0x3034 + 0x4 VideoCapture, Screenshot, DataLossConfirmation, PlayLogPolicy
                    byte v = br.ReadByte(); data.VideoCapture = (VideoCaptureOption)v;
                    byte s = br.ReadByte(); data.Screenshot = (ScreenshotOption)s;
                    byte d = br.ReadByte(); data.DataLossConfirmation = (DataLossConfirmationOption)d;
                    byte p = br.ReadByte(); data.PlayLogPolicy = (PlayLogPolicyOption)p;

                    // 0x3038 + 0x8 presence group ID or savedataownerid
                    data.PresenceGroupId = "0x" + br.ReadHex64();

                    // 0x3040 + 0x20 RatingAge
                    byte[] rating = br.ReadBytes(0x20);
                    data.Ratings = new ControlRating[rating.Length];
                    for (int i = 0; i < rating.Length; i++)
                    {
                        byte r = rating[i];
                        if (r == 0xFF) // not a valid age thus not supported
                            data.Ratings[i] = null;
                        else
                            data.Ratings[i] = new ControlRating { Organisation = (RatingOrganisation)i, Age = r, };
                    }

                    // 0x3060 + 0x10 Application version string
                    data.DisplayVersion = br.ReadUTF8NullTerminated(0x10);

                    // 0x3070 + 0x8 Base titleID for DLC, set even when DLC is not used. Usually app_titleID+0x1000
                    data.AddOnContentBaseId = "0x" + br.ReadHex64();

                    // 0x3078 + 0x8 presence group ID or savedataownerid
                    data.SaveDataOwnerId = "0x" + br.ReadHex64();

                    // 0x3080 + 0x8 UserAccountSaveDataSize
                    data.UserAccountSaveDataSize = "0x" + br.ReadHex64();

                    // 0x3088 + 0x8 UserAccountSaveDataSize
                    data.UserAccountSaveDataJournalSize = "0x" + br.ReadHex64();

                    // 0x3090 + 0x8 DeviceSaveDataSize
                    data.DeviceSaveDataSize = "0x" + br.ReadHex64();

                    // 0x3098 + 0x8 DeviceSaveDataJournalSize
                    data.DeviceSaveDataJournalSize = "0x" + br.ReadHex64();

                    // 0x30A0 + 0x8 BcatDeliveryCacheStorageSize
                    data.BcatDeliveryCacheStorageSize = "0x" + br.ReadHex64();

                    // 0x30A8 + 0x8 ApplicationErrorCodeCategory
                    data.ApplicationErrorCodeCategory = br.ReadUTF8NullTerminated(0x8);
                    if (string.IsNullOrWhiteSpace(data.ApplicationErrorCodeCategory)) data.ApplicationErrorCodeCategory = null;

                    // 0x30b0 + (0x8) * 0x8 LocalCommunicationId (array of 8) - just the title ID 8 times?
                     data.LocalCommunicationIds = new string[0x8];
                    for (int i = 0; i < 0x8; i++)
                        data.LocalCommunicationIds[i] = "0x" + br.ReadHex64();

                    // 0x30F0 + 0x4 LogoType ??

                    data.LogoType = (LogoTypeOption)br.ReadByte();

                    // Things get really shaky past here, I don't really know what anything does or how big it is

                    // 0x30F1 + 0x1 LogoHandling ??
                    data.LogoHandling = (LogoHandlingOption)br.ReadByte();

                    br.ReadBytes(6); // I dunno, but the ID that comes next is at 30F8

                    // 0x30F8 + 0x8 SeedForPseudoDeviceId
                    data.SeedForPseudoDeviceId = "0x" + br.ReadHex64();

                    // 0x3100 + 0x40 BcatPassphrase (0 when unused)
                    data.BcatPassphrase = br.ReadUTF8NullTerminated(0x40);
                    if (string.IsNullOrWhiteSpace(data.BcatPassphrase)) data.BcatPassphrase = null;

                    // The following fields are not for sure. I just guessed at their sizes. The fact that
                    // they all added up to exactly 0x60 bytes made me feel confident about it

                    data.AddOnContentRegistrationType = (AddOnContentRegistrationTypeOption)br.ReadUInt32();

                    data.UserAccountSaveDataSizeMax = "0x" + br.ReadHex64();

                    data.UserAccountSaveDataJournalSizeMax = "0x" + br.ReadHex64();

                    data.DeviceSaveDataSizeMax = "0x" + br.ReadHex64();

                    data.DeviceSaveDataJournalSizeMax = "0x" + br.ReadHex64();

                    data.TemporaryStorageSize = "0x" + br.ReadHex64();

                    data.CacheStorageSize = "0x" + br.ReadHex64();

                    data.CacheStorageJournalSize = "0x" + br.ReadHex64();

                    data.CacheStorageDataAndJournalSizeMax = "0x" + br.ReadHex64();

                    data.CacheStorageIndexMax = "0x" + br.ReadHex64();

                    data.Hdcp = (HdcpOption)br.ReadUInt32();

                    data.CrashReport = (CrashReportOption)br.ReadUInt32();

                    data.RuntimeAddOnContentInstall = (RuntimeAddOnContentInstallOption)br.ReadUInt32();

                    data.PlayLogQueryCapability = (PlayLogQueryCapabilityOption)br.ReadUInt32();

                    data.ProgramIndex = br.ReadUInt32();
                   
                    // 0x31A0 + 0xE60 Normally all-zero?
                    data.Reserved = br.ReadBytes(0xE60);

                    return data;
                }
            }
        }

        internal void GenerateXml(string controlXmlFile)
        {
            // Create a new file stream to write the serialized object to a file
            using (TextWriter writer = new StreamWriter(controlXmlFile))
            {
                XmlSerializer xmls = new XmlSerializer(typeof(ControlData));
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");
                xmls.Serialize(writer, this, ns);
            }

            logger.Info($"Generated XML file {Path.GetFileName(controlXmlFile)}!");
        }
    }

    [XmlRoot(ElementName = "Title")]
    public class ControlTitle
    {
        [XmlElement(ElementName = "Language")]
        public SwitchLanguage Language { get; set; }

        [XmlElement(ElementName = "Name")]
        public string Name { get; set; }

        [XmlElement(ElementName = "Publisher")]
        public string Publisher { get; set; }
    }

    [XmlRoot(ElementName = "Rating")]
    public class ControlRating
    {
        [XmlElement(ElementName = "Organisation")]
        public RatingOrganisation Organisation { get; set; }

        [XmlElement(ElementName = "Age")]
        public byte Age { get; set; }
    }

    [XmlRoot(ElementName = "Icon")]
    public class ControlIcon
    {
        [XmlElement(ElementName = "Language")]
        public SwitchLanguage Language { get; set; }

        [XmlElement(ElementName = "NxIconHash")]
        public string NxIconHash { get; set; }
    }

    public enum VideoCaptureOption { Deny, Allow }
    public enum ScreenshotOption { Allow, Deny }
    public enum StartupUserAccountOption { None, Required, RequiredWithNetworkServiceAccountAvailable }
    public enum TouchScreenUsageOption { None, Supported, Required }
    public enum AttributeOption { None, Demo }
    public enum PlayLogPolicyOption { All, LogOnly, PL_None }
    public enum DataLossConfirmationOption { None, Required }
    public enum ParentalControlOption { None, FreeCommunication }
    public enum LogoTypeOption { LicensedByNintendo, DistributedByNintendo, Nintendo }
    public enum LogoHandlingOption { Auto, Unknown_1, Unknown_2, Unknown_3, Unknown_4 } // I have no source for what this should be called
    public enum AddOnContentRegistrationTypeOption { OnDemand, Unknown_1, Unknown_2, Unknown_3, Unknown_4 }
    public enum HdcpOption { None, Unknown_1, Unknown_2, Unknown_3, Unknown_4 }
    public enum CrashReportOption { Deny, Allow, Unknown_2, Unknown_3, Unknown_4 }
    public enum RuntimeAddOnContentInstallOption { Deny, Allow, Unknown_2, Unknown_3, Unknown_4 }
    public enum PlayLogQueryCapabilityOption { None, Unknown_1, Unknown_2, Unknown_3, Unknown_4 }
 
Last edited by JupiterJesus,

Bellebite2000

Well-Known Member
Member
Joined
Jul 31, 2018
Messages
180
Trophies
0
Age
64
XP
256
Country
Afghanistan
The extra added xml files are generated from the NCAs during the NSP packing, hence you can repack ANY NSP and generate these files. The files are required for developers and for submission to Nintendo for review. Since we are not developing the game (it's already finished) and we are not submitting it to Nintendo for review (it's on the EShop) these are totally useless.

Unlike what you may think NSP's are NOT what eShop uses. eShop does NOT use a container file, they are raw separate files just like all Nintendo systems use. This was the case with Wii, 3DS and Wii U they are all raw files downloaded from eShop (not WADS, CIAS or NSPS). The containers were used for developers and submissions NOT for piracy and these extra files are useless and should be abandoned as the "proper way" to do retail pirated games.

Finally someone with a clue posting something not completely inaccurate.

If you want to pirate game, nsp from eshop is more than enough. If you are into the "preservation dream" (and believe me, you are not), then sure, you can collect other useless garbage crap files. BigBlackBalls should also add a .txt file mentioning the main color of the retail package, while they are at it... To make it COMPLETE. LOL.
 
  • Like
Reactions: tiliarou

Mr. Wizard

Ending the spread of bullshit one thread at a time
Member
Joined
Mar 20, 2015
Messages
1,814
Trophies
0
Location
E8 lattice
XP
1,532
Country
Canada
Finally someone with a clue posting something not completely inaccurate.

If you want to pirate game, nsp from eshop is more than enough. If you are into the "preservation dream" (and believe me, you are not), then sure, you can collect other useless garbage crap files. BigBlackBalls should also add a .txt file mentioning the main color of the retail package, while they are at it... To make it COMPLETE. LOL.
Big Blue Waffle needs to put in a png of the retail or gtfo.
 
  • Like
Reactions: RayPanimals

tubebar

Well-Known Member
Member
Joined
May 17, 2009
Messages
227
Trophies
0
XP
517
Country
United States
Finally someone with a clue posting something not completely inaccurate.

If you want to pirate game, nsp from eshop is more than enough. If you are into the "preservation dream" (and believe me, you are not), then sure, you can collect other useless garbage crap files. BigBlackBalls should also add a .txt file mentioning the main color of the retail package, while they are at it... To make it COMPLETE. LOL.

LOL
 

The Catboy

GBAtemp Official Catboy™: Boywife
Member
Joined
Sep 13, 2009
Messages
27,974
Trophies
4
Location
Making a non-binary fuss
XP
39,420
Country
Antarctica
Ok some more clues, Yes, I been hinting about the upcoming 'firm 6 series' to be rolled out soon publicly, lucky its already in beta for those with devkits, so we have time to find ways around it! :)

Alot of changes under the hood by big 'N', the top 4 are:

#1: massive file checks on both xci and nsp
#2: massive cdn changes
#3: massive efuses changes
#4: all new keys, and cart3 coming later on!

Top 4 things we will need to do and wait for:

#1: FIRST Don't Update to 6.x! :)
#2: Work Towards Emunand, and/or improved ways and apps to be able 'upgrading' without changes to 'fuses' similar to the current manual guides.
#3: New hardware might be needed to bypass 6.x checks. (ie. modded Joycons with UARTs added)
#4: Hopefully #2, will help remove the need for #3. (currently, only developers need #3 to find better solutions)



Hope the above answers your quest! :)

That's all for now, folks! :)
So why do you always lie to the general public? The only thing slightly true is the CDN changes, which were already known beforehand. Why do you always lie when time always exposes your lies?
 
Last edited by The Catboy,

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • No one is chatting at the moment.
  • K3Nv2 @ K3Nv2:
    I'll reformat and have a 3tb raid0 m. 2 at least
    +1
  • K3Nv2 @ K3Nv2:
    Lmao that sold out fast
    +1
  • Veho @ Veho:
    Yeet the cat.
    +1
  • K3Nv2 @ K3Nv2:
    Good idea
    +1
  • The Real Jdbye @ The Real Jdbye:
    i thought everybody knew cocktails are like 75% ice
  • Veho @ Veho:
    Yeah but not like this.
  • Veho @ Veho:
    It's not like they're complaining that their Slurpee is 99% ice or something, but if the cocktail calls for "shot of vodka, shot of vermouth, shot of gin, shot of Campari, three shots of juice, squirt of lemon" and ends up being a thimbleful of booze, that's a problem.
  • The Real Jdbye @ The Real Jdbye:
    the funny thing is cocktails in norway are only allowed to have 1 20ml shot of booze
  • The Real Jdbye @ The Real Jdbye:
    so..... yeah
  • The Real Jdbye @ The Real Jdbye:
    we're used to only having a thimbleful of booze
  • Veho @ Veho:
    Booo.
  • The Real Jdbye @ The Real Jdbye:
    same thing if you want whisky on the rocks or something, you can't get a double
  • The Real Jdbye @ The Real Jdbye:
    but you could buy as many shots of whisky (or anything else) as you want and ask for a glass of ice and pour them in
  • The Real Jdbye @ The Real Jdbye:
    it's dumb
  • Veho @ Veho:
    Maybe.
  • Veho @ Veho:
    There was a comparison of the number of Ibuprofen poisonings before and after they limited the maximum dosage per box or per pill (i'll look that up). No limit on the number of boxes you can still buy as many as you want, so people argued it was pointless.
  • Veho @ Veho:
    But the number of (accidental) poisonings dropped because drinking an entire package of ibuprofen pills went from "I need a new liver" to "I need a new box of Ibuprofen".
  • Veho @ Veho:
    Here we have ketoprofen that used to be prescription-only because of the risk of toxic dosages, but then they halved the dose per pill and sell them in bottles of six pills apiece instead of twenty and it doesn't need a prescription any more. Yes you can buy more than one bottle but people simply don't.
  • Psionic Roshambo @ Psionic Roshambo:
    Usually accidentally overdose of ibuprofen here is from people taking like cold medicine then ibuprofen for a headache and the combination is over what they need
    Veho @ Veho: https://imgur.com/gallery/QQkYnQu