From e86331035413af8bc51bd8453e2d0c4c37cff3bb Mon Sep 17 00:00:00 2001 From: Razmoth <32140579+Razmoth@users.noreply.github.com> Date: Sat, 28 Oct 2023 16:59:16 +0400 Subject: [PATCH] Added new entry --- AssetStudio/FileReader.cs | 3 +++ AssetStudio/GameManager.cs | 4 ++- AssetStudio/ImportHelper.cs | 52 +++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/AssetStudio/FileReader.cs b/AssetStudio/FileReader.cs index aababd7..f755563 100644 --- a/AssetStudio/FileReader.cs +++ b/AssetStudio/FileReader.cs @@ -208,6 +208,9 @@ namespace AssetStudio break; case GameType.GirlsFrontline: reader = DecryptGirlsFrontline(reader); + break; + case GameType.Reverse1999: + reader = DecryptReverse1999(reader); break; } } diff --git a/AssetStudio/GameManager.cs b/AssetStudio/GameManager.cs index ea3ccd0..1ef2214 100644 --- a/AssetStudio/GameManager.cs +++ b/AssetStudio/GameManager.cs @@ -40,6 +40,7 @@ namespace AssetStudio Games.Add(index++, new Game(GameType.ProjectSekai)); Games.Add(index++, new Game(GameType.CodenameJump)); Games.Add(index++, new Game(GameType.GirlsFrontline)); + Games.Add(index++, new Game(GameType.Reverse1999)); } public static Game GetGame(GameType gameType) => GetGame((int)gameType); public static Game GetGame(int index) @@ -150,7 +151,8 @@ namespace AssetStudio AliceGearAegis, ProjectSekai, CodenameJump, - GirlsFrontline + GirlsFrontline, + Reverse1999 } public static class GameTypes diff --git a/AssetStudio/ImportHelper.cs b/AssetStudio/ImportHelper.cs index f54298f..f0fac76 100644 --- a/AssetStudio/ImportHelper.cs +++ b/AssetStudio/ImportHelper.cs @@ -898,5 +898,57 @@ namespace AssetStudio ms.Position = 0; return new FileReader(reader.FullPath, ms); } + + public static FileReader DecryptReverse1999(FileReader reader) + { + Logger.Verbose($"Attempting to decrypt file {reader.FileName} with Reverse: 1999 encryption"); + + var signatureBytes = reader.ReadBytes(8); + var signature = Encoding.UTF8.GetString(signatureBytes[..7]); + if (signature == "UnityFS") + { + Logger.Verbose("Found UnityFS signature, file might not be encrypted"); + reader.Position = 0; + return reader; + } + + var key = GetAbEncryptKey(Path.GetFileNameWithoutExtension(reader.FileName)); + for (int i = 0; i < signatureBytes.Length; i++) + { + signatureBytes[i] ^= key; + } + + signature = Encoding.UTF8.GetString(signatureBytes[..7]); + if (signature == "UnityFS") + { + Logger.Verbose($"Found UnityFS signature, key 0x{key:X2} is valid, decrypting the rest of the stream"); + var remaining = reader.ReadBytes((int)reader.Remaining); + for (int i = 0; i < remaining.Length; i++) + { + remaining[i] ^= key; + } + + Logger.Verbose("Decrypted Reverse: 1999 file successfully !!"); + var stream = new MemoryStream(); + stream.Write(signatureBytes); + stream.Write(remaining); + stream.Position = 0; + return new FileReader(reader.FullPath, stream); + } + + Logger.Verbose("File doesn't match any of the encryption types"); + reader.Position = 0; + return reader; + + static byte GetAbEncryptKey(string md5Name) + { + byte key = 0; + foreach (var c in md5Name) + { + key += (byte)c; + } + return (byte)(key + (byte)(2 * ((key & 1) + 1))); + } + } } }