Add error message for bundles with CN encryption

This commit is contained in:
VaDiM 2023-03-20 10:09:55 +03:00
parent 4edadb19f8
commit 9e14f1ef00
3 changed files with 40 additions and 5 deletions

View File

@ -169,7 +169,7 @@ namespace AssetStudio
} }
catch (NotSupportedException e) catch (NotSupportedException e)
{ {
Logger.Error(e.Message, e); Logger.Error(e.Message);
reader.Dispose(); reader.Dispose();
} }
catch (Exception e) catch (Exception e)
@ -203,7 +203,7 @@ namespace AssetStudio
} }
catch (NotSupportedException e) catch (NotSupportedException e)
{ {
Logger.Error(e.Message, e); Logger.Error(e.Message);
resourceFileReaders.Add(reader.FileName, reader); resourceFileReaders.Add(reader.FileName, reader);
} }
catch (Exception e) catch (Exception e)
@ -221,7 +221,7 @@ namespace AssetStudio
Logger.Info("Loading " + reader.FullPath); Logger.Info("Loading " + reader.FullPath);
try try
{ {
var bundleFile = new BundleFile(reader); var bundleFile = new BundleFile(reader, SpecifyUnityVersion);
foreach (var file in bundleFile.fileList) foreach (var file in bundleFile.fileList)
{ {
var dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), file.fileName); var dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), file.fileName);
@ -236,6 +236,10 @@ namespace AssetStudio
} }
} }
} }
catch (NotSupportedException e)
{
Logger.Error(e.Message);
}
catch (Exception e) catch (Exception e)
{ {
var str = $"Error while reading bundle file {reader.FullPath}"; var str = $"Error while reading bundle file {reader.FullPath}";

View File

@ -15,6 +15,13 @@ namespace AssetStudio
BlockInfoNeedPaddingAtStart = 0x200 BlockInfoNeedPaddingAtStart = 0x200
} }
[Flags]
public enum CnEncryptionFlags
{
OldFlag = 0x200,
NewFlag = 0x400
}
[Flags] [Flags]
public enum StorageBlockFlags public enum StorageBlockFlags
{ {
@ -66,7 +73,7 @@ namespace AssetStudio
public StreamFile[] fileList; public StreamFile[] fileList;
public BundleFile(FileReader reader) public BundleFile(FileReader reader, string specUnityVer = "")
{ {
m_Header = new Header(); m_Header = new Header();
m_Header.signature = reader.ReadStringToNull(); m_Header.signature = reader.ReadStringToNull();
@ -92,6 +99,30 @@ namespace AssetStudio
break; break;
case "UnityFS": case "UnityFS":
ReadHeader(reader); ReadHeader(reader);
bool isUnityCnEnc = false;
string unityVer = string.IsNullOrEmpty(specUnityVer) ? m_Header.unityRevision : specUnityVer;
int[] ver = new string(unityVer.SkipWhile(x => !char.IsDigit(x)).TakeWhile(x => char.IsDigit(x) || x == '.').ToArray()).Split('.').Select(x => int.Parse(x)).ToArray();
if (ver[0] != 0)
{
// https://issuetracker.unity3d.com/issues/files-within-assetbundles-do-not-start-on-aligned-boundaries-breaking-patching-on-nintendo-switch
if (ver[0] < 2020 ||
(ver[0] == 2020 && ver[1] <= 3 && ver[2] < 34) ||
(ver[0] == 2021 && ver[1] <= 3 && ver[2] < 2) ||
(ver[0] == 2022 && ver[1] <= 1 && ver[2] < 1))
{
isUnityCnEnc = ((CnEncryptionFlags)m_Header.flags & CnEncryptionFlags.OldFlag) != 0;
}
else
{
isUnityCnEnc = ((CnEncryptionFlags)m_Header.flags & CnEncryptionFlags.NewFlag) != 0;
}
}
if (isUnityCnEnc)
{
throw new NotSupportedException("Unsupported bundle file. UnityCN encryption was detected.");
}
ReadBlocksInfoAndDirectory(reader); ReadBlocksInfoAndDirectory(reader);
using (var blocksStream = CreateBlocksStream(reader.FullPath)) using (var blocksStream = CreateBlocksStream(reader.FullPath))
{ {

View File

@ -85,7 +85,7 @@ namespace AssetStudioGUI
private static int ExtractBundleFile(FileReader reader, string savePath) private static int ExtractBundleFile(FileReader reader, string savePath)
{ {
Logger.Info($"Decompressing {reader.FileName} ..."); Logger.Info($"Decompressing {reader.FileName} ...");
var bundleFile = new BundleFile(reader); var bundleFile = new BundleFile(reader, assetsManager.SpecifyUnityVersion);
reader.Dispose(); reader.Dispose();
if (bundleFile.fileList.Length > 0) if (bundleFile.fileList.Length > 0)
{ {