From ca87e8f3e9022b8153aa7391fdd7bf4eefbb706b Mon Sep 17 00:00:00 2001 From: Bluzume <39113159+KuromeSan@users.noreply.github.com> Date: Tue, 10 Aug 2021 22:55:52 +1200 Subject: [PATCH] add options to guess the key is system.json not found XOR memes --- .vs/RMDEC/v16/.suo | Bin 0 -> 79872 bytes RMDEC/MVProject.cs | 251 ++++++++++++++++++++++++++++++++++++--- RMDEC/projectSelector.cs | 17 +-- 3 files changed, 243 insertions(+), 25 deletions(-) create mode 100644 .vs/RMDEC/v16/.suo diff --git a/.vs/RMDEC/v16/.suo b/.vs/RMDEC/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..a278c71fbe2bceb8befe9421810c2c330446bdb8 GIT binary patch literal 79872 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 AA^-pY literal 0 HcmV?d00001 diff --git a/RMDEC/MVProject.cs b/RMDEC/MVProject.cs index ff866ab..19c4075 100644 --- a/RMDEC/MVProject.cs +++ b/RMDEC/MVProject.cs @@ -72,8 +72,11 @@ namespace RMDEC } set { - jsonData.hasEncryptedImages = value; - File.WriteAllText(systemJsonFile, jsonData.ToString(Formatting.None)); + if(jsonData != null) + { + jsonData.hasEncryptedImages = value; + File.WriteAllText(systemJsonFile, jsonData.ToString(Formatting.None)); + } encryptedImages = value; } } @@ -86,8 +89,11 @@ namespace RMDEC } set { - jsonData.hasEncryptedAudio = value; - File.WriteAllText(systemJsonFile, jsonData.ToString(Formatting.None)); + if (jsonData != null) + { + jsonData.hasEncryptedAudio = value; + File.WriteAllText(systemJsonFile, jsonData.ToString(Formatting.None)); + } encryptedAudio = value; } } @@ -109,7 +115,7 @@ namespace RMDEC } List byteList = new List(); - + for (int i = 0; i < HexStr.Length; i += 2) { string curHex = HexStr.Substring(i, 2); @@ -123,7 +129,196 @@ namespace RMDEC } + private static byte[] guessKey(string path) // Incase you think your smart + { + string[] mzPngs = Directory.GetFiles(path, "*._png", SearchOption.AllDirectories); + string[] mvPngs = Directory.GetFiles(path, "*.rpgmvp", SearchOption.AllDirectories); + string[] mzM4as = Directory.GetFiles(path, "*._m4a", SearchOption.AllDirectories); + string[] mvM4as = Directory.GetFiles(path, "*.rpgmvm", SearchOption.AllDirectories); + List files = new List(); + files.AddRange(mzPngs); + files.AddRange(mvPngs); + + files.AddRange(mzM4as); + files.AddRange(mvM4as); + + if (files.Count <= 0) + return new byte[0x10]; + + Random rng = new Random(); + int index = rng.Next(0, files.Count); + string file = files[index]; + + byte[] encryptedHeader = new byte[0x10]; + FileStream fs = File.OpenRead(file); + fs.Seek(0x10, SeekOrigin.Begin); + fs.Read(encryptedHeader, 0x00, 0x10); + fs.Close(); + + string filetype = Path.GetExtension(file).ToLower(); + byte[] pngHeader = new byte[0x10] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52 }; + byte[] m4aHeader = new byte[0x10] { 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x4D, 0x34, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00 }; + + if (filetype == "._png" || filetype == ".rpgmvp") { + byte[] key = RMProject.Xor(encryptedHeader, pngHeader); + if(!tryKey(path, key)) + { + throw new Exception("Cannot find key (ITS TOO STRONG!)"); + } + else + { + return key; + } + } + else if (filetype == "._m4a" || filetype == ".rpgmvm") + { + byte[] key = RMProject.Xor(encryptedHeader, m4aHeader); + if (!tryKey(path, key)) + { + throw new Exception("Cannot find key (ITS TOO STRONG!)"); + } + else + { + return key; + } + } + // OGG Header is not 0x10 bytes unfortunately. + + throw new Exception("Cannot find key (ITS TOO STRONG!)"); + } + private static bool tryKey(string path, byte[] key) // Checks if the key really works + { + string[] mzPngs = Directory.GetFiles(path, "*._png", SearchOption.AllDirectories); + string[] mvPngs = Directory.GetFiles(path, "*.rpgmvp", SearchOption.AllDirectories); + string[] mzM4as = Directory.GetFiles(path, "*._m4a", SearchOption.AllDirectories); + string[] mvM4as = Directory.GetFiles(path, "*.rpgmvm", SearchOption.AllDirectories); + string[] mzOggs = Directory.GetFiles(path, "*._ogg", SearchOption.AllDirectories); + string[] mvOggs = Directory.GetFiles(path, "*.rpgmvo", SearchOption.AllDirectories); + + List files = new List(); + files.AddRange(mzPngs); + files.AddRange(mvPngs); + + files.AddRange(mzM4as); + files.AddRange(mvM4as); + + files.AddRange(mzOggs); + files.AddRange(mvOggs); + + if (files.Count <= 0) + return false; + + Random rng = new Random(); + int index = rng.Next(0, files.Count); + string file = files[index]; + + byte[] encryptedHeader = new byte[0x10]; + FileStream fs = File.OpenRead(file); + fs.Seek(0x10, SeekOrigin.Begin); + fs.Read(encryptedHeader, 0x00, 0x10); + fs.Close(); + + byte[] plaintextHeader = RMProject.Xor(encryptedHeader, key); + + string filetype = Path.GetExtension(file).ToLower(); + if (filetype == "._png" || filetype == ".rpgmvp") + if (Encoding.ASCII.GetString(plaintextHeader).Contains("PNG")) + return true; + else + return false; + else if (filetype == "._ogg" || filetype == ".rpgmvo") + if (Encoding.ASCII.GetString(plaintextHeader).StartsWith("OggS")) + return true; + else + return false; + else if (filetype == "._m4a" || filetype == ".rpgmvm") + if (Encoding.ASCII.GetString(plaintextHeader).Contains("ftypM4A")) + return true; + else + return false; + else // No encrypted files? + return false; + } + + private static MVProject GuessProject(string folder) + { + MVProject mvp = new MVProject(); + + mvp.MZ = false; + mvp.encryptedImages = false; + mvp.encryptedAudio = false; + folder = Path.GetDirectoryName(Path.GetDirectoryName(folder)); + string[] mzPngs = Directory.GetFiles(folder, "*._png", SearchOption.AllDirectories); + string[] mvPngs = Directory.GetFiles(folder, "*.rpgmvp", SearchOption.AllDirectories); + string[] mzM4as = Directory.GetFiles(folder, "*._m4a", SearchOption.AllDirectories); + string[] mvM4as = Directory.GetFiles(folder, "*.rpgmvm", SearchOption.AllDirectories); + string[] mzOggs = Directory.GetFiles(folder, "*._ogg", SearchOption.AllDirectories); + string[] mvOggs = Directory.GetFiles(folder, "*.rpgmvo", SearchOption.AllDirectories); + + string[] mzArtifacts = Directory.GetFiles(folder, "rmmz_*", SearchOption.AllDirectories); + string[] mvArtifacts = Directory.GetFiles(folder, "rpg_*", SearchOption.AllDirectories); + + // Look for PNG + if (mvPngs.Length > 0) + { + mvp.MZ = false; + mvp.encryptedImages = true; + } + else if (mzPngs.Length > 0) + { + mvp.MZ = true; + mvp.encryptedImages = true; + } + + // Look for M4A + if(mvM4as.Length > 0) + { + mvp.MZ = false; + mvp.encryptedAudio = true; + } + else if (mzM4as.Length > 0) + { + mvp.MZ = true; + mvp.encryptedAudio = true; + } + + // Look for OGG + if (mvOggs.Length > 0) + { + mvp.MZ = false; + mvp.encryptedAudio = true; + } + else if (mzOggs.Length > 0) + { + mvp.MZ = true; + mvp.encryptedAudio = true; + } + + // Determine MV or MZ + if(mzArtifacts.Length > 0) + { + mvp.MZ = true; + mvp.filePath = Path.GetDirectoryName(Path.GetDirectoryName(mzArtifacts[0])); + } + else if(mvArtifacts.Length > 0) + { + mvp.MZ = false; + mvp.filePath = Path.GetDirectoryName(Path.GetDirectoryName(mvArtifacts[0])); + } + + if(mvp.IsEncrypted) + { + byte[] key = guessKey(folder); + mvp.encryptionKey = key; + mvp.isKeySet = true; + } + + mvp.systemJsonFile = null; + mvp.jsonData = null; + + return mvp; + } private void genEncryptionKey() { @@ -139,13 +334,17 @@ namespace RMDEC //Public functions public static MVProject ParseSystemJson(string path) { - if (File.Exists(path)) + + //Check if valid system.json + + if (File.Exists(path) && Path.GetExtension(path).ToLower() == ".json") { + + MVProject mvp = new MVProject(); + string jsonStr = File.ReadAllText(path, Encoding.UTF8); dynamic systemJson = JObject.Parse(jsonStr); - //Check if valid system.json - MVProject mvp = new MVProject(); if (systemJson.gameTitle != null) { @@ -153,7 +352,7 @@ namespace RMDEC } else { - throw new InvalidDataException("Not a valid system.json!"); + return GuessProject(path); } if (systemJson.hasEncryptedAudio != null) @@ -169,8 +368,18 @@ namespace RMDEC if (systemJson.encryptionKey != null) { string encKey = systemJson.encryptionKey; - mvp.encryptionKey = hexStr2Bytes(encKey); - mvp.isKeySet = true; + byte[] key = hexStr2Bytes(encKey); + if(tryKey(Path.GetDirectoryName(Path.GetDirectoryName(path)), key)) + { + mvp.encryptionKey = key; + mvp.isKeySet = true; + } + else + { + key = guessKey(Path.GetDirectoryName(Path.GetDirectoryName(path))); + mvp.encryptionKey = key; + mvp.isKeySet = true; + } } mvp.filePath = Path.GetDirectoryName(Path.GetDirectoryName(path)); @@ -188,18 +397,21 @@ namespace RMDEC mvp.systemJsonFile = path; mvp.jsonData = systemJson; - return mvp; + + return mvp; } else { - throw new FileNotFoundException(path + " was not found!"); + return GuessProject(path); } - } - public void EncryptFile(Stream inStream, Stream outStream) + public void EncryptFile(Stream inStream, Stream outStream, byte[] key = null) { + if (key == null) + key = EncryptionKey; + outStream.Seek(0x00, SeekOrigin.Begin); outStream.SetLength(0x00); @@ -216,12 +428,15 @@ namespace RMDEC byte[] plaintextHeader = new byte[0x10]; inStream.Read(plaintextHeader, 0x00, 0x10); - byte[] encryptedHeader = RMProject.Xor(plaintextHeader, EncryptionKey); + byte[] encryptedHeader = RMProject.Xor(plaintextHeader, key); outStream.Write(encryptedHeader, 0x00, encryptedHeader.Length); inStream.CopyTo(outStream); } - public void DecryptFile(Stream inStream, Stream outStream) + public void DecryptFile(Stream inStream, Stream outStream, byte[] key=null) { + if (key == null) + key = EncryptionKey; + inStream.Seek(0x00, SeekOrigin.Begin); byte[] magic = new byte[0x05]; @@ -237,7 +452,7 @@ namespace RMDEC byte[] encryptedHeader = new byte[0x10]; inStream.Read(encryptedHeader, 0x00, 0x10); - byte[] plaintextHeader = RMProject.Xor(encryptedHeader, EncryptionKey); + byte[] plaintextHeader = RMProject.Xor(encryptedHeader, key); outStream.Seek(0x00, SeekOrigin.Begin); outStream.SetLength(0); diff --git a/RMDEC/projectSelector.cs b/RMDEC/projectSelector.cs index 71f31ab..d00a8ed 100644 --- a/RMDEC/projectSelector.cs +++ b/RMDEC/projectSelector.cs @@ -23,12 +23,12 @@ namespace RMDEC this.Cursor = Cursors.Arrow; } - private void tryAddProject(string projectFile) + private bool tryAddProject(string projectFile) { string relativeName = projectFile.Remove(0,projectDir.Text.Length + 1); string extension = Path.GetExtension(projectFile).ToLower(); - if (extension == ".json") + if (extension == ".json" || extension == ".js" || extension == ".png") { try { @@ -40,7 +40,7 @@ namespace RMDEC projectList.Items.Add("[RMMZ] - " + proj.GameTitle + " - " + relativeName); selectButton.Enabled = true; } - catch (Exception) { } + catch (Exception) { return false; } } else if (extension == ".rgss3a") { @@ -51,10 +51,10 @@ namespace RMDEC projectList.Items.Add("[RMVXA] - " + proj.GameTitle + " - " + relativeName); selectButton.Enabled = true; } - catch (Exception) { } + catch (Exception) { return false; } } - + return true; } private void updateProjectList(string projectDir) { @@ -72,13 +72,16 @@ namespace RMDEC { foreach (string fileEntry in fileList) { - if (Path.GetFileName(fileEntry) == "System.json" || Path.GetExtension(fileEntry).ToLower() == ".rgss3a") + bool shouldBreak = false; + if (Path.GetFileName(fileEntry).ToLower() == "system.json" || Path.GetFileName(fileEntry).ToLower().StartsWith("rmmz_core") || Path.GetFileName(fileEntry).ToLower().StartsWith("rpg_core") || Path.GetFileName(fileEntry).ToLower().StartsWith("icon.png") || Path.GetExtension(fileEntry).ToLower() == ".rgss3a") { Invoke((Action)delegate { - tryAddProject(fileEntry); + shouldBreak = tryAddProject(fileEntry); }); } + if (shouldBreak) + break; } } catch (Exception) { };