VMProtect/runtime/VMProtect.Runtime/Tests/UnitTestProject/RefVm/StringDecryptor.cs

649 lines
25 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using forms_cil;
// Token: 0x0200003D RID: 61
namespace UnitTestProject.RefVm
{
public static class StringDecryptor // \u0006\u2009
{
private static BinStreamReader _binStreamReader; // \u0003
private static readonly DecryptedStrings DecryptedStringsGlobal; // \u0002
private static byte[] _commonKey; // \u0005
private static short _keyLength; // \u0008
private static readonly Enum1 Enum1Dummy; // \u0003\u2000
private static int _int1Dummy; // \u0002\u2000
private static int _int2Dummy; // \u000F
private static int _int3Dummy; // \u0006
private static byte[] _pkt; // \u000E
// Token: 0x060002CE RID: 718 RVA: 0x00013060 File Offset: 0x00011260
[MethodImpl(MethodImplOptions.NoInlining)]
static StringDecryptor()
{
var num = -42518532;
var num2 = num ^ 1885636661;
DecryptedStringsGlobal = new DecryptedStrings(1970604170 + num + num2 /*9*/);
var num3 = 2;
var stackTrace = new StackTrace(num3, false);
num3 -= 2;
var frame = stackTrace.GetFrame(num3);
var index = num3;
if (frame == null)
{
stackTrace = new StackTrace();
index = 1;
frame = stackTrace.GetFrame(index);
}
var num4 = ~- -~~-~-~(1341405001 ^ num ^ num2) ^ -~~- -~-~~(2095196650 + num - num2);
var methodBase = frame?.GetMethod();
if (frame != null)
{
num4 ^= ~- -~~-~-~(num ^ -1658751032 ^ num2);
}
var type = methodBase?.DeclaringType;
if (type == typeof(RuntimeMethodHandle))
{
Enum1Dummy = (Enum1)(4 | (int)Enum1Dummy);
num4 ^= 1970604898 + num + num2 + num3;
}
else if (type == null)
{
if (CheckStack(stackTrace, index))
{
num4 ^= ~-~- -~~-~(-1970628130 - num - num2) - num3;
Enum1Dummy = (Enum1)(16 | (int)Enum1Dummy);
}
else
{
num4 ^= ~- -~~-~-~(num ^ -1885608078 ^ num2);
Enum1Dummy = (Enum1)(1 | (int)Enum1Dummy);
}
}
else
{
num4 ^= ~-~- -~~-~(1885542988 - num + num2) - num3;
Enum1Dummy = (Enum1)(16 | (int)Enum1Dummy);
}
_int1Dummy += num4;
}
// Token: 0x060002CF RID: 719 RVA: 0x000131D4 File Offset: 0x000113D4
public static string GetString(int id) // \u0002
{
lock (DecryptedStringsGlobal)
{
return DecryptedStringsGlobal[id] ?? DecryptString(id, true);
}
}
public static void SetString(int id, string val) // for unit tests
{
lock (DecryptedStringsGlobal)
{
DecryptedStringsGlobal[id] = val;
}
}
// Token: 0x060002D0 RID: 720 RVA: 0x00013224 File Offset: 0x00011424
[MethodImpl(MethodImplOptions.NoInlining)]
private static string DecryptString(int id, bool dummy) // \u0002
{
var num = 1500675437;
var num2 = 1065028357 - num;
byte[] key;
string str;
int num6;
if (_binStreamReader == null)
{
var executingAssembly = Assembly.GetExecutingAssembly();
_int3Dummy |= num ^ -1084071305 ^ num2;
var stringBuilder = new StringBuilder();
var num3 = -1821765671 - num + num2;
stringBuilder.Append((char)(num3 >> 16)).Append((char)num3);
num3 = 1822175277 + num ^ num2;
stringBuilder.Append((char)(num3 >> 16)).Append((char)num3);
num3 = (1619914499 ^ num) + num2;
stringBuilder.Append((char)num3).Append((char)(num3 >> 16));
num3 = 1602104074 - num - num2;
stringBuilder.Append((char)num3).Append((char)(num3 >> 16));
num3 = (num ^ 1619980037) + num2;
stringBuilder.Append((char)num3).Append((char)(num3 >> 16));
num3 = num + -1398984659 - num2;
stringBuilder.Append((char)num3).Append((char)(num3 >> 16));
var manifestResourceStream = executingAssembly.GetManifestResourceStream(/* added by ursoft */ "forms_cil." +
stringBuilder.ToString()
/* added by ursoft */.GetHashCode().ToString());
var num4 = 2;
var stackTrace = new StackTrace(num4, false);
_int3Dummy ^= (1082521283 ^ num) + num2 | num4;
num4 -= 2;
var frame = stackTrace.GetFrame(num4);
var index = num4;
if (frame == null)
{
stackTrace = new StackTrace();
index = 1;
frame = stackTrace.GetFrame(index);
}
var methodBase = frame?.GetMethod();
_int3Dummy ^= num4 + (num + -1936322645 ^ num2);
var type = methodBase?.DeclaringType;
if (frame == null)
{
_int3Dummy ^= 1065247672 - num - num2;
}
var flag = type == typeof(RuntimeMethodHandle);
_int3Dummy ^= (num ^ 1082461797) + num2;
if (!flag)
{
flag = type == null;
if (flag)
{
if (CheckStack(stackTrace, index))
{
flag = false;
}
else
{
_int3Dummy ^= 1065247640 - num - num2;
}
}
}
if (flag)
{
_int3Dummy ^= 32;
}
_int3Dummy ^= (num ^ 1082521251) + num2 | num4 + 1;
_binStreamReader = new BinStreamReader(manifestResourceStream);
var commonKeyLength = (short)(_binStreamReader.ReadHeaderInt16() ^ ~(short)-(short)-(short)~(short)~(short)-(short)~(short)-(short)~(short)-(short)~(short)(-1065050389 + num ^ num2));
if (commonKeyLength == 0)
{
_keyLength = (short)(_binStreamReader.ReadHeaderInt16() ^ -(short)~(short)~(short)-(short)-(short)~(short)~(short)-(short)-(short)~(short)~(short)((-1082482306 ^ num) - num2));
}
else
{
_commonKey = _binStreamReader.Read(commonKeyLength);
}
var assembly = executingAssembly;
var assemblyName = SafeAssemblyName(assembly);
_pkt = SafeAssemblyPkt(assemblyName);
num6 = _int1Dummy;
_int1Dummy = 0;
var num7 = SdMetadataTokens.GetLong();
num6 ^= (int)(uint)num7;
num6 ^= -888987382 - num + num2;
var num8 = num6;
var num9 = num8;
var num10 = 0;
var num11 = num9 ^ -1693408934 + num - num2;
var num12 = num11 * (1936327810 - num + num2) % ((num ^ -1092770072) - num2);
var num13 = num12;
var obj = ((I2<int>)new SdTemplateStuff.C(-1065028359 + num | num2)
{
I6 = num13
}).I2M();
try
{
while (obj.I4M())
{
var num14 = obj.I1M();
num12 ^= num10 - num14 << 2;
num10 += num12 >> 3;
}
}
finally
{
obj?.I5M();
}
num6 ^= ~- -~-~~- -~~(num ^ 1140387705 ^ num2);
var num15 = num12;
num6 = num15 + num6;
_int2Dummy = num6;
_int3Dummy = (_int3Dummy & -1667887203 + num - num2) ^ (num ^ 1082519937) + num2;
if ((Enum1Dummy & (Enum1)(-~~- -~-~~(1936322518 - num ^ num2))) == 0)
{
_int3Dummy = (-1082440641 ^ num) - num2;
}
}
else
{
num6 = _int2Dummy;
}
if (_int3Dummy == 1936366479 - num + num2)
{
return new string(new[] { (char)((-1082462051 ^ num) - num2), '0', (char)(num + -1065028269 + num2) });
}
var num16 = id ^ -1010833342 ^ num ^ num2 ^ num6;
num16 ^= -1459130838 - num + num2;
_binStreamReader.GetStream().Position = num16;
if (_commonKey != null)
{
key = _commonKey;
}
else
{
short keyLength;
if (_keyLength == -1)
{
keyLength = (short)(_binStreamReader.ReadHeaderInt32() ^ num + -1936293566 - num2 ^ num16);
}
else
{
keyLength = _keyLength;
}
if (keyLength == 0)
{
key = null;
}
else
{
key = _binStreamReader.Read(keyLength);
for (var i = 0; i != key.Length; i = 1 + i)
{
key[i] ^= (byte)(_int2Dummy >> ((3 & i) << 3));
}
}
}
var stringHeader = _binStreamReader.ReadHeaderInt32() ^ num16 ^ -~~-~-~-~((num ^ -1882046960) + num2) ^ num6;
if (stringHeader != (1936322515 - num | num2))
{
var flagAnsi = (stringHeader & 211161131 + num - num2) != 0;
var flagCompressed = (stringHeader & (-8713467 - num ^ num2)) != 0;
var flagSecure = (stringHeader & (1619332869 ^ num) + num2) != 0;
stringHeader &= num + -1870334726 ^ num2;
var packedStringBuf = _binStreamReader.Read(stringHeader);
// ReSharper disable once PossibleNullReferenceException
var key1 = key[1];
var length = packedStringBuf.Length;
var key1XorLen = (byte)(11 + length ^ 7 + key1);
var keysXorLen = (uint)((key[0] | key[2] << 8) + (key1XorLen << 3));
ushort keysXorLenLowWord = 0;
for (var index = 0; index < length; ++index)
{
if ((index & 1) == 0)
{
keysXorLen = keysXorLen * (uint)((num ^ -1082544904) - num2) + (uint)(num + -1933863442 ^ num2);
keysXorLenLowWord = (ushort)(keysXorLen >> 16);
}
var keysXorLenLowByte = (byte)keysXorLenLowWord;
keysXorLenLowWord = (ushort)(keysXorLenLowWord >> 8);
var inByte = packedStringBuf[index];
packedStringBuf[index] = (byte)(inByte ^ key1 ^ 3 + key1XorLen ^ keysXorLenLowByte);
key1XorLen = inByte;
}
if (_pkt != null != (_int3Dummy != (-1085052045 ^ num) - num2))
{
for (var j = 0; j < stringHeader; j = 1 + j)
{
// ReSharper disable once PossibleNullReferenceException
var b5 = _pkt[7 & j];
b5 = (byte)(b5 << 3 | b5 >> 5);
packedStringBuf[j] ^= b5;
}
}
var num23 = _int3Dummy - 12;
int unpackedLength;
byte[] unpackedStringBuf;
if (!flagCompressed)
{
unpackedLength = stringHeader;
unpackedStringBuf = packedStringBuf;
}
else
{
unpackedLength = packedStringBuf[2] | packedStringBuf[0] << 16 | packedStringBuf[3] << 8 | packedStringBuf[1] << 24;
unpackedStringBuf = new byte[unpackedLength];
Unpack(packedStringBuf, 4, unpackedStringBuf);
}
if (flagAnsi && num23 == (num + -1935832971 ^ num2))
{
var chArray = new char[unpackedLength];
for (var k = 0; k < unpackedLength; k++)
{
chArray[k] = (char)unpackedStringBuf[k];
}
str = new string(chArray);
}
else
{
str = Encoding.Unicode.GetString(unpackedStringBuf, 0, unpackedStringBuf.Length);
}
num23 += (-1082461318 ^ num) - num2 + (3 & num23) << 5;
if (num23 != (1065521775 - num ^ num2))
{
var num25 = stringHeader + id ^ -1935385949 + num - num2 ^ (num23 & (-1082460680 ^ num ^ num2));
var stringBuilder = new StringBuilder();
var num3 = 1065028445 - num - num2;
stringBuilder.Append((char)(byte)num3);
str = num25.ToString(stringBuilder.ToString());
}
if (!flagSecure & dummy)
{
str = string.Intern(str);
DecryptedStringsGlobal[id] = str;
if (DecryptedStringsGlobal.GetCachedPairs() == (num + -1936322454 ^ num2))
{
_binStreamReader.Close();
_binStreamReader = null;
_commonKey = null;
_pkt = null;
}
}
return str;
}
var refId = _binStreamReader.Read(4);
id = -64102883 ^ num ^ num2 ^ num6;
id = (refId[2] | refId[3] << 16 | refId[0] << 8 | refId[1] << 24) ^ -id;
str = DecryptedStringsGlobal[id];
return str;
}
// Token: 0x060002D1 RID: 721 RVA: 0x00013A28 File Offset: 0x00011C28
private static AssemblyName SafeAssemblyName(Assembly a) // \u0002
{
AssemblyName result;
try
{
result = a.GetName();
}
catch
{
result = new AssemblyName(a.FullName);
}
return result;
}
// Token: 0x060002D2 RID: 722 RVA: 0x00013A60 File Offset: 0x00011C60
private static byte[] SafeAssemblyPkt(AssemblyName an) // \u0002
{
var array = an.GetPublicKeyToken();
if (array != null && array.Length == 0)
{
array = null;
}
return array;
}
// Token: 0x060002D3 RID: 723 RVA: 0x00013A80 File Offset: 0x00011C80
[MethodImpl(MethodImplOptions.NoInlining)]
private static bool CheckStack(StackTrace st, int idx) // \u0002
{
var a = st.GetFrame(idx + 1)?.GetMethod()?.DeclaringType?.Assembly;
if (a != null)
{
var assemblyName = SafeAssemblyName(a);
var array = SafeAssemblyPkt(assemblyName);
if (array != null && array.Length == 8 && array[0] == 183 && array[7] == 137)
{
return true;
}
}
return false;
}
// Token: 0x060002D4 RID: 724 RVA: 0x00013AF0 File Offset: 0x00011CF0
private static void Unpack(byte[] packedStringBuf, int idxPacked, byte[] unpackedStringBuf) // \u0002
{
var idxUnpacked = 0;
var packedBlockHeader = 0;
var byteMask = 0x80;
var unpackLen = unpackedStringBuf.Length;
while (idxUnpacked < unpackLen)
{
byteMask <<= 1;
if (byteMask == 0x100)
{
byteMask = 1;
packedBlockHeader = packedStringBuf[idxPacked++];
}
if ((packedBlockHeader & byteMask) == 0)
{
unpackedStringBuf[idxUnpacked++] = packedStringBuf[idxPacked++];
continue;
}
var knownWordLen = (packedStringBuf[idxPacked] >> 2) + 3;
var knownWordOffset = ((packedStringBuf[idxPacked] << 8) | packedStringBuf[idxPacked + 1]) & 0x3ff;
idxPacked += 2;
var knownWordIdx = idxUnpacked - knownWordOffset;
if (knownWordIdx < 0)
return;
while (--knownWordLen >= 0 && idxUnpacked < unpackLen)
{
unpackedStringBuf[idxUnpacked++] = unpackedStringBuf[knownWordIdx++];
}
}
}
// Token: 0x0200003E RID: 62
internal sealed class BinStreamReader // \u0003\u2002\u200A\u2008\u2008\u200B\u2002\u2006\u2002\u2009\u2009\u2006\u2004\u2006\u2002\u2007\u2006\u2003\u2001\u2007\u2003\u200A\u2009\u200B\u2003\u2001
{
private byte[] _header; // \u0003
private Stream _stream; // \u0002
// Token: 0x060002D5 RID: 725 RVA: 0x00013B94 File Offset: 0x00011D94
public BinStreamReader(Stream stream)
{
_stream = stream;
_header = new byte[4];
}
// Token: 0x060002D6 RID: 726 RVA: 0x00013BB0 File Offset: 0x00011DB0
public Stream GetStream() // \u0002
{
return _stream;
}
// Token: 0x060002D7 RID: 727 RVA: 0x00013BB8 File Offset: 0x00011DB8
public short ReadHeaderInt16() // \u0002
{
ReadHeader(2);
return (short) (_header[0] | (_header[1] << 8));
}
// Token: 0x060002D8 RID: 728 RVA: 0x00013BD8 File Offset: 0x00011DD8
public int ReadHeaderInt32() // \u0002
{
ReadHeader(4);
return _header[0] | (_header[1] << 8) | (_header[2] << 0x10) | (_header[3] << 0x18);
}
// Token: 0x060002D9 RID: 729 RVA: 0x00013C0C File Offset: 0x00011E0C
private void ThrowEOS() // \u0002
{
throw new EndOfStreamException();
}
// Token: 0x060002DA RID: 730 RVA: 0x00013C14 File Offset: 0x00011E14
private void ReadHeader(int headerSize) // \u0002
{
var offset = 0;
int read;
if (headerSize == 1)
{
read = _stream.ReadByte();
if (read == -1)
ThrowEOS();
_header[0] = (byte) read;
}
else
{
do
{
read = _stream.Read(_header, offset, headerSize - offset);
if (read == 0)
ThrowEOS();
offset += read;
} while (offset < headerSize);
}
}
// Token: 0x060002DB RID: 731 RVA: 0x00013C74 File Offset: 0x00011E74
public void Close() // \u0003
{
var stream = _stream;
_stream = null;
stream?.Close();
_header = null;
}
// Token: 0x060002DC RID: 732 RVA: 0x00013CA0 File Offset: 0x00011EA0
public byte[] Read(int bytesCount) // \u0002
{
if (bytesCount < 0)
throw new ArgumentOutOfRangeException();
var buffer = new byte[bytesCount];
var offset = 0;
do
{
var read = _stream.Read(buffer, offset, bytesCount);
if (read == 0)
break;
offset += read;
bytesCount -= read;
} while (bytesCount > 0);
if (offset != buffer.Length)
{
var dst = new byte[offset];
Buffer.BlockCopy(buffer, 0, dst, 0, offset);
buffer = dst;
}
return buffer;
}
}
// Token: 0x0200003F RID: 63
internal sealed class DecryptedStrings // \u0005\u2001\u2007\u200B\u2000\u2008\u2008\u2000\u2000\u2006\u2004\u2008\u200B\u2002\u2006\u200B\u2001\u200B\u2003\u2004\u2001\u2004
{
private int _cachedPairs; // \u0003
private Pair[] _arr; // \u0002
// Token: 0x060002DD RID: 733 RVA: 0x00013CFC File Offset: 0x00011EFC
public DecryptedStrings()
{
_arr = new Pair[0x10];
}
// Token: 0x060002DE RID: 734 RVA: 0x00013D14 File Offset: 0x00011F14
public DecryptedStrings(int capacityHint)
{
var capacity = 0x10;
capacityHint = capacityHint << 1;
while ((capacity < capacityHint) && (capacity > 0))
{
capacity = capacity << 1;
}
if (capacity < 0)
{
capacity = 0x10;
}
_arr = new Pair[capacity];
}
// Token: 0x060002DF RID: 735 RVA: 0x00013D54 File Offset: 0x00011F54
public int GetCachedPairs()
{
return _cachedPairs;
}
// Token: 0x060002E0 RID: 736 RVA: 0x00013D5C File Offset: 0x00011F5C
private void GrowCache() // \u0002
{
var length = _arr.Length;
var newLength = length * 2;
if (newLength > 0)
{
var newArr = new Pair[newLength];
var cnt = 0;
for (var i = 0; i < length; i++)
{
if (_arr[i].val != null)
{
var index = _arr[i].id & (newLength - 1);
while (true)
{
if (newArr[index].val == null)
{
newArr[index].val = _arr[i].val;
newArr[index].id = _arr[i].id;
cnt++;
break;
}
index++;
if (index >= newLength)
index = 0;
}
}
}
_arr = newArr;
_cachedPairs = cnt;
}
}
public string this[int id]
{
// Token: 0x060002E1 RID: 737 RVA: 0x00013E10 File Offset: 0x00012010
get // \u0002
{
var length = _arr.Length;
var index = id & (length - 1);
do
{
if (_arr[index].id == id || _arr[index].val == null)
return _arr[index].val;
index++;
if (index >= length)
index = 0;
} while (true);
}
// Token: 0x060002E2 RID: 738 RVA: 0x00013E6C File Offset: 0x0001206C
set // \u0002
{
var length = _arr.Length;
var halfLength = length >> 1;
var index = id & (length - 1);
do
{
var emptySlot = _arr[index].val == null;
if (_arr[index].id == id || emptySlot)
{
_arr[index].val = value;
if (emptySlot)
{
_arr[index].id = id;
_cachedPairs++;
if (_cachedPairs > halfLength)
GrowCache();
}
break;
}
index++;
if (index >= length)
index = 0;
} while (true);
}
}
// Token: 0x02000040 RID: 64
[StructLayout(LayoutKind.Sequential)]
private struct Pair // \u0002
{
public int id;
public string val;
}
}
// Token: 0x02000041 RID: 65
[Flags]
internal enum Enum1
{
}
}
}