Skip to content
This repository has been archived by the owner on Nov 25, 2021. It is now read-only.

Commit

Permalink
Merge pull request #83 from LukeCroteau/support-metadata271
Browse files Browse the repository at this point in the history
Add support for metadata v27
  • Loading branch information
LukeCroteau authored Oct 21, 2021
2 parents 4309774 + 2be4d0c commit 961d21f
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 20 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# RaidExtractor
A tool made to extract information from the windows version of "Raid: Shadow Legends". Currently it supports v.251 (as seen in Plarium Play launcher).
A tool made to extract information from the windows version of "Raid: Shadow Legends". Currently it supports v.252 (as seen in Plarium Play launcher).

This application has 2 Modes:
* A Windows GUI application. The functionality is slim, but it works!
Expand Down
106 changes: 93 additions & 13 deletions RaidExtractor.Core/StaticDataHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -420,15 +420,55 @@ private int GetFieldOffset(Il2Cpp il2Cpp, Metadata metadata, Il2CppExecutor exec

private int GetMethodAddress(Il2Cpp il2Cpp, Metadata metadata, Il2CppExecutor executor, string methodType, string methodName)
{
foreach (var i in metadata.metadataUsageDic[Il2CppMetadataUsage.kIl2CppMetadataUsageMethodRef])
{
var methodSpec = il2Cpp.methodSpecs[i.Value];

(var methodSpecTypeName, var methodSpecMethodName) = executor.GetMethodSpecName(methodSpec, true);

if (methodSpecTypeName == methodType && methodSpecMethodName == methodName)
if (il2Cpp.Version >= 27)
{
var sectionHelper = executor.GetSectionHelper();
foreach (var sec in sectionHelper.data)
{
return (int)il2Cpp.GetRVA(il2Cpp.metadataUsages[i.Key]);
il2Cpp.Position = sec.offset;
while (il2Cpp.Position < sec.offsetEnd - il2Cpp.PointerSize)
{
var addr = il2Cpp.Position;
var metadataValue = il2Cpp.ReadUIntPtr();
var position = il2Cpp.Position;
if (metadataValue < uint.MaxValue)
{
var encodedToken = (uint)metadataValue;
var usage = metadata.GetEncodedIndexType(encodedToken);
if (usage > 0 && usage <= 6)
{
var decodedIndex = metadata.GetDecodedMethodIndex(encodedToken);
if (metadataValue == ((usage << 29) | (decodedIndex << 1)) + 1)
{
var va = il2Cpp.MapRTVA(addr);
if (va > 0)
{
switch ((Il2CppMetadataUsage)usage)
{
case Il2CppMetadataUsage.kIl2CppMetadataUsageMethodRef:
if (decodedIndex < il2Cpp.methodSpecs.Length)
{

var methodSpec = il2Cpp.methodSpecs[decodedIndex];
(var methodSpecTypeName, var methodSpecMethodName) = executor.GetMethodSpecName(methodSpec, true);

if (methodSpecTypeName == methodType && methodSpecMethodName == methodName)
{
return (int)il2Cpp.GetRVA(va);
};
}
break;
}
if (il2Cpp.Position != position)
{
il2Cpp.Position = position;
}
}
}
}
}
}
}
}

Expand All @@ -437,14 +477,54 @@ private int GetMethodAddress(Il2Cpp il2Cpp, Metadata metadata, Il2CppExecutor ex

private int GetTypeInfoAddress(Il2Cpp il2Cpp, Metadata metadata, Il2CppExecutor executor, string typeToFind)
{
foreach (var i in metadata.metadataUsageDic[Il2CppMetadataUsage.kIl2CppMetadataUsageTypeInfo])
if (il2Cpp.Version >= 27)
{
var type = il2Cpp.types[i.Value];
var typeName = executor.GetTypeName(type, true, false);

if (typeName.Contains(typeToFind))
var sectionHelper = executor.GetSectionHelper();
foreach (var sec in sectionHelper.data)
{
return (int)il2Cpp.GetRVA(il2Cpp.metadataUsages[i.Key]);
il2Cpp.Position = sec.offset;
while (il2Cpp.Position < sec.offsetEnd - il2Cpp.PointerSize)
{
var addr = il2Cpp.Position;
var metadataValue = il2Cpp.ReadUIntPtr();
var position = il2Cpp.Position;
if (metadataValue < uint.MaxValue)
{
var encodedToken = (uint)metadataValue;
var usage = metadata.GetEncodedIndexType(encodedToken);
if (usage > 0 && usage <= 6)
{
var decodedIndex = metadata.GetDecodedMethodIndex(encodedToken);
if (metadataValue == ((usage << 29) | (decodedIndex << 1)) + 1)
{
var va = il2Cpp.MapRTVA(addr);
if (va > 0)
{
switch ((Il2CppMetadataUsage)usage)
{
case Il2CppMetadataUsage.kIl2CppMetadataUsageTypeInfo:
if (decodedIndex < il2Cpp.types.Length)
{

var type = il2Cpp.types[decodedIndex];
var typeName = executor.GetTypeName(type, true, false);

if (typeName.Contains(typeToFind))
{
return (int)il2Cpp.GetRVA(va);
}
}
break;
}
if (il2Cpp.Position != position)
{
il2Cpp.Position = position;
}
}
}
}
}
}
}
}

Expand Down
6 changes: 3 additions & 3 deletions RaidExtractor.Core/datavalues.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"version": "\\251\\",
"version": "\\252\\",
"values": [
{
"name": "MemoryLocation",
"value": 59166136
"value": 56595272
},
{
"name": "ExternalStorageAddress",
"value": 59188544
"value": 55912136
},
{
"name": "AppModelUserWrapper",
Expand Down
4 changes: 2 additions & 2 deletions RaidExtractor/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.8.45.0")]
[assembly: AssemblyFileVersion("0.8.45.0")]
[assembly: AssemblyVersion("0.8.46.0")]
[assembly: AssemblyFileVersion("0.8.46.0")]

0 comments on commit 961d21f

Please sign in to comment.