예제 #1
0
 private static void sfo2edat(string infile)
 {
     string outFile = null;
     outFile = new C00EDAT().makeedat(infile, outFile);
     if (Directory.Exists("temp"))
     {
         Directory.Delete("temp", true);
     }
     if (outFile.EndsWith(".edat"))
     {
         Console.WriteLine("Created " + outFile);
     }
 }
예제 #2
0
        private string ExtractFiles(string decryptedPKGFileName, string encryptedPKGFileName)
        {
            Exception exception;

            try
            {
                int    num         = 0x1400000;
                uint   num2        = 0;
                uint   num3        = 0;
                uint   num4        = 0;
                long   sourceIndex = 0L;
                string str         = null;
                if (encryptedPKGFileName.Contains(@"\"))
                {
                    str = encryptedPKGFileName.Substring(encryptedPKGFileName.LastIndexOf(@"\")).Replace(@"\", "").Replace(".pkg", "");
                }
                else
                {
                    str = encryptedPKGFileName.Replace(".pkg", "");
                }
                string path = "temp/" + str;
                Directory.CreateDirectory("temp");
                if (Directory.Exists(path))
                {
                    Directory.Delete(path, true);
                    Thread.Sleep(100);
                    Directory.CreateDirectory(path);
                    Thread.Sleep(100);
                }
                byte[]       sourceArray      = new byte[0x4e200];
                byte[]       buffer3          = new byte[8];
                byte[]       destinationArray = new byte[4];
                byte[]       buffer5          = new byte[4];
                byte[]       buffer6          = new byte[4];
                byte[]       buffer7          = new byte[4];
                byte[]       buffer8          = new byte[4];
                byte[]       buffer9          = new byte[4];
                byte[]       buffer10         = new byte[4];
                byte[]       buffer11         = new byte[4];
                byte[]       buffer12         = new byte[0x20];
                byte[]       buffer13         = new byte[8];
                byte         num6             = 0;
                byte         num7             = 0;
                bool         flag             = false;
                Stream       input            = new FileStream(decryptedPKGFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                BinaryReader reader           = new BinaryReader(input);
                Stream       stream2          = new FileStream(encryptedPKGFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                BinaryReader brEncrPKG        = new BinaryReader(stream2);
                input.Seek(0L, SeekOrigin.Begin);
                sourceArray = reader.ReadBytes(sourceArray.Length);
                sourceIndex = 0L;
                num4        = 0;
                Array.Copy(sourceArray, 0, buffer5, 0, buffer5.Length);
                Array.Reverse(buffer5);
                uint num9 = BitConverter.ToUInt32(buffer5, 0) / 0x20;
                Array.Copy(sourceArray, 12, destinationArray, 0, destinationArray.Length);
                Array.Reverse(destinationArray);
                uint num10 = BitConverter.ToUInt32(destinationArray, 0);
                input.Seek(0L, SeekOrigin.Begin);
                sourceArray = reader.ReadBytes((int)num10);
                if (num9 < 0)
                {
                    return("");
                }
                for (int i = 0; i < num9; i++)
                {
                    byte[]       buffer2;
                    BinaryWriter writer;
                    double       num14;
                    ulong        num15;
                    ulong        num16;
                    ulong        num17;
                    Array.Copy(sourceArray, sourceIndex + 12L, buffer8, 0L, (long)buffer8.Length);
                    Array.Reverse(buffer8);
                    num2 = BitConverter.ToUInt32(buffer8, 0) + num4;
                    Array.Copy(sourceArray, sourceIndex + 20L, buffer9, 0L, (long)buffer9.Length);
                    Array.Reverse(buffer9);
                    num3 = BitConverter.ToUInt32(buffer9, 0);
                    Array.Copy(sourceArray, sourceIndex, buffer10, 0L, (long)buffer10.Length);
                    Array.Reverse(buffer10);
                    uint num12 = BitConverter.ToUInt32(buffer10, 0);
                    Array.Copy(sourceArray, sourceIndex + 4L, buffer11, 0L, (long)buffer11.Length);
                    Array.Reverse(buffer11);
                    uint num13 = BitConverter.ToUInt32(buffer11, 0);
                    num6     = sourceArray[(int)((IntPtr)(sourceIndex + 0x18L))];
                    num7     = sourceArray[(int)((IntPtr)(sourceIndex + 0x1bL))];
                    buffer12 = new byte[num13];
                    Array.Copy(sourceArray, (long)num12, buffer12, 0L, (long)num13);
                    string str5 = ByteArrayToAscii(buffer12, 0, buffer12.Length, true);
                    string str6 = string.Concat((IEnumerable <string>)(from b in buffer12 select b.ToString("x2")));
                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                        Thread.Sleep(100);
                    }
                    FileStream output = null;
                    if ((num7 == 4) && (num3 == 0))
                    {
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }
                    if (num6 == 0x90)
                    {
                        string        str7   = (path + @"\" + str5).Replace("/", @"\");
                        DirectoryInfo parent = Directory.GetParent(str7);
                        if (!Directory.Exists(parent.ToString()))
                        {
                            Directory.CreateDirectory(parent.ToString());
                        }
                        output = new FileStream(str7, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
                    }
                    else
                    {
                        Array.Copy(this.DecryptData((int)num13, (long)num12, (long)this.uiEncryptedFileStartOffset, this.PS3AesKey, stream2, brEncrPKG), 0L, buffer12, 0L, (long)num13);
                        str5 = ByteArrayToAscii(buffer12, 0, buffer12.Length, true);
                        if (!flag)
                        {
                            try
                            {
                            }
                            catch (Exception exception1)
                            {
                                exception = exception1;
                                str5      = i.ToString() + ".raw";
                            }
                        }
                        else if (str5 == "PARAM.SFO")
                        {
                            try
                            {
                                output = new FileStream(path + @"\" + str5, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
                            }
                            catch (Exception exception2)
                            {
                                exception = exception2;
                                str5      = i.ToString() + ".raw";
                            }
                        }
                    }
                    if (((num6 == 0x90) && flag) && (str5 == "PARAM.SFO"))
                    {
                        writer = new BinaryWriter(output);
                        input.Seek((long)num2, SeekOrigin.Begin);
                        num14 = ((double)num3) / ((double)num);
                        num15 = (ulong)Math.Floor(num14);
                        num16 = ((ulong)num3) % ((ulong)num);
                        if (num16 > 0L)
                        {
                            num15 += (ulong)1L;
                        }
                        buffer2 = new byte[num];
                        num17   = 0L;
                        while (num17 < num15)
                        {
                            if ((num16 > 0L) && (num17 == (num15 - ((ulong)1L))))
                            {
                                buffer2 = new byte[num16];
                            }
                            reader.Read(buffer2, 0, buffer2.Length);
                            writer.Write(buffer2);
                            num17 += (ulong)1L;
                        }
                        output.Close();
                        writer.Close();
                    }
                    if (((num6 != 0x90) && flag) && (str5 == "PARAM.SFO"))
                    {
                        writer = new BinaryWriter(output);
                        input.Seek((long)num2, SeekOrigin.Begin);
                        num14 = ((double)num3) / ((double)num);
                        num15 = (ulong)Math.Floor(num14);
                        num16 = ((ulong)num3) % ((ulong)num);
                        if (num16 > 0L)
                        {
                            num15 += (ulong)1L;
                        }
                        buffer2 = new byte[num];
                        long length = 0L;
                        for (num17 = 0L; num17 < num15; num17 += (ulong)1L)
                        {
                            if ((num16 > 0L) && (num17 == (num15 - ((ulong)1L))))
                            {
                                buffer2 = new byte[num16];
                            }
                            byte[] buffer = this.DecryptData(buffer2.Length, num2 + length, (long)this.uiEncryptedFileStartOffset, this.PS3AesKey, stream2, brEncrPKG);
                            length = buffer2.Length;
                            writer.Write(buffer, 0, buffer2.Length);
                        }
                        output.Close();
                        writer.Close();
                    }
                    sourceIndex += 0x20L;
                }
                stream2.Close();
                brEncrPKG.Close();
                input.Close();
                reader.Close();
                if (File.Exists(decryptedPKGFileName))
                {
                    File.Delete(decryptedPKGFileName);
                }
                Console.WriteLine("Creating EDAT");
                string  outFile = null;
                C00EDAT cedat   = new C00EDAT();
                return(cedat.makeedat(path + "/PARAM.SFO", outFile));
            }
            catch (Exception exception3)
            {
                exception = exception3;
                SystemSounds.Beep.Play();
                return("");
            }
        }
        private string ExtractFiles(string decryptedPKGFileName, string encryptedPKGFileName)
        {
            try
            {
                int    twentyMb            = 1024 * 1024 * 20;
                UInt32 ExtractedFileOffset = 0;
                UInt32 ExtractedFileSize   = 0;
                UInt32 OffsetShift         = 0;
                long   positionIdx         = 0;
                string pkgname             = null;
                if (encryptedPKGFileName.Contains("\\"))
                {
                    string pkgname1 = encryptedPKGFileName.Substring(encryptedPKGFileName.LastIndexOf("\\"));
                    string pkgname2 = pkgname1.Replace("\\", "");
                    pkgname = pkgname2.Replace(".pkg", "");
                }
                else
                {
                    pkgname = encryptedPKGFileName.Replace(".pkg", "");
                }


                String WorkDir = "temp/" + pkgname;

                // WorkDir = decryptedPKGFileName + ".EXT";
                Directory.CreateDirectory("temp");
                if (Directory.Exists(WorkDir))
                {
                    Directory.Delete(WorkDir, true);
                    System.Threading.Thread.Sleep(100);

                    Directory.CreateDirectory(WorkDir);
                    System.Threading.Thread.Sleep(100);
                }

                byte[] FileTable = new byte[320000];
                byte[] dumpFile;
                byte[] sdkVer          = new byte[8];
                byte[] firstFileOffset = new byte[4];
                byte[] firstNameOffset = new byte[4];
                byte[] fileNr          = new byte[4];
                byte[] isDir           = new byte[4];
                byte[] Offset          = new byte[4];
                byte[] Size            = new byte[4];
                byte[] NameOffset      = new byte[4];
                byte[] NameSize        = new byte[4];
                byte[] Name            = new byte[32];
                byte[] bootMagic       = new byte[8];
                byte   contentType     = 0;
                byte   fileType        = 0;
                bool   isFile          = false;

                Stream       decrPKGReadStream = new FileStream(decryptedPKGFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                BinaryReader brDecrPKG         = new BinaryReader(decrPKGReadStream);

                Stream       encrPKGReadStream = new FileStream(encryptedPKGFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                BinaryReader brEncrPKG         = new BinaryReader(encrPKGReadStream);

                //Read the file Table
                decrPKGReadStream.Seek((long)0, SeekOrigin.Begin);
                FileTable = brDecrPKG.ReadBytes(FileTable.Length);

                positionIdx = 0;

                OffsetShift = 0;   //Shift Relative to os.raw

                Array.Copy(FileTable, 0, firstNameOffset, 0, firstNameOffset.Length);
                Array.Reverse(firstNameOffset);
                uint uifirstNameOffset = BitConverter.ToUInt32(firstNameOffset, 0);

                uint uiFileNr = uifirstNameOffset / 32;

                Array.Copy(FileTable, 12, firstFileOffset, 0, firstFileOffset.Length);
                Array.Reverse(firstFileOffset);
                uint uifirstFileOffset = BitConverter.ToUInt32(firstFileOffset, 0);

                //Read the file Table
                decrPKGReadStream.Seek((long)0, SeekOrigin.Begin);
                FileTable = brDecrPKG.ReadBytes((int)uifirstFileOffset);

                //If number of files is negative then something is wrong...
                if ((int)uiFileNr < 0)
                {
                    //  txtResults.Text += "ERROR: An error occured during the files extraction process cause of a decryption error";
                    //  SystemSounds.Beep.Play();
                    return("");
                }



                //Table:
                //0-3         4-7         8-11        12-15       16-19       20-23       24-27       28-31
                //|name loc | |name size| |   NULL  | |file loc | |  NULL   | |file size| |cont type| |   NULL  |

                for (int ii = 0; ii < (int)uiFileNr; ii++)
                {
                    Array.Copy(FileTable, positionIdx + 12, Offset, 0, Offset.Length);
                    Array.Reverse(Offset);
                    ExtractedFileOffset = BitConverter.ToUInt32(Offset, 0) + OffsetShift;

                    Array.Copy(FileTable, positionIdx + 20, Size, 0, Size.Length);
                    Array.Reverse(Size);
                    ExtractedFileSize = BitConverter.ToUInt32(Size, 0);

                    Array.Copy(FileTable, positionIdx, NameOffset, 0, NameOffset.Length);
                    Array.Reverse(NameOffset);
                    uint ExtractedFileNameOffset = BitConverter.ToUInt32(NameOffset, 0);

                    Array.Copy(FileTable, positionIdx + 4, NameSize, 0, NameSize.Length);
                    Array.Reverse(NameSize);
                    uint ExtractedFileNameSize = BitConverter.ToUInt32(NameSize, 0);

                    contentType = FileTable[positionIdx + 24];
                    fileType    = FileTable[positionIdx + 27];

                    Name = new byte[ExtractedFileNameSize];
                    Array.Copy(FileTable, (int)ExtractedFileNameOffset, Name, 0, ExtractedFileNameSize);
                    string ExtractedFileName = ByteArrayToAscii(Name, 0, Name.Length, true);
                    // txtResults.Text += "ExtractedFileName = " + ExtractedFileName;
                    // txtResults.Text += "ExtractedFileNameOffset = " + ExtractedFileNameOffset;
                    //  txtResults.Text += "ExtractedFileNameSize = " + ExtractedFileNameSize;
                    string dataString = String.Concat(Name.Select(b => b.ToString("x2")));
                    //  txtResults.Text += "name = " + dataString;



                    //Write Directory
                    if (!Directory.Exists(WorkDir))
                    {
                        Directory.CreateDirectory(WorkDir);
                        System.Threading.Thread.Sleep(100);
                    }

                    FileStream ExtractedFileWriteStream = null;

                    //File / Directory
                    if ((fileType == 0x04) && (ExtractedFileSize == 0x00))
                    {
                        isFile = false;
                    }
                    else
                    {
                        isFile = true;
                    }

                    //contentType == 0x90 = PSP file/dir
                    if (contentType == 0x90)
                    {
                        string FileDir = WorkDir + "\\" + ExtractedFileName;
                        FileDir = FileDir.Replace("/", "\\");
                        DirectoryInfo FileDirectory = Directory.GetParent(FileDir);

                        if (!Directory.Exists(FileDirectory.ToString()))
                        {
                            Directory.CreateDirectory(FileDirectory.ToString());
                        }
                        ExtractedFileWriteStream = new FileStream(FileDir, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
                    }
                    else
                    {
                        //contentType == (0x80 || 0x00) = PS3 file/dir
                        //fileType == 0x01 = NPDRM File
                        //fileType == 0x03 = Raw File
                        //fileType == 0x04 = Directory

                        //Decrypt PS3 Filename
                        byte[] DecryptedData = DecryptData((int)ExtractedFileNameSize, (long)ExtractedFileNameOffset, (long)uiEncryptedFileStartOffset, PS3AesKey, encrPKGReadStream, brEncrPKG);
                        Array.Copy(DecryptedData, 0, Name, 0, ExtractedFileNameSize);
                        ExtractedFileName = ByteArrayToAscii(Name, 0, Name.Length, true);

                        StreamReader reader = null;
                        // string dataString = String.Concat(FileTable.Select(b => b.ToString("x2")));
                        //  sw3.AutoFlush = true;
                        //  Console.SetOut(sw3);
                        //  Console.WriteLine(ExtractedFileName);
                        //   Console.ReadKey();
                        //  reader = new StreamReader(ExtractedFileName);
                        if (!isFile)
                        {
                            //Directory
                            try
                            {
                                //  if (!Directory.Exists(ExtractedFileName))
                                //   Directory.CreateDirectory(WorkDir + "\\" + ExtractedFileName);
                            }
                            catch (Exception ex)
                            {
                                //This should not happen xD
                                ExtractedFileName = ii.ToString() + ".raw";
                                // if (!Directory.Exists(ExtractedFileName))
                                //  Directory.CreateDirectory(WorkDir + "\\" + ExtractedFileName);
                            }
                        }
                        else if (ExtractedFileName == "PARAM.SFO")
                        {
                            //File
                            try
                            {
                                ExtractedFileWriteStream = new FileStream(WorkDir + "\\" + ExtractedFileName, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
                            }
                            catch (Exception ex)
                            {
                                //This should not happen xD
                                ExtractedFileName = ii.ToString() + ".raw";
                                // ExtractedFileWriteStream = new FileStream(WorkDir + "\\" + ExtractedFileName, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
                            }
                        }
                    }

                    if (contentType == 0x90 && isFile && ExtractedFileName == "PARAM.SFO")
                    {
                        //Read/Write File
                        BinaryWriter ExtractedFile = new BinaryWriter(ExtractedFileWriteStream);
                        decrPKGReadStream.Seek((long)ExtractedFileOffset, SeekOrigin.Begin);

                        // Pieces calculation
                        double division = (double)ExtractedFileSize / (double)twentyMb;
                        UInt64 pieces   = (UInt64)Math.Floor(division);
                        UInt64 mod      = (UInt64)ExtractedFileSize % (UInt64)twentyMb;
                        if (mod > 0)
                        {
                            pieces += 1;
                        }

                        dumpFile = new byte[twentyMb];
                        for (UInt64 i = 0; i < pieces; i++)
                        {
                            //If we have a mod and this is the last piece then...
                            if ((mod > 0) && (i == (pieces - 1)))
                            {
                                dumpFile = new byte[mod];
                            }

                            //Fill buffer
                            brDecrPKG.Read(dumpFile, 0, dumpFile.Length);

                            ExtractedFile.Write(dumpFile);

                            //   Application.DoEvents();
                        }

                        ExtractedFileWriteStream.Close();
                        ExtractedFile.Close();
                    }


                    if (contentType != 0x90 && isFile && ExtractedFileName == "PARAM.SFO")
                    //  if (contentType != 0x90 && isFile && Name == Name2)
                    {
                        //Read/Write File
                        BinaryWriter ExtractedFile = new BinaryWriter(ExtractedFileWriteStream);
                        decrPKGReadStream.Seek((long)ExtractedFileOffset, SeekOrigin.Begin);

                        // Pieces calculation
                        double division = (double)ExtractedFileSize / (double)twentyMb;
                        UInt64 pieces   = (UInt64)Math.Floor(division);
                        UInt64 mod      = (UInt64)ExtractedFileSize % (UInt64)twentyMb;
                        if (mod > 0)
                        {
                            pieces += 1;
                        }

                        dumpFile = new byte[twentyMb];
                        long elapsed = 0;
                        for (UInt64 i = 0; i < pieces; i++)
                        {
                            //If we have a mod and this is the last piece then...
                            if ((mod > 0) && (i == (pieces - 1)))
                            {
                                dumpFile = new byte[mod];
                            }

                            //Fill buffer
                            byte[] DecryptedData = DecryptData(dumpFile.Length, (long)ExtractedFileOffset + elapsed, (long)uiEncryptedFileStartOffset, PS3AesKey, encrPKGReadStream, brEncrPKG);
                            elapsed = +dumpFile.Length;

                            //To avoid decryption pad we use dumpFile.Length that's the actual decrypted file size!
                            ExtractedFile.Write(DecryptedData, 0, dumpFile.Length);

                            //  Application.DoEvents();
                        }

                        ExtractedFileWriteStream.Close();
                        ExtractedFile.Close();
                    }

                    positionIdx = positionIdx + 32;

                    // progressBar.PerformStep();
                    // Application.DoEvents();
                }

                //     Application.DoEvents();

                //Close File
                encrPKGReadStream.Close();
                brEncrPKG.Close();

                decrPKGReadStream.Close();
                brDecrPKG.Close();

                //Delete decrypted file
                if (File.Exists(decryptedPKGFileName))
                {
                    File.Delete(decryptedPKGFileName);
                }

                //  txtResults.Text += "SUCCESS: Pkg extracted and decrypted successfully.";
                // SystemSounds.Beep.Play();

                //  fileDirBrowser.PathFileDir = "Open Encrypted PKG file here first...";

                // progressBar.Value = 0;
                Console.WriteLine("Creating EDAT");
                string  outFile  = null;
                C00EDAT instance = new C00EDAT();
                outFile = instance.makeedat(WorkDir + "/PARAM.SFO", outFile);
                //Console.WriteLine(outFile);
                return(outFile);
            }

            catch (Exception ex)
            {
                // txtResults.Text += "ERROR: An error occured during the files extraction process ";
                SystemSounds.Beep.Play();
                return("");
            }
        }
예제 #4
0
 private string ExtractFiles(string decryptedPKGFileName, string encryptedPKGFileName)
 {
     Exception exception;
     try
     {
         int num = 0x1400000;
         uint num2 = 0;
         uint num3 = 0;
         uint num4 = 0;
         long sourceIndex = 0L;
         string str = null;
         if (encryptedPKGFileName.Contains(@"\"))
         {
             str = encryptedPKGFileName.Substring(encryptedPKGFileName.LastIndexOf(@"\")).Replace(@"\", "").Replace(".pkg", "");
         }
         else
         {
             str = encryptedPKGFileName.Replace(".pkg", "");
         }
         string path = "temp/" + str;
         Directory.CreateDirectory("temp");
         if (Directory.Exists(path))
         {
             Directory.Delete(path, true);
             Thread.Sleep(100);
             Directory.CreateDirectory(path);
             Thread.Sleep(100);
         }
         byte[] sourceArray = new byte[0x4e200];
         byte[] buffer3 = new byte[8];
         byte[] destinationArray = new byte[4];
         byte[] buffer5 = new byte[4];
         byte[] buffer6 = new byte[4];
         byte[] buffer7 = new byte[4];
         byte[] buffer8 = new byte[4];
         byte[] buffer9 = new byte[4];
         byte[] buffer10 = new byte[4];
         byte[] buffer11 = new byte[4];
         byte[] buffer12 = new byte[0x20];
         byte[] buffer13 = new byte[8];
         byte num6 = 0;
         byte num7 = 0;
         bool flag = false;
         Stream input = new FileStream(decryptedPKGFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
         BinaryReader reader = new BinaryReader(input);
         Stream stream2 = new FileStream(encryptedPKGFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
         BinaryReader brEncrPKG = new BinaryReader(stream2);
         input.Seek(0L, SeekOrigin.Begin);
         sourceArray = reader.ReadBytes(sourceArray.Length);
         sourceIndex = 0L;
         num4 = 0;
         Array.Copy(sourceArray, 0, buffer5, 0, buffer5.Length);
         Array.Reverse(buffer5);
         uint num9 = BitConverter.ToUInt32(buffer5, 0) / 0x20;
         Array.Copy(sourceArray, 12, destinationArray, 0, destinationArray.Length);
         Array.Reverse(destinationArray);
         uint num10 = BitConverter.ToUInt32(destinationArray, 0);
         input.Seek(0L, SeekOrigin.Begin);
         sourceArray = reader.ReadBytes((int) num10);
         if (num9 < 0)
         {
             return "";
         }
         for (int i = 0; i < num9; i++)
         {
             byte[] buffer2;
             BinaryWriter writer;
             double num14;
             ulong num15;
             ulong num16;
             ulong num17;
             Array.Copy(sourceArray, sourceIndex + 12L, buffer8, 0L, (long) buffer8.Length);
             Array.Reverse(buffer8);
             num2 = BitConverter.ToUInt32(buffer8, 0) + num4;
             Array.Copy(sourceArray, sourceIndex + 20L, buffer9, 0L, (long) buffer9.Length);
             Array.Reverse(buffer9);
             num3 = BitConverter.ToUInt32(buffer9, 0);
             Array.Copy(sourceArray, sourceIndex, buffer10, 0L, (long) buffer10.Length);
             Array.Reverse(buffer10);
             uint num12 = BitConverter.ToUInt32(buffer10, 0);
             Array.Copy(sourceArray, sourceIndex + 4L, buffer11, 0L, (long) buffer11.Length);
             Array.Reverse(buffer11);
             uint num13 = BitConverter.ToUInt32(buffer11, 0);
             num6 = sourceArray[(int) ((IntPtr) (sourceIndex + 0x18L))];
             num7 = sourceArray[(int) ((IntPtr) (sourceIndex + 0x1bL))];
             buffer12 = new byte[num13];
             Array.Copy(sourceArray, (long) num12, buffer12, 0L, (long) num13);
             string str5 = ByteArrayToAscii(buffer12, 0, buffer12.Length, true);
             string str6 = string.Concat((IEnumerable<string>) (from b in buffer12 select b.ToString("x2")));
             if (!Directory.Exists(path))
             {
                 Directory.CreateDirectory(path);
                 Thread.Sleep(100);
             }
             FileStream output = null;
             if ((num7 == 4) && (num3 == 0))
             {
                 flag = false;
             }
             else
             {
                 flag = true;
             }
             if (num6 == 0x90)
             {
                 string str7 = (path + @"\" + str5).Replace("/", @"\");
                 DirectoryInfo parent = Directory.GetParent(str7);
                 if (!Directory.Exists(parent.ToString()))
                 {
                     Directory.CreateDirectory(parent.ToString());
                 }
                 output = new FileStream(str7, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
             }
             else
             {
                 Array.Copy(this.DecryptData((int) num13, (long) num12, (long) this.uiEncryptedFileStartOffset, this.PS3AesKey, stream2, brEncrPKG), 0L, buffer12, 0L, (long) num13);
                 str5 = ByteArrayToAscii(buffer12, 0, buffer12.Length, true);
                 if (!flag)
                 {
                     try
                     {
                     }
                     catch (Exception exception1)
                     {
                         exception = exception1;
                         str5 = i.ToString() + ".raw";
                     }
                 }
                 else if (str5 == "PARAM.SFO")
                 {
                     try
                     {
                         output = new FileStream(path + @"\" + str5, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
                     }
                     catch (Exception exception2)
                     {
                         exception = exception2;
                         str5 = i.ToString() + ".raw";
                     }
                 }
             }
             if (((num6 == 0x90) && flag) && (str5 == "PARAM.SFO"))
             {
                 writer = new BinaryWriter(output);
                 input.Seek((long) num2, SeekOrigin.Begin);
                 num14 = ((double) num3) / ((double) num);
                 num15 = (ulong) Math.Floor(num14);
                 num16 = ((ulong) num3) % ((ulong) num);
                 if (num16 > 0L)
                 {
                     num15 += (ulong) 1L;
                 }
                 buffer2 = new byte[num];
                 num17 = 0L;
                 while (num17 < num15)
                 {
                     if ((num16 > 0L) && (num17 == (num15 - ((ulong) 1L))))
                     {
                         buffer2 = new byte[num16];
                     }
                     reader.Read(buffer2, 0, buffer2.Length);
                     writer.Write(buffer2);
                     num17 += (ulong) 1L;
                 }
                 output.Close();
                 writer.Close();
             }
             if (((num6 != 0x90) && flag) && (str5 == "PARAM.SFO"))
             {
                 writer = new BinaryWriter(output);
                 input.Seek((long) num2, SeekOrigin.Begin);
                 num14 = ((double) num3) / ((double) num);
                 num15 = (ulong) Math.Floor(num14);
                 num16 = ((ulong) num3) % ((ulong) num);
                 if (num16 > 0L)
                 {
                     num15 += (ulong) 1L;
                 }
                 buffer2 = new byte[num];
                 long length = 0L;
                 for (num17 = 0L; num17 < num15; num17 += (ulong) 1L)
                 {
                     if ((num16 > 0L) && (num17 == (num15 - ((ulong) 1L))))
                     {
                         buffer2 = new byte[num16];
                     }
                     byte[] buffer = this.DecryptData(buffer2.Length, num2 + length, (long) this.uiEncryptedFileStartOffset, this.PS3AesKey, stream2, brEncrPKG);
                     length = buffer2.Length;
                     writer.Write(buffer, 0, buffer2.Length);
                 }
                 output.Close();
                 writer.Close();
             }
             sourceIndex += 0x20L;
         }
         stream2.Close();
         brEncrPKG.Close();
         input.Close();
         reader.Close();
         if (File.Exists(decryptedPKGFileName))
         {
             File.Delete(decryptedPKGFileName);
         }
         Console.WriteLine("Creating EDAT");
         string outFile = null;
         C00EDAT cedat = new C00EDAT();
         return cedat.makeedat(path + "/PARAM.SFO", outFile);
     }
     catch (Exception exception3)
     {
         exception = exception3;
         SystemSounds.Beep.Play();
         return "";
     }
 }