예제 #1
0
파일: EDAT.cs 프로젝트: Hector-Ab/PeXploit
 public int encryptFile(string inFile, string outFile, byte[] devKLic, byte[] keyFromRif, byte[] contentID, byte[] flags, byte[] type, byte[] version)
 {
     int num2;
     int num9;
     FileStream fin = File.Open(inFile, FileMode.Open);
     NPD[] npdPtr = new NPD[1];
     FileStream o = File.Open(outFile, FileMode.Create);
     string[] strArray = o.Name.Split(new char[] { '\\' });
     byte[] buffer = this.writeValidNPD(strArray[strArray.Length - 1], devKLic, npdPtr, fin, contentID, flags, version, type);
     o.Write(buffer, 0, buffer.Length);
     byte[] buffer2 = new byte[] { 0, 0, 0, 0 };
     o.Write(buffer2, 0, 4);
     buffer2[2] = 0x40;
     o.Write(buffer2, 0, 4);
     long length = fin.Length;
     byte[] bytes = BitConverter.GetBytes(length);
     byte[] buffer4 = new byte[8];
     for (num2 = 0; num2 < 8; num2++)
     {
         buffer4[num2] = 0;
     }
     for (num2 = 0; num2 < bytes.Length; num2++)
     {
         buffer4[7 - num2] = bytes[num2];
     }
     o.Write(buffer4, 0, 8);
     buffer2[0] = 0;
     while (o.Length < 0x100L)
     {
         o.Write(buffer2, 0, 1);
     }
     EDATData data = new EDATData {
         flags = 0L,
         blockSize = 0x4000L,
         fileLen = new BigInteger(length)
     };
     byte[] rifkey = this.getKey(npdPtr[0], data, devKLic, keyFromRif);
     int hashFlag = 2;
     this.encryptData(fin, o, npdPtr[0], data, rifkey);
     o.Seek(0x90L, SeekOrigin.Begin);
     AppLoader loader = new AppLoader();
     loader.doInit(hashFlag, 1, new byte[0x10], new byte[0x10], rifkey);
     int num4 = ((data.getFlags() & FLAG_COMPRESSED) != 0L) ? 0x20 : 0x10;
     int num5 = (int) (((data.getFileLen() + data.getBlockSize()) - 11) / data.getBlockSize());
     int num6 = 0;
     int num7 = 0x100;
     for (long i = num4 * num5; i > 0L; i -= num9)
     {
         num9 = (HEADER_MAX_BLOCKSIZE > i) ? ((int) i) : HEADER_MAX_BLOCKSIZE;
         o.Seek((long) (num7 + num6), SeekOrigin.Begin);
         byte[] buffer6 = new byte[num9];
         byte[] buffer7 = new byte[num9];
         o.Read(buffer6, 0, buffer6.Length);
         loader.doUpdate(buffer6, 0, buffer7, 0, num9);
         num6 += num9;
     }
     byte[] generatedHash = new byte[0x10];
     loader.doFinalButGetHash(generatedHash);
     o.Seek(0x90L, SeekOrigin.Begin);
     o.Write(generatedHash, 0, generatedHash.Length);
     o.Seek(0L, SeekOrigin.Begin);
     byte[] buffer9 = new byte[160];
     byte[] buffer10 = new byte[160];
     o.Read(buffer9, 0, buffer9.Length);
     AppLoaderReverse reverse = new AppLoaderReverse();
     byte[] buffer11 = new byte[0x10];
     bool flag = reverse.doAll(hashFlag, 1, buffer9, 0, buffer10, 0, buffer9.Length, new byte[0x10], new byte[0x10], rifkey, buffer11, 0);
     o.Seek(160L, SeekOrigin.Begin);
     o.Write(buffer11, 0, buffer11.Length);
     while (o.Length < 0x100L)
     {
         o.Write(buffer2, 0, 1);
     }
     o.Close();
     fin.Close();
     return STATUS_OK;
 }
