Skip to content

Commit

Permalink
no more dumping and no more hardcoded paths
Browse files Browse the repository at this point in the history
  • Loading branch information
khang06 committed Nov 29, 2021
1 parent dcb0460 commit 5a3ba40
Show file tree
Hide file tree
Showing 7 changed files with 643 additions and 29 deletions.
2 changes: 2 additions & 0 deletions Il2CppDumper/ExecutableFormats/PE.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ namespace Il2CppDumper
{
public sealed class PE : Il2Cpp
{
public SectionHeader[] Sections => sections;

private SectionHeader[] sections;
private ulong imageBase;

Expand Down
74 changes: 74 additions & 0 deletions Il2CppDumper/Il2Cpp/MT19937_64.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Il2CppDumper
{
public class MT19937_64
{
private const ulong N = 312;
private const ulong M = 156;
private const ulong MATRIX_A = 0xB5026F5AA96619E9L;
private const ulong UPPER_MASK = 0xFFFFFFFF80000000;
private const ulong LOWER_MASK = 0X7FFFFFFFUL;
private static ulong[] mt = new ulong[N + 1];
private static ulong mti = N + 1;

public MT19937_64(ulong seed)
{
this.Seed(seed);
}

public void Seed(ulong seed)
{
mt[0] = seed;
for (mti = 1; mti < N; mti++)
{
mt[mti] = (6364136223846793005L * (mt[mti - 1] ^ (mt[mti - 1] >> 62)) + mti);
}
}

public ulong Int63()
{
ulong x = 0;
ulong[] mag01 = new ulong[2] { 0x0UL, MATRIX_A };

if (mti >= N)
{
ulong kk;
if (mti == N + 1)
{
Seed(5489UL);
}
for (kk = 0; kk < (N - M); kk++)
{
x = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
mt[kk] = mt[kk + M] ^ (x >> 1) ^ mag01[x & 0x1UL];
}
for (; kk < N - 1; kk++)
{
x = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
mt[kk] = mt[kk - M] ^ (x >> 1) ^ mag01[x & 0x1UL];
}
x = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
mt[N - 1] = mt[M - 1] ^ (x >> 1) ^ mag01[x & 0x1UL];

mti = 0;
}

x = mt[mti++];
x ^= (x >> 29) & 0x5555555555555555L;
x ^= (x << 17) & 0x71D67FFFEDA60000L;
x ^= (x << 37) & 0xFFF7EEE000000000L;
x ^= (x >> 43);
return x;
}

public ulong IntN(ulong value)
{
return Int63() % value;
}
}
}
38 changes: 23 additions & 15 deletions Il2CppDumper/Il2Cpp/Metadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public sealed class Metadata : BinaryStream
private Dictionary<string, string> nameTranslation = new Dictionary<string, string>();
private Regex nameTranslationMemberRegex = new Regex(@".+\/<(.+)>", RegexOptions.Compiled); // avoid a bunch of allocations

public Metadata(Stream stream) : base(stream)
public Metadata(Stream stream, MetadataDecryption.StringDecryptionData decData, string nameTranslationPath) : base(stream)
{
/*var sanity = ReadUInt32();
if (sanity != 0xFAB11BAF)
Expand All @@ -59,20 +59,29 @@ public Metadata(Stream stream) : base(stream)
Version = 24;
header = ReadClass<Il2CppGlobalMetadataHeader>(0);

stringDecryptionBlob = File.ReadAllBytes("D:\\genshinimpactre\\1.5-dev\\decryption_blob.bin");
//stringDecryptionBlob = File.ReadAllBytes("D:\\genshinimpactre\\1.5-dev\\decryption_blob.bin");
stringDecryptionBlob = decData.stringDecryptionBlob;
header.stringCount ^= (int)decData.stringCountXor;
header.stringOffset ^= decData.stringOffsetXor;
header.stringLiteralOffset ^= decData.stringLiteralOffsetXor;
header.stringLiteralDataCount ^= (int)decData.stringLiteralDataCountXor;
header.stringLiteralDataOffset ^= decData.stringLiteralDataOffsetXor;

var nameTranslationFile = File.ReadAllLines("D:\\genshinimpactre\\1.5-dev\\YuanShen_Data\\StreamingAssets\\nameTranslation.txt");
foreach (var line in nameTranslationFile)
if (nameTranslationPath != null)
{
if (line.StartsWith("#"))
continue;
var split = line.Split('⇨');
if (split.Length != 2)
throw new NotSupportedException($"unexpected split.Length {split.Length}");
//Console.WriteLine("{0} {1}", split[0], split[1]);
nameTranslation.Add(split[0], split[1]);
var nameTranslationFile = File.ReadAllLines(nameTranslationPath);
foreach (var line in nameTranslationFile)
{
if (line.StartsWith("#"))
continue;
var split = line.Split('⇨');
if (split.Length != 2)
throw new NotSupportedException($"unexpected split.Length {split.Length}");
//Console.WriteLine("{0} {1}", split[0], split[1]);
nameTranslation.Add(split[0], split[1]);
}
Console.WriteLine($"Loaded {nameTranslation.Count} lookup values");
}
Console.WriteLine($"Loaded {nameTranslation.Count} lookup values");

/*if (version == 24)
{
Expand Down Expand Up @@ -107,9 +116,9 @@ public Metadata(Stream stream) : base(stream)
genericParameters = ReadMetadataClassArray<Il2CppGenericParameter>(header.genericParametersOffset, header.genericParametersCount);
constraintIndices = ReadClassArray<int>(header.genericParameterConstraintsOffset, header.genericParameterConstraintsCount / 4);
vtableMethods = ReadClassArray<uint>(header.vtableMethodsOffset, header.vtableMethodsCount / 4);
stringLiterals = ReadMetadataClassArray<Il2CppStringLiteral>(header.stringLiteralOffset, header.stringLiteralCount);
if (Version > 16 && Version < 27) //TODO
{
stringLiterals = ReadMetadataClassArray<Il2CppStringLiteral>(0x25611C, (int)header.genericContainersOffset - 0x25611C); // see notes for how to get this
metadataUsageLists = ReadMetadataClassArray<Il2CppMetadataUsageList>(header.metadataUsageListsOffset, header.metadataUsageListsCount);
metadataUsagePairs = ReadMetadataClassArray<Il2CppMetadataUsagePair>(header.metadataUsagePairsOffset, header.metadataUsagePairsCount);

Expand Down Expand Up @@ -167,8 +176,7 @@ public string GetStringFromIndex(uint index)
{
if (!stringCache.TryGetValue(index, out var result))
{
//result = ReadStringToNull(header.stringOffset + index);
result = LookupNameTranslation(ReadStringToNull(0xE63A28 + index));
result = ReadStringToNull(header.stringOffset + index);
stringCache.Add(index, result);
}
return result;
Expand Down
12 changes: 6 additions & 6 deletions Il2CppDumper/Il2Cpp/MetadataClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,10 @@ public class Il2CppGlobalMetadataHeader
public uint padding2;
public uint padding3; //0x10
public uint padding4;
public uint padding5;
public uint padding6;
public uint padding7; //0x20
public uint padding8;
public uint stringLiteralDataOffset;
public int stringLiteralDataCount;
public uint stringLiteralOffset; //0x20
public int stringLiteralCount;

public uint genericContainersOffset; // 0x28
public int genericContainersCount;
Expand Down Expand Up @@ -166,8 +166,8 @@ public class Il2CppGlobalMetadataHeader
public uint padding30;
public uint padding31; //0xd0
public uint padding32;
public uint padding33;
public uint padding34;
public uint stringOffset;
public int stringCount;

public uint parametersOffset; // 0xe0
public int parametersCount;
Expand Down
Loading

0 comments on commit 5a3ba40

Please sign in to comment.