コード例 #1
0
ファイル: CryptoDebug.cs プロジェクト: maxton/LibOrbisPkg
 void LoadPfs(string filename)
 {
     pfs      = MemoryMappedFile.CreateFromFile(filename, System.IO.FileMode.Open, mapName: null, 0, MemoryMappedFileAccess.Read);
     accessor = new MemoryMappedViewAccessor_(pfs.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read), true);
     using (var s = pfs.CreateViewStream(0, 0x5A0, MemoryMappedFileAccess.Read))
     {
         header = PfsHeader.ReadFromStream(s);
         objectView1.ObjectPreview(header);
         pfsSeed.Text = header.Seed.ToHexCompact();
     }
     xtsReader = accessor;
     UpdateHexView();
 }
コード例 #2
0
ファイル: MainWin.cs プロジェクト: maxton/LibOrbisPkg
 private void setPKGPFSFileMetadataToolStripMenuItem_Click(object sender, EventArgs e)
 {
     using (var ofd = new OpenFileDialog()
     {
         Title = "Select files",
         Filter = "PKG/PFS Files (*.pkg, *.dat)|*.pkg;*.dat",
         Multiselect = true
     })
     {
         if (ofd.ShowDialog() != DialogResult.OK)
         {
             return;
         }
         foreach (var filename in ofd.FileNames)
         {
             DateTime creationTime = File.GetCreationTimeUtc(filename);
             DateTime modifiedTime = File.GetLastWriteTime(filename);
             using (var f = File.OpenRead(filename))
             {
                 if (filename.ToLowerInvariant().EndsWith(".dat"))
                 {
                     var header = PfsHeader.ReadFromStream(f);
                     creationTime = modifiedTime =
                         new DateTime(1970, 1, 1)
                         .AddSeconds(header.InodeBlockSig.Time1_sec);
                 }
                 else if (filename.ToLowerInvariant().EndsWith(".pkg"))
                 {
                     var pkgHeader = new PkgReader(f).ReadHeader();
                     f.Position = (long)pkgHeader.pfs_image_offset;
                     var header = PfsHeader.ReadFromStream(f);
                     creationTime = modifiedTime =
                         new DateTime(1970, 1, 1)
                         .AddSeconds(header.InodeBlockSig.Time1_sec);
                 }
             }
             File.SetCreationTimeUtc(filename, creationTime);
             File.SetLastWriteTimeUtc(filename, modifiedTime);
         }
     }
 }
コード例 #3
0
ファイル: PFSView.cs プロジェクト: maxton/LibOrbisPkg
        public PFSView(string filename)
        {
            InitializeComponent();
            pfsFile = MemoryMappedFile.CreateFromFile(filename, System.IO.FileMode.Open, mapName: null, 0, MemoryMappedFileAccess.Read);
            va      = pfsFile.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read);
            va.Read(0, out int val);
            if (val == PFSCReader.Magic)
            {
                reader = new PfsReader(new PFSCReader(va));
            }
            else
            {
                PfsHeader header;
                using (var h = pfsFile.CreateViewStream(0, 0x600, MemoryMappedFileAccess.Read))
                {
                    header = PfsHeader.ReadFromStream(h);
                }
                byte[] tweak = null, data = null;
                if (header.Mode.HasFlag(PfsMode.Encrypted))
                {
                    var passcode = new PasscodeEntry("Please enter data key", 32);
                    passcode.Text = "PFS is encrypted";
                    passcode.ShowDialog();
                    data = passcode.Passcode.FromHexCompact();

                    passcode      = new PasscodeEntry("Please enter tweak key", 32);
                    passcode.Text = "PFS is encrypted";
                    passcode.ShowDialog();
                    data   = passcode.Passcode.FromHexCompact();
                    reader = new PfsReader(va, data: data, tweak: tweak);
                }
                else
                {
                    reader = new PfsReader(va);
                }
            }
            fileView1.AddRoot(reader, filename);
        }
コード例 #4
0
        public PkgView(string path)
        {
            InitializeComponent();
            if (path == null)
            {
                return;
            }
            pkgFile = MemoryMappedFile.CreateFromFile(path);
            using (var s = pkgFile.CreateViewStream())
                ObjectPreview(new PkgReader(s).ReadHeader(), pkgHeaderTreeView);
            using (var s = pkgFile.CreateViewStream())
                pkg = new PkgReader(s).ReadPkg();
            try
            {
                using (var s = pkgFile.CreateViewStream((long)pkg.Header.pfs_image_offset, (long)pkg.Header.pfs_image_size))
                    ObjectPreview(PfsHeader.ReadFromStream(s), pfsHeaderTreeView);
            }
            catch (Exception e)
            {
                pkgHeaderTabControl.TabPages.Remove(outerPfsHeaderTabPage);
                MessageBox.Show("Error loading outer PFS: " + e.Message + Environment.NewLine + "Please report this issue at https://github.com/maxton/LibOrbisPkg/issues");
            }
            if (pkg.Metas.Metas.Where(entry => entry.id == EntryId.ICON0_PNG).FirstOrDefault() is MetaEntry icon0)
            {
                using (var s = pkgFile.CreateViewStream(icon0.DataOffset, icon0.DataSize))
                {
                    pictureBox1.Image = Image.FromStream(s);
                }
            }
            contentIdTextBox.Text = pkg.Header.content_id;
            titleTextBox.Text     = pkg.ParamSfo.ParamSfo["TITLE"]?.ToString();
            sizeLabel.Text        = FileView.HumanReadableFileSize((long)pkg.Header.package_size);
            var category = pkg.ParamSfo.ParamSfo["CATEGORY"].ToString();

            typeLabel.Text    = SFOView.SfoTypes.Where(x => x.Category == category).FirstOrDefault() is SFOView.SfoType t ? t.Description : "Unknown";
            versionLabel.Text = pkg.ParamSfo.ParamSfo["VERSION"]?.ToString();
            if (pkg.ParamSfo.ParamSfo["APP_VER"] is Utf8Value v)
            {
                appVerLabel.Text = v.Value;
            }
            else
            {
                appVerLabelLabel.Visible = false;
                appVerLabel.Visible      = false;
            }
            var sfoEditor = new SFOView(pkg.ParamSfo.ParamSfo, true);

            sfoEditor.Dock = DockStyle.Fill;
            tabPage1.Controls.Add(sfoEditor);


            if (pkg.CheckPasscode("00000000000000000000000000000000"))
            {
                passcode = "00000000000000000000000000000000";
                ekpfs    = Crypto.ComputeKeys(pkg.Header.content_id, passcode, 1);
            }
            else
            {
                ekpfs = pkg.GetEkpfs();
            }
            ReopenFileView();

            foreach (var e in pkg.Metas.Metas)
            {
                var lvi = new ListViewItem(new[] {
                    e.id.ToString(),
                    string.Format("0x{0:X}", e.DataSize),
                    string.Format("0x{0:X}", e.DataOffset),
                    e.Encrypted ? "Yes" : "No",
                    e.KeyIndex.ToString(),
                });
                lvi.Tag = e;
                entriesListView.Items.Add(lvi);
            }
        }
コード例 #5
0
        public PkgView(string path)
        {
            InitializeComponent();
            if (path == null)
            {
                return;
            }
            pkgFile = MemoryMappedFile.CreateFromFile(path, FileMode.Open, "pkgFile" + idx++, 0, MemoryMappedFileAccess.Read);
            using (var s = pkgFile.CreateViewStream(0, 0, MemoryMappedFileAccess.Read))
                ObjectPreview(new PkgReader(s).ReadHeader(), pkgHeaderTreeView);
            using (var s = pkgFile.CreateViewStream(0, 0, MemoryMappedFileAccess.Read))
                pkg = new PkgReader(s).ReadPkg();
            try
            {
                using (var s = pkgFile.CreateViewStream((long)pkg.Header.pfs_image_offset, (long)pkg.Header.pfs_image_size, MemoryMappedFileAccess.Read))
                    ObjectPreview(PfsHeader.ReadFromStream(s), pfsHeaderTreeView);
            }
            catch (Exception e)
            {
                pkgHeaderTabControl.TabPages.Remove(outerPfsHeaderTabPage);
                MessageBox.Show("Error loading outer PFS: " + e.Message + Environment.NewLine + "Please report this issue at https://github.com/maxton/LibOrbisPkg/issues");
            }
            if (pkg.Metas.Metas.Where(entry => entry.id == EntryId.ICON0_PNG).FirstOrDefault() is MetaEntry icon0)
            {
                using (var s = pkgFile.CreateViewStream(icon0.DataOffset, icon0.DataSize, MemoryMappedFileAccess.Read))
                {
                    pictureBox1.Image = Image.FromStream(s);
                }
            }
            contentIdTextBox.Text = pkg.Header.content_id;
            titleTextBox.Text     = pkg.ParamSfo.ParamSfo["TITLE"]?.ToString();
            sizeLabel.Text        = FileView.HumanReadableFileSize((long)pkg.Header.package_size);
            var category = pkg.ParamSfo.ParamSfo["CATEGORY"].ToString();

            typeLabel.Text    = SFOView.SfoTypes.Where(x => x.Category == category).FirstOrDefault() is SFOView.SfoType t ? t.Description : "Unknown";
            versionLabel.Text = pkg.ParamSfo.ParamSfo["VERSION"]?.ToString();
            if (pkg.ParamSfo.ParamSfo["APP_VER"] is Utf8Value v)
            {
                appVerLabel.Text = v.Value;
            }
            else
            {
                appVerLabelLabel.Visible = false;
                appVerLabel.Visible      = false;
            }
            var sfoEditor = new SFOView(pkg.ParamSfo.ParamSfo, true);

            sfoEditor.Dock = DockStyle.Fill;
            tabPage1.Controls.Add(sfoEditor);


            if (pkg.CheckPasscode("00000000000000000000000000000000"))
            {
                passcode = "00000000000000000000000000000000";
                ekpfs    = Crypto.ComputeKeys(pkg.Header.content_id, passcode, 1);
            }
            else if (KeyDB.Instance.Passcodes.TryGetValue(pkg.Header.content_id, out var keydbPasscode) &&
                     pkg.CheckPasscode(keydbPasscode))
            {
                passcode = keydbPasscode;
                ekpfs    = Crypto.ComputeKeys(pkg.Header.content_id, passcode, 1);
            }
            else if (pkg.GetEkpfs() is byte[] ek && ek != null)
            {
                ekpfs = ek;
            }