コード例 #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
ファイル: EDAT.cs プロジェクト: Hector-Ab/PeXploit
 private byte[] getKey(NPD npd, EDATData data, byte[] devKLic, byte[] keyFromRif)
 {
     byte[] output = null;
     if ((data.getFlags() & FLAG_SDAT) != 0L)
     {
         output = new byte[0x10];
         ToolsImpl.XOR(output, npd.getDevHash(), EDATKeys.SDATKEY);
         return output;
     }
     if (npd.getLicense() == 3L)
     {
         return devKLic;
     }
     if (npd.getLicense() == 2L)
     {
         output = keyFromRif;
     }
     return output;
 }
コード例 #3
0
ファイル: EDAT.cs プロジェクト: Hector-Ab/PeXploit
 private int decryptData(FileStream ii, FileStream o, NPD npd, EDATData data, byte[] rifkey)
 {
     int num = (int) (((data.getFileLen() + data.getBlockSize()) - 1) / data.getBlockSize());
     int num2 = (((data.getFlags() & FLAG_COMPRESSED) != 0L) || ((data.getFlags() & FLAG_0x20) != 0L)) ? 0x20 : 0x10;
     int num3 = 0x100;
     for (int i = 0; i < num; i++)
     {
         long num5;
         int num6;
         byte[] buffer2;
         int num11;
         ii.Seek((long) (num3 + (i * num2)), SeekOrigin.Begin);
         byte[] dest = new byte[0x10];
         int num7 = 0;
         if ((data.getFlags() & FLAG_COMPRESSED) != 0L)
         {
             buffer2 = new byte[0x20];
             ii.Read(buffer2, 0, buffer2.Length);
             byte[] buffer3 = this.decryptMetadataSection(buffer2);
             num5 = (int) ConversionUtils.be64(buffer3, 0);
             num6 = (int) ConversionUtils.be32(buffer3, 8);
             num7 = (int) ConversionUtils.be32(buffer3, 12);
             ConversionUtils.arraycopy(buffer2, 0, dest, 0L, 0x10);
         }
         else if ((data.getFlags() & FLAG_0x20) != 0L)
         {
             buffer2 = new byte[0x20];
             ii.Read(buffer2, 0, buffer2.Length);
             for (int j = 0; j < 0x10; j++)
             {
                 dest[j] = (byte) (buffer2[j] ^ buffer2[j + 0x10]);
             }
             num5 = (num3 + (i * data.getBlockSize())) + (num * num2);
             num6 = (int) data.getBlockSize();
             if (i == (num - 1))
             {
                 num6 = (int) (data.getFileLen() % new BigInteger(data.getBlockSize()));
             }
         }
         else
         {
             ii.Read(dest, 0, dest.Length);
             num5 = (num3 + (i * data.getBlockSize())) + (num * num2);
             num6 = (int) data.getBlockSize();
             if (i == (num - 1))
             {
                 num6 = (int) (data.getFileLen() % new BigInteger(data.getBlockSize()));
             }
         }
         int count = num6;
         num6 = (num6 + 15) & -16;
         Debug.Print("Offset: %016X, len: %08X, realLen: %08X, endCompress: %d\r\n", new object[] { num5, num6, count, num7 });
         ii.Seek(num5, SeekOrigin.Begin);
         byte[] buffer = new byte[num6];
         byte[] buffer5 = new byte[num6];
         ii.Read(buffer, 0, buffer.Length);
         byte[] buffer6 = new byte[0x10];
         byte[] buffer7 = new byte[0x10];
         byte[] buffer8 = this.calculateBlockKey(i, npd);
         ToolsImpl.aesecbEncrypt(rifkey, buffer8, 0, buffer6, 0, buffer8.Length);
         if ((data.getFlags() & FLAG_0x10) != 0L)
         {
             ToolsImpl.aesecbEncrypt(rifkey, buffer6, 0, buffer7, 0, buffer6.Length);
         }
         else
         {
             ConversionUtils.arraycopy(buffer6, 0, buffer7, 0L, buffer6.Length);
         }
         int cryptoFlag = ((data.getFlags() & FLAG_0x02) == 0L) ? 2 : 1;
         if ((data.getFlags() & FLAG_0x10) == 0L)
         {
             num11 = 2;
         }
         else if ((data.getFlags() & FLAG_0x20) == 0L)
         {
             num11 = 4;
         }
         else
         {
             num11 = 1;
         }
         if ((data.getFlags() & FLAG_KEYENCRYPTED) != 0L)
         {
             cryptoFlag |= 0x10000000;
             num11 |= 0x10000000;
         }
         if ((data.getFlags() & FLAG_DEBUG) != 0L)
         {
             cryptoFlag |= 0x1000000;
             num11 |= 0x1000000;
         }
         AppLoader loader = new AppLoader();
         byte[] buffer9 = (npd.getVersion() <= 1L) ? new byte[0x10] : npd.getDigest();
         if (!loader.doAll(num11, cryptoFlag, buffer, 0, buffer5, 0, buffer.Length, buffer6, npd.getDigest(), buffer7, dest, 0))
         {
             Debug.WriteLine("Error decrypting block " + i);
         }
         if ((data.getFlags() & FLAG_COMPRESSED) == 0L)
         {
             o.Write(buffer5, 0, count);
         }
     }
     return STATUS_OK;
 }