예제 #2
0
        /* KDSBEST START */
        public int encryptFile(String inFile, String outFile, byte[] devKLic, byte[] keyFromRif, byte[] contentID, byte[] flags, byte[] type, byte[] version)
        {
            FileStream fin = File.Open(inFile, FileMode.Open);

            //  MemoryMappedFile fin1 = MemoryMappedFile.CreateFromFile(inFile, FileMode.Open);
            NPD[]      ptr = new NPD[1]; //Ptr to Ptr
            FileStream o   = File.Open(outFile, FileMode.Create);

            string[] fn  = o.Name.Split('\\');
            byte[]   npd = writeValidNPD(fn[fn.Length - 1], devKLic, ptr, fin, contentID, flags, version, type);
            o.Write(npd, 0, npd.Length);
            byte[] buffer = new byte[4];
            // FLAGS
            buffer[0] = 0x00;
            buffer[1] = 0x00;
            buffer[2] = 0x00;
            buffer[3] = 0x00;
            o.Write(buffer, 0, 4);

            // blocksize 0x00004000
            buffer[2] = 0x40;
            o.Write(buffer, 0, 4);
            long len = fin.Length;

            byte[] lenBuf  = BitConverter.GetBytes(len);
            byte[] rLenBuf = new byte[8];
            for (int i = 0; i < 8; i++)
            {
                rLenBuf[i] = 0x00;
            }
            for (int i = 0; i < lenBuf.Length; i++)
            {
                rLenBuf[7 - i] = lenBuf[i];
            }
            o.Write(rLenBuf, 0, 8);

            // Fill the rest 0x10 bytes with dummy we generate the metasection hash later!
            // the bytes till 0x100 are unknown
            buffer[0] = 0x00;
            while (o.Length < 0x100)
            {
                o.Write(buffer, 0, 1);
            }

            EDATData data = new EDATData();

            data.flags     = 0x00000000;
            data.blockSize = 0x00004000;
            data.fileLen   = new BigInteger(len);
            byte[] rifkey   = getKey(ptr[0], data, devKLic, keyFromRif); //Obtain the key for decryption (result of sc471 or sdatkey)
            int    hashFlag = 0x00000002;


            encryptData(fin, o, ptr[0], data, rifkey);

            o.Seek(0x90, SeekOrigin.Begin);
            AppLoader aa = new AppLoader();

            aa.doInit(hashFlag, 0x00000001, new byte[0x10], new byte[0x10], rifkey);

            int sectionSize = ((data.getFlags() & FLAG_COMPRESSED) != 0) ? 0x20 : 0x010; //BUG??? What about FLAG0x20??
            //Determine the metadatasection total len
            int numBlocks = (int)((data.getFileLen() + data.getBlockSize() - 11) / data.getBlockSize());

            int readed     = 0;
            int baseOffset = 0x100;
            //baseOffset +=  modifier; //There is an unknown offset to add to the metadatasection... value seen 0
            long remaining = sectionSize * numBlocks;

            while (remaining > 0)
            {
                int lenToRead = (HEADER_MAX_BLOCKSIZE > remaining) ? (int)remaining : HEADER_MAX_BLOCKSIZE;
                o.Seek(baseOffset + readed, SeekOrigin.Begin);
                byte[] content = new byte[lenToRead];
                byte[] ooo     = new byte[lenToRead];
                o.Read(content, 0, content.Length);
                aa.doUpdate(content, 0, ooo, 0, lenToRead);
                readed    += lenToRead;
                remaining -= lenToRead;
            }
            byte[] headerHash = new byte[0x10];
            aa.doFinalButGetHash(headerHash);
            o.Seek(0x90, SeekOrigin.Begin);
            o.Write(headerHash, 0, headerHash.Length);

            // Header Complete

            // Generate Header Hash
            o.Seek(0, SeekOrigin.Begin);
            byte[] header       = new byte[0xA0];
            byte[] headerODummy = new byte[0xA0];
            o.Read(header, 0, header.Length);
            AppLoaderReverse a = new AppLoaderReverse();

            byte[] generatedHash = new byte[0x10];
            bool   result        = a.doAll(hashFlag, 0x00000001, header, 0, headerODummy, 0, header.Length, new byte[0x10], new byte[0x10], rifkey, generatedHash, 0);

            o.Seek(0xA0, SeekOrigin.Begin);
            o.Write(generatedHash, 0, generatedHash.Length);


            //KDSBest We don't know the DATA 0xB0 to 0x100!!!

            while (o.Length < 0x100)
            {
                o.Write(buffer, 0, 1);
            }


            o.Close();
            fin.Close();
            return(STATUS_OK);
        }
예제 #3
0
        public int encryptFile(string inFile, string outFile, byte[] devKLic, byte[] keyFromRif, byte[] contentID, byte[] flags, byte[] type, byte[] version)
        {
            int        num2;
            int        num9;
            FileStream fin = File.Open(inFile, FileMode.Open);

            NPD[]      npdPtr = new NPD[1];
            FileStream o      = File.Open(outFile, FileMode.Create);

            string[] strArray = o.Name.Split(new char[] { '\\' });
            byte[]   buffer   = this.writeValidNPD(strArray[strArray.Length - 1], devKLic, npdPtr, fin, contentID, flags, version, type);
            o.Write(buffer, 0, buffer.Length);
            byte[] buffer2 = new byte[] { 0, 0, 0, 0 };
            o.Write(buffer2, 0, 4);
            buffer2[2] = 0x40;
            o.Write(buffer2, 0, 4);
            long length = fin.Length;

            byte[] bytes   = BitConverter.GetBytes(length);
            byte[] buffer4 = new byte[8];
            for (num2 = 0; num2 < 8; num2++)
            {
                buffer4[num2] = 0;
            }
            for (num2 = 0; num2 < bytes.Length; num2++)
            {
                buffer4[7 - num2] = bytes[num2];
            }
            o.Write(buffer4, 0, 8);
            buffer2[0] = 0;
            while (o.Length < 0x100L)
            {
                o.Write(buffer2, 0, 1);
            }
            EDATData data = new EDATData {
                flags     = 0L,
                blockSize = 0x4000L,
                fileLen   = new BigInteger(length)
            };

            byte[] rifkey   = this.getKey(npdPtr[0], data, devKLic, keyFromRif);
            int    hashFlag = 2;

            this.encryptData(fin, o, npdPtr[0], data, rifkey);
            o.Seek(0x90L, SeekOrigin.Begin);
            AppLoader loader = new AppLoader();

            loader.doInit(hashFlag, 1, new byte[0x10], new byte[0x10], rifkey);
            int num4 = ((data.getFlags() & FLAG_COMPRESSED) != 0L) ? 0x20 : 0x10;
            int num5 = (int)(((data.getFileLen() + data.getBlockSize()) - 11) / data.getBlockSize());
            int num6 = 0;
            int num7 = 0x100;

            for (long i = num4 * num5; i > 0L; i -= num9)
            {
                num9 = (HEADER_MAX_BLOCKSIZE > i) ? ((int)i) : HEADER_MAX_BLOCKSIZE;
                o.Seek((long)(num7 + num6), SeekOrigin.Begin);
                byte[] buffer6 = new byte[num9];
                byte[] buffer7 = new byte[num9];
                o.Read(buffer6, 0, buffer6.Length);
                loader.doUpdate(buffer6, 0, buffer7, 0, num9);
                num6 += num9;
            }
            byte[] generatedHash = new byte[0x10];
            loader.doFinalButGetHash(generatedHash);
            o.Seek(0x90L, SeekOrigin.Begin);
            o.Write(generatedHash, 0, generatedHash.Length);
            o.Seek(0L, SeekOrigin.Begin);
            byte[] buffer9  = new byte[160];
            byte[] buffer10 = new byte[160];
            o.Read(buffer9, 0, buffer9.Length);
            AppLoaderReverse reverse = new AppLoaderReverse();

            byte[] buffer11 = new byte[0x10];
            bool   flag     = reverse.doAll(hashFlag, 1, buffer9, 0, buffer10, 0, buffer9.Length, new byte[0x10], new byte[0x10], rifkey, buffer11, 0);

            o.Seek(160L, SeekOrigin.Begin);
            o.Write(buffer11, 0, buffer11.Length);
            while (o.Length < 0x100L)
            {
                o.Write(buffer2, 0, 1);
            }
            o.Close();
            fin.Close();
            return(STATUS_OK);
        }