(WARC): another decryptor.

This commit is contained in:
morkt 2017-02-03 11:48:54 +04:00
parent 25c36072a3
commit 97a6b331c5
3 changed files with 41 additions and 7 deletions

View File

@ -93,6 +93,7 @@
<Compile Include="ArcCG.cs" /> <Compile Include="ArcCG.cs" />
<Compile Include="Artemis\ArcPFS.cs" /> <Compile Include="Artemis\ArcPFS.cs" />
<Compile Include="AudioWMA.cs" /> <Compile Include="AudioWMA.cs" />
<Compile Include="BlackRainbow\ArcDAT.cs" />
<Compile Include="BlackRainbow\ArcDX.cs" /> <Compile Include="BlackRainbow\ArcDX.cs" />
<Compile Include="C4\AudioVMD.cs" /> <Compile Include="C4\AudioVMD.cs" />
<Compile Include="C4\ImageGD.cs" /> <Compile Include="C4\ImageGD.cs" />

View File

@ -158,13 +158,15 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
uint unpacked_size = LittleEndian.ToUInt32 (enc_data, 4); uint unpacked_size = LittleEndian.ToUInt32 (enc_data, 4);
sig ^= (unpacked_size ^ 0x82AD82) & 0xffffff; sig ^= (unpacked_size ^ 0x82AD82) & 0xffffff;
if (0 != (wentry.Flags & 0x80000000u) && entry.Size > 8) // encrypted entry if (entry.Size > 8)
warc.Decoder.Decrypt (enc_data, 8, entry.Size-8); {
if (warc.Decoder.ExtraCrypt != null) if (0 != (wentry.Flags & 0x80000000u)) // encrypted entry
warc.Decoder.ExtraCrypt.Decrypt (enc_data, 8, entry.Size-8, 0x202); warc.Decoder.Decrypt (enc_data, 8, entry.Size-8);
if (0 != (wentry.Flags & 0x20000000u) && entry.Size > 8) if (warc.Decoder.ExtraCrypt != null)
warc.Decoder.Decrypt2 (enc_data, 8, entry.Size-8); warc.Decoder.ExtraCrypt.Decrypt (enc_data, 8, entry.Size-8, 0x202);
if (0 != (wentry.Flags & 0x20000000u))
warc.Decoder.Decrypt2 (enc_data, 8, entry.Size-8);
}
byte[] unpacked = enc_data; byte[] unpacked = enc_data;
UnpackMethod unpack = null; UnpackMethod unpack = null;
switch (sig & 0xffffff) switch (sig & 0xffffff)

View File

@ -1126,4 +1126,35 @@ namespace GameRes.Formats.ShiinaRio
} }
} }
} }
[Serializable]
public class CountCrypt : IDecryptExtra
{
public void Decrypt (byte[] data, int index, uint length, uint flags)
{
if (length >= 0x200 && (flags & 0x204) == 0x204)
DoCountCrypt (data, index, (int)length);
}
public void Encrypt (byte[] data, int index, uint length, uint flags)
{
if (length >= 0x200 && (flags & 0x104) == 0x104)
DoCountCrypt (data, index, (int)length);
}
void DoCountCrypt (byte[] data, int index, int length)
{
length = (length & 0x7E) | 1;
byte count_00 = 0, count_FF = 0;
for (int i = 0; i < length; ++i)
{
if (0xFF == data[index+i])
count_FF++;
else if (0 == data[index+i])
count_00++;
}
data[index + 0x100] ^= count_00;
data[index + 0x104] ^= count_FF;
}
}
} }