コード例 #4
0
ファイル: EDAT.cs プロジェクト: Hector-Ab/PeXploit
 private int encryptData(FileStream ii, FileStream o, NPD npd, EDATData data, byte[] rifkey)
 {
     int num = (int) (((data.getFileLen() + data.getBlockSize()) - 1) / data.getBlockSize());
     byte[] dest = new byte[num * 0x10];
     byte[] buffer2 = new byte[ii.Length + 15L];
     for (int i = 0; i < num; i++)
     {
         long offset = i * data.getBlockSize();
         ii.Seek(offset, SeekOrigin.Begin);
         int length = (int) data.getBlockSize();
         if (i == (num - 1))
         {
             length = (int) (data.getFileLen() % new BigInteger(data.getBlockSize()));
         }
         int num5 = length;
         length = (length + 15) & -16;
         byte[] buffer3 = new byte[length];
         byte[] buffer4 = new byte[length];
         for (int j = num5; j > 0; j -= ii.Read(buffer4, num5 - j, j))
         {
         }
         for (int k = num5; k < length; k++)
         {
             buffer4[k] = 0;
         }
         byte[] buffer5 = new byte[0x10];
         byte[] buffer6 = new byte[0x10];
         byte[] buffer7 = this.calculateBlockKey(i, npd);
         ToolsImpl.aesecbEncrypt(rifkey, buffer7, 0, buffer5, 0, buffer7.Length);
         ConversionUtils.arraycopy(buffer5, 0, buffer6, 0L, buffer5.Length);
         int cryptoFlag = 2;
         int hashFlag = 2;
         AppLoaderReverse reverse = new AppLoaderReverse();
         byte[] iv = npd.getDigest();
         byte[] generatedHash = new byte[0x10];
         reverse.doAll(hashFlag, cryptoFlag, buffer4, 0, buffer3, 0, buffer4.Length, buffer5, iv, buffer6, generatedHash, 0);
         ConversionUtils.arraycopy(buffer3, 0, buffer2, offset, length);
         ConversionUtils.arraycopy(generatedHash, 0, dest, (long) (i * 0x10), 0x10);
     }
     byte[] buffer = ConversionUtils.getByteArray("4D6164652062792052325220546F6F6C");
     o.Write(dest, 0, dest.Length);
     o.Write(buffer2, 0, buffer2.Length - 15);
     o.Write(buffer, 0, buffer.Length);
     return STATUS_OK;
 }
コード例 #5
0
ファイル: EDAT.cs プロジェクト: Hector-Ab/PeXploit
 private int checkHeader(byte[] rifKey, EDATData data, NPD npd, FileStream i)
 {
     int num8;
     i.Seek(0L, SeekOrigin.Begin);
     byte[] buffer = new byte[160];
     byte[] o = new byte[160];
     byte[] buffer3 = new byte[0x10];
     Console.WriteLine("Checking NPD Version:" + npd.getVersion());
     if ((npd.getVersion() == 0L) || (npd.getVersion() == 1L))
     {
         if ((data.getFlags() & 0x7ffffffeL) != 0L)
         {
             Console.WriteLine("ERROR: Incorrect Header Flags");
             return STATUS_ERROR_INCORRECT_FLAGS;
         }
     }
     else if (npd.getVersion() == 2L)
     {
         if ((data.getFlags() & 0x7effffe0L) != 0L)
         {
             Console.WriteLine("ERROR: Incorrect Header Flags");
             return STATUS_ERROR_INCORRECT_FLAGS;
         }
     }
     else if ((npd.getVersion() == 3L) || (npd.getVersion() == 4L))
     {
         if ((data.getFlags() & 0x7effffc0L) != 0L)
         {
             Console.WriteLine("ERROR: Incorrect Header Flags");
             return STATUS_ERROR_INCORRECT_FLAGS;
         }
     }
     else
     {
         Console.WriteLine("ERROR: Unsupported EDAT version (need keys)");
         return STATUS_ERROR_INCORRECT_VERSION;
     }
     if (npd.getVersion() == 4L)
     {
     }
     i.Read(buffer, 0, buffer.Length);
     i.Read(buffer3, 0, buffer3.Length);
     Console.WriteLine("Checking header hash:");
     AppLoader loader = new AppLoader();
     int hashFlag = ((data.getFlags() & FLAG_KEYENCRYPTED) == 0L) ? 2 : 0x10000002;
     if ((data.getFlags() & FLAG_DEBUG) != 0L)
     {
         hashFlag |= 0x1000000;
     }
     if (!loader.doAll(hashFlag, 1, buffer, 0, o, 0, buffer.Length, new byte[0x10], new byte[0x10], rifKey, buffer3, 0))
     {
         Console.WriteLine("Error verifying header. Is rifKey valid?.");
         return STATUS_ERROR_HEADERCHECK;
     }
     Console.WriteLine("Checking metadata hash:");
     loader = new AppLoader();
     loader.doInit(hashFlag, 1, new byte[0x10], new byte[0x10], rifKey);
     int num3 = ((data.getFlags() & FLAG_COMPRESSED) != 0L) ? 0x20 : 0x10;
     int num4 = (int) (((data.getFileLen() + data.getBlockSize()) - 11) / data.getBlockSize());
     int num5 = 0;
     int num6 = 0x100;
     for (long j = num3 * num4; j > 0L; j -= num8)
     {
         num8 = (HEADER_MAX_BLOCKSIZE > j) ? ((int) j) : HEADER_MAX_BLOCKSIZE;
         i.Seek((long) (num6 + num5), SeekOrigin.Begin);
         byte[] buffer4 = new byte[num8];
         o = new byte[num8];
         i.Read(buffer4, 0, buffer4.Length);
         loader.doUpdate(buffer4, 0, o, 0, num8);
         num5 += num8;
     }
     if (!loader.doFinal(buffer, 0x90))
     {
         Console.WriteLine("Error verifying metadatasection. Data tampered");
         return STATUS_ERROR_HEADERCHECK;
     }
     return STATUS_OK;
 }