Added new entry

This commit is contained in:
Razmoth
2023-10-28 16:59:16 +04:00
parent fabdaec614
commit e863310354
3 changed files with 58 additions and 1 deletions

View File

@@ -208,6 +208,9 @@ namespace AssetStudio
break; break;
case GameType.GirlsFrontline: case GameType.GirlsFrontline:
reader = DecryptGirlsFrontline(reader); reader = DecryptGirlsFrontline(reader);
break;
case GameType.Reverse1999:
reader = DecryptReverse1999(reader);
break; break;
} }
} }

View File

@@ -40,6 +40,7 @@ namespace AssetStudio
Games.Add(index++, new Game(GameType.ProjectSekai)); Games.Add(index++, new Game(GameType.ProjectSekai));
Games.Add(index++, new Game(GameType.CodenameJump)); Games.Add(index++, new Game(GameType.CodenameJump));
Games.Add(index++, new Game(GameType.GirlsFrontline)); 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(GameType gameType) => GetGame((int)gameType);
public static Game GetGame(int index) public static Game GetGame(int index)
@@ -150,7 +151,8 @@ namespace AssetStudio
AliceGearAegis, AliceGearAegis,
ProjectSekai, ProjectSekai,
CodenameJump, CodenameJump,
GirlsFrontline GirlsFrontline,
Reverse1999
} }
public static class GameTypes public static class GameTypes

View File

@@ -898,5 +898,57 @@ namespace AssetStudio
ms.Position = 0; ms.Position = 0;
return new FileReader(reader.FullPath, ms); 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)));
}
}
} }
} }