Exemplo n.º 1
0
        public static void ProcessPk11(Context ctx)
        {
            using (var file = new LocalStorage(ctx.Options.InFile, FileAccess.Read))
            {
                var    package1 = new Package1(ctx.Keyset, file);
                string outDir   = ctx.Options.OutDir;

                if (outDir != null)
                {
                    Directory.CreateDirectory(outDir);

                    package1.Pk11.OpenWarmboot().WriteAllBytes(Path.Combine(outDir, "Warmboot.bin"), ctx.Logger);
                    package1.Pk11.OpenNxBootloader().WriteAllBytes(Path.Combine(outDir, "NX_Bootloader.bin"), ctx.Logger);
                    package1.Pk11.OpenSecureMonitor().WriteAllBytes(Path.Combine(outDir, "Secure_Monitor.bin"), ctx.Logger);
                    package1.OpenDecryptedPackage().WriteAllBytes(Path.Combine(outDir, "Decrypted.bin"), ctx.Logger);
                }
            }
        }
Exemplo n.º 2
0
        private void btn_next_Click(object sender, RoutedEventArgs e)
        {
            NavigationWindow root = FindRoot();

            // Reset SDService so that it's ready for later
            SDService.ResetHandlers();
            SDService.Stop();

            root.Navigate(new DerivingPage((page) =>
            {
                // setup key derivation task and execute it asynchronously on the next page

                Array.Copy(SBK, HACGUIKeyset.Keyset.SecureBootKey, 0x10);
                Array.Copy(TSECKeys[0], HACGUIKeyset.Keyset.TsecKey, 0x10);

                FileStream boot0 = HACGUIKeyset.TempBOOT0FileInfo.OpenRead();
                boot0.Seek(0x180000, SeekOrigin.Begin); // Seek to keyblob area

                for (int i = 0; i < 32; i++)
                {
                    boot0.Read(HACGUIKeyset.Keyset.EncryptedKeyblobs[i], 0, 0xB0);
                    boot0.Seek(0x150, SeekOrigin.Current); // skip empty region
                }

                boot0.Seek(0x100000, SeekOrigin.Begin);
                List <HashSearchEntry> searches = new List <HashSearchEntry>
                {
                    new HashSearchEntry(NintendoKeys.MasterKeySourceHash, 0x10),
                    new HashSearchEntry(NintendoKeys.KeyblobMacKeySourceHash, 0x10)
                };
                Dictionary <byte[], byte[]> hashes = boot0.FindKeyViaHash(searches, new SHA256Managed(), 0x10, 0x40000);
                Array.Copy(hashes[NintendoKeys.MasterKeySourceHash], HACGUIKeyset.Keyset.MasterKeySource, 0x10);
                Array.Copy(hashes[NintendoKeys.KeyblobMacKeySourceHash], HACGUIKeyset.Keyset.KeyblobMacKeySource, 0x10);

                HACGUIKeyset.Keyset.DeriveKeys();

                // Copy package1 into seperate file
                boot0.Seek(0x100000, SeekOrigin.Begin);
                FileStream pkg1stream = HACGUIKeyset.TempPkg1FileInfo.Create();
                boot0.CopyToNew(pkg1stream, 0x40000);
                boot0.Close();
                pkg1stream.Seek(0, SeekOrigin.Begin); // reset position

                HACGUIKeyset.RootTempPkg1FolderInfo.Create();
                Package1 pkg1 = new Package1(HACGUIKeyset.Keyset, pkg1stream);

                // Extracting package1 contents
                FileStream NXBootloaderStream  = HACGUIKeyset.TempNXBootloaderFileInfo.Create();
                FileStream SecureMonitorStream = HACGUIKeyset.TempSecureMonitorFileInfo.Create();
                FileStream WarmbootStream      = HACGUIKeyset.TempWarmbootFileInfo.Create();
                pkg1.Pk11.OpenNxBootloader().CopyToNew(NXBootloaderStream);
                pkg1.Pk11.OpenSecureMonitor().CopyToNew(SecureMonitorStream);
                pkg1.Pk11.OpenWarmboot().CopyToNew(WarmbootStream);


                searches = new List <HashSearchEntry>
                {
                    new HashSearchEntry(NintendoKeys.Pkg2KeySourceHash, 0x10),
                    new HashSearchEntry(NintendoKeys.TitleKekSourceHash, 0x10),
                    new HashSearchEntry(NintendoKeys.AesKekGenerationSourceHash, 0x10)
                };

                SecureMonitorStream.Seek(0, SeekOrigin.Begin);
                hashes = SecureMonitorStream.FindKeyViaHash(searches, new SHA256Managed(), 0x10);
                Array.Copy(hashes[NintendoKeys.Pkg2KeySourceHash], HACGUIKeyset.Keyset.Package2KeySource, 0x10);
                Array.Copy(hashes[NintendoKeys.TitleKekSourceHash], HACGUIKeyset.Keyset.TitlekekSource, 0x10);
                Array.Copy(hashes[NintendoKeys.AesKekGenerationSourceHash], HACGUIKeyset.Keyset.AesKekGenerationSource, 0x10);

                HACGUIKeyset.Keyset.DeriveKeys(); // derive the additional keys obtained from package1

                // close shit
                NXBootloaderStream.Close();
                SecureMonitorStream.Close();
                WarmbootStream.Close();
                pkg1stream.Close();

                PageExtension next = null;

                // move to next page (after the task is complete)
                page.Dispatcher.BeginInvoke(new Action(() => // move to UI thread
                {
                    next = new PickNANDPage();
                    page.FindRoot().Navigate(next);
                })).Wait();   // must wait, otherwise a race condition may occur

                return(next); // return the page we are navigating to
            }));
        }
        private static IEnumerator AddItem(GameScript script, Package package)
        {
            bool flag      = false;
            bool flag2     = false;
            bool localItem = package.localItem;

            Item[] inventory = Patch_GameScript_AddItem.inventory.GetValue(script) as Item[];
            if (package.item.q == 0)
            {
                package.item.q = 1;
            }
            ItemType type = ItemRegistry.GetTypeByID(package.item.id);

            if ((type & ItemType.NONSTACKING) == ItemType.STACKING)
            {
                for (int i = 0; i < 36; i++)
                {
                    if (GadgetCoreAPI.CanItemsStack(inventory[i], package.item) && inventory[i].q < 9999)
                    {
                        inventory[i].q += package.item.q;
                        if (inventory[i].q > 9999)
                        {
                            Item item = new Item(package.item.id, inventory[i].q - 9999, 0, 0, 0, new int[3], new int[3]);
                            item.SetAllExtraData(package.item.GetAllExtraData());
                            inventory[i].q = 9999;
                            Package package2 = new Package(item, package.obj, localItem);
                            script.AddItem(package2);
                        }
                        RefreshSlot.Invoke(script, new object[] { i });
                        flag2 = true;
                        flag  = true;
                        break;
                    }
                }
            }
            if (!flag)
            {
                for (int i = (type & ItemType.EQUIP_MASK) == ItemType.DROID ? 6 : 0; i < 36; i++)
                {
                    if (inventory[i].id == 0)
                    {
                        inventory[i] = package.item;
                        RefreshSlot.Invoke(script, new object[] { i });
                        flag2 = true;
                        break;
                    }
                }
            }
            if (flag2)
            {
                script.GetComponent <AudioSource>().PlayOneShot((AudioClip)Resources.Load("Au/pickup"), Menuu.soundLevel / 10f);
                Vector3    position   = MenuScript.player.transform.position;
                GameObject gameObject = (GameObject)Object.Instantiate(Resources.Load("txtGet"), new Vector3(position.x, position.y + 1f, -3.2f), Quaternion.identity);
                Package1   value      = new Package1(GetItemName.Invoke(script, new object[] { package.item.id }) as string, package.item.q);
                gameObject.SendMessage("Init", value);
            }
            if (localItem)
            {
                package.obj.SendMessage("FinalReply", flag2);
            }
            else if (Network.isServer)
            {
                package.obj.SendMessage("FinalReply", flag2);
            }
            else
            {
                package.obj.GetComponent <NetworkView>().RPC("FinalReply", RPCMode.Server, new object[]
                {
                    flag2
                });
            }
            return(null);
        }
Exemplo n.º 4
0
 public Facade()
 {
     package1 = new Package1();
     package2 = new Package2();
 }