mirror of
https://github.com/Perfare/Il2CppDumper.git
synced 2025-01-25 02:03:02 -03:00
添加v16,v20,v22的class
一些细节调整
This commit is contained in:
parent
02e1da4261
commit
fc926a6101
25 changed files with 1892 additions and 64 deletions
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper._64bit
|
||||
{
|
||||
public class Il2CppCodeRegistration
|
||||
|
@ -28,7 +28,7 @@ namespace Il2CppDumper._64bit
|
|||
public ulong guids; // Il2CppGuid
|
||||
}
|
||||
|
||||
class Il2CppMetadataRegistration
|
||||
public class Il2CppMetadataRegistration
|
||||
{
|
||||
public long genericClassesCount;
|
||||
public ulong genericClasses;
|
||||
|
|
|
@ -2,10 +2,10 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper._64bit
|
||||
{
|
||||
class MachoSection
|
||||
public class MachoSection
|
||||
{
|
||||
public string section_name;
|
||||
public ulong address;
|
||||
|
@ -14,7 +14,7 @@ namespace Il2CppDumper._64bit
|
|||
public ulong end;
|
||||
}
|
||||
|
||||
class Fat
|
||||
public class Fat
|
||||
{
|
||||
public ulong file_offset;
|
||||
public ulong size;
|
||||
|
|
|
@ -3,10 +3,10 @@ using System.Collections.Generic;
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper
|
||||
{
|
||||
class elf_header
|
||||
public class elf_header
|
||||
{
|
||||
// 0x7f followed by ELF in ascii
|
||||
public uint m_dwFormat;
|
||||
|
@ -54,7 +54,7 @@ namespace Il2CppDumper
|
|||
public ushort e_shtrndx;
|
||||
}
|
||||
|
||||
class program_header_table
|
||||
public class program_header_table
|
||||
{
|
||||
public uint p_type;
|
||||
public uint p_offset;
|
||||
|
@ -66,7 +66,7 @@ namespace Il2CppDumper
|
|||
public uint p_align;
|
||||
}
|
||||
|
||||
class elf_32_shdr
|
||||
public class elf_32_shdr
|
||||
{
|
||||
public uint sh_name;
|
||||
public uint sh_type;
|
||||
|
|
|
@ -14,6 +14,7 @@ namespace Il2CppDumper
|
|||
public uint[] customAttributeGenerators;
|
||||
private int[] fieldOffsets;
|
||||
public Il2CppType[] types;
|
||||
private bool isNew21;
|
||||
|
||||
public abstract bool Auto();
|
||||
public abstract uint MapVATR(uint uiAddr);
|
||||
|
@ -27,6 +28,8 @@ namespace Il2CppDumper
|
|||
methodPointers = MapVATR<uint>(pCodeRegistration.methodPointers, (int)pCodeRegistration.methodPointersCount);
|
||||
customAttributeGenerators = MapVATR<uint>(pCodeRegistration.customAttributeGenerators, pCodeRegistration.customAttributeCount);
|
||||
fieldOffsets = MapVATR<int>(pMetadataRegistration.fieldOffsets, pMetadataRegistration.fieldOffsetsCount);
|
||||
//TODO 在21版本中存在两种FieldOffset,通过对第一非0数值进行判断确认是指针还是int
|
||||
isNew21 = fieldOffsets.First(x => x > 0) > 1000;
|
||||
var ptypes = MapVATR<uint>(pMetadataRegistration.types, pMetadataRegistration.typesCount);
|
||||
types = new Il2CppType[pMetadataRegistration.typesCount];
|
||||
for (var i = 0; i < pMetadataRegistration.typesCount; ++i)
|
||||
|
@ -36,15 +39,19 @@ namespace Il2CppDumper
|
|||
}
|
||||
}
|
||||
|
||||
public int GetFieldOffsetFromIndex(int typeIndex, int fieldIndexInType)
|
||||
public int GetFieldOffsetFromIndex(int typeIndex, int fieldIndexInType, int fieldIndex)
|
||||
{
|
||||
var ptr = fieldOffsets[typeIndex];
|
||||
if (ptr >= 0)
|
||||
if (isNew21)
|
||||
{
|
||||
Position = MapVATR((uint)ptr) + 4 * fieldIndexInType;
|
||||
return ReadInt32();
|
||||
var ptr = fieldOffsets[typeIndex];
|
||||
if (ptr >= 0)
|
||||
{
|
||||
Position = MapVATR((uint)ptr) + 4 * fieldIndexInType;
|
||||
return ReadInt32();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
return fieldOffsets[fieldIndex];
|
||||
}
|
||||
|
||||
public T MapVATR<T>(uint uiAddr) where T : new()
|
||||
|
|
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper
|
||||
{
|
||||
public class Il2CppCodeRegistration
|
||||
|
@ -28,7 +28,7 @@ namespace Il2CppDumper
|
|||
public uint guids; // Il2CppGuid
|
||||
}
|
||||
|
||||
class Il2CppMetadataRegistration
|
||||
public class Il2CppMetadataRegistration
|
||||
{
|
||||
public int genericClassesCount;
|
||||
public uint genericClasses;
|
||||
|
|
|
@ -61,6 +61,17 @@
|
|||
<Compile Include="MyBinaryReader.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="v16\Dump.cs" />
|
||||
<Compile Include="v16\Elf.cs" />
|
||||
<Compile Include="v16\Il2Cpp.cs" />
|
||||
<Compile Include="v16\Il2CppClass.cs" />
|
||||
<Compile Include="v16\Macho.cs" />
|
||||
<Compile Include="v16\Metadata.cs" />
|
||||
<Compile Include="v16\MetadataClass.cs" />
|
||||
<Compile Include="v20\Il2CppClass.cs" />
|
||||
<Compile Include="v20\MetadataClass.cs" />
|
||||
<Compile Include="v22\Il2CppClass.cs" />
|
||||
<Compile Include="v22\MetadataClass.cs" />
|
||||
<Compile Include="v23\64bit\Dump.cs" />
|
||||
<Compile Include="v23\64bit\Il2Cpp.cs" />
|
||||
<Compile Include="v23\64bit\Il2CppClass.cs" />
|
||||
|
|
|
@ -33,15 +33,13 @@ namespace Il2CppDumper
|
|||
|
||||
public byte[] GetFirstMacho()
|
||||
{
|
||||
var fat = fats.First();
|
||||
Position = fat.file_offset;
|
||||
return ReadBytes((int)fat.size);
|
||||
Position = fats[0].file_offset;
|
||||
return ReadBytes((int)fats[0].size);
|
||||
}
|
||||
|
||||
public uint GetFirstMachoMagic()
|
||||
{
|
||||
var fat = fats.First();
|
||||
return fat.magic;
|
||||
return fats[0].magic;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,10 +2,10 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper
|
||||
{
|
||||
class Il2CppGlobalMetadataHeader
|
||||
public class Il2CppGlobalMetadataHeader
|
||||
{
|
||||
public uint sanity;
|
||||
public int version;
|
||||
|
@ -61,7 +61,7 @@ namespace Il2CppDumper
|
|||
public int metadataUsagePairsCount;
|
||||
public int fieldRefsOffset; // Il2CppFieldRef
|
||||
public int fieldRefsCount;
|
||||
public int referencedAssembliesOffset; // int
|
||||
public int referencedAssembliesOffset; // int32_t
|
||||
public int referencedAssembliesCount;
|
||||
public int attributesInfoOffset; // Il2CppCustomAttributeTypeRange
|
||||
public int attributesInfoCount;
|
||||
|
@ -69,7 +69,7 @@ namespace Il2CppDumper
|
|||
public int attributeTypesCount;
|
||||
}
|
||||
|
||||
class Il2CppImageDefinition
|
||||
public class Il2CppImageDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int assemblyIndex;
|
||||
|
|
|
@ -37,6 +37,9 @@ namespace Il2CppDumper
|
|||
{
|
||||
default:
|
||||
throw new Exception($"ERROR: Metadata file supplied is not a supported version[{metadataversion}].");
|
||||
case 16:
|
||||
v16.Dump.Dumpv16(il2cppfile, metadatafile);
|
||||
break;
|
||||
case 23:
|
||||
v23.Dump.Dumpv23(il2cppfile, metadatafile);
|
||||
break;
|
||||
|
@ -54,7 +57,7 @@ namespace Il2CppDumper
|
|||
goto case 0xFEEDFACE;
|
||||
case 0xCAFEBABE:
|
||||
case 0xBEBAFECA:
|
||||
Console.Write("WARNING: fat macho will only dump the first object file.");
|
||||
Console.WriteLine("WARNING: fat macho will only dump the first object file.");
|
||||
var fat = new MachoFat(new MemoryStream(il2cppfile));
|
||||
il2cppfile = fat.GetFirstMacho();
|
||||
var magic = fat.GetFirstMachoMagic();
|
||||
|
@ -225,7 +228,7 @@ namespace Il2CppDumper
|
|||
}
|
||||
}
|
||||
writer.Write("; // 0x{0:x}\n",
|
||||
il2cpp.GetFieldOffsetFromIndex(idx, i - typeDef.fieldStart));
|
||||
il2cpp.GetFieldOffsetFromIndex(idx, i - typeDef.fieldStart, i));
|
||||
}
|
||||
writer.Write("\n");
|
||||
}
|
||||
|
|
381
Il2CppDumper/v16/Dump.cs
Normal file
381
Il2CppDumper/v16/Dump.cs
Normal file
|
@ -0,0 +1,381 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using static Il2CppDumper.DefineConstants;
|
||||
|
||||
namespace Il2CppDumper.v16
|
||||
{
|
||||
class Dump
|
||||
{
|
||||
static Metadata metadata;
|
||||
static Il2Cpp il2cpp;
|
||||
|
||||
public static void Dumpv16(byte[] il2cppfile, byte[] metadatafile)
|
||||
{
|
||||
//判断il2cpp的magic
|
||||
var il2cppmagic = BitConverter.ToUInt32(il2cppfile, 0);
|
||||
var isElf = false;
|
||||
switch (il2cppmagic)
|
||||
{
|
||||
default:
|
||||
throw new Exception("ERROR: il2cpp file not supported.");
|
||||
case 0x464c457f:
|
||||
isElf = true;
|
||||
goto case 0xFEEDFACE;
|
||||
case 0xCAFEBABE:
|
||||
case 0xBEBAFECA:
|
||||
Console.WriteLine("WARNING: fat macho will only dump the first object file.");
|
||||
var fat = new MachoFat(new MemoryStream(il2cppfile));
|
||||
il2cppfile = fat.GetFirstMacho();
|
||||
var magic = fat.GetFirstMachoMagic();
|
||||
if (magic == 0xFEEDFACF) // 64-bit mach object file
|
||||
goto case 0xFEEDFACF;
|
||||
else
|
||||
goto case 0xFEEDFACE;
|
||||
case 0xFEEDFACF: // 64-bit mach object file
|
||||
_64bit.Dump.Dump64bit(il2cppfile, metadatafile);
|
||||
break;
|
||||
case 0xFEEDFACE: // 32-bit mach object file
|
||||
Console.WriteLine("Select Mode: 1. Manual 2.Auto");
|
||||
var key = Console.ReadKey(true);
|
||||
if (key.KeyChar == '2')
|
||||
{
|
||||
metadata = new Metadata(new MemoryStream(metadatafile));
|
||||
if (isElf)
|
||||
il2cpp = new Elf(new MemoryStream(il2cppfile));
|
||||
else
|
||||
il2cpp = new Macho(new MemoryStream(il2cppfile));
|
||||
if (!il2cpp.Auto())
|
||||
{
|
||||
throw new Exception(
|
||||
"ERROR: Unable to process file automatically, try to use manual mode.");
|
||||
}
|
||||
}
|
||||
else if (key.KeyChar == '1')
|
||||
{
|
||||
Console.Write("Input CodeRegistration(R0): ");
|
||||
var codeRegistration = Convert.ToUInt32(Console.ReadLine(), 16);
|
||||
Console.Write("Input MetadataRegistration(R1): ");
|
||||
var metadataRegistration = Convert.ToUInt32(Console.ReadLine(), 16);
|
||||
metadata = new Metadata(new MemoryStream(metadatafile));
|
||||
if (isElf)
|
||||
il2cpp = new Elf(new MemoryStream(il2cppfile), codeRegistration,
|
||||
metadataRegistration);
|
||||
else
|
||||
il2cpp = new Macho(new MemoryStream(il2cppfile), codeRegistration,
|
||||
metadataRegistration);
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
var writer = new StreamWriter(new FileStream("dump.cs", FileMode.Create));
|
||||
Console.WriteLine("Dumping...");
|
||||
//dump_image();
|
||||
for (var imageIndex = 0; imageIndex < metadata.uiImageCount; imageIndex++)
|
||||
{
|
||||
var imageDef = metadata.imageDefs[imageIndex];
|
||||
writer.Write(
|
||||
$"// Image {imageIndex}: {metadata.GetString(imageDef.nameIndex)} - {imageDef.typeStart}\n");
|
||||
}
|
||||
for (var idx = 0; idx < metadata.uiNumTypes; ++idx)
|
||||
{
|
||||
try
|
||||
{
|
||||
//dump_class(i);
|
||||
var typeDef = metadata.typeDefs[idx];
|
||||
writer.Write($"\n// Namespace: {metadata.GetString(typeDef.namespaceIndex)}\n");
|
||||
if ((typeDef.flags & TYPE_ATTRIBUTE_SERIALIZABLE) != 0)
|
||||
writer.Write("[Serializable]\n");
|
||||
if ((typeDef.flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) == TYPE_ATTRIBUTE_PUBLIC)
|
||||
writer.Write("public ");
|
||||
else if ((typeDef.flags & TYPE_ATTRIBUTE_VISIBILITY_MASK) ==
|
||||
TYPE_ATTRIBUTE_NOT_PUBLIC)
|
||||
writer.Write("internal ");
|
||||
if ((typeDef.flags & TYPE_ATTRIBUTE_ABSTRACT) != 0)
|
||||
writer.Write("abstract ");
|
||||
if ((typeDef.flags & TYPE_ATTRIBUTE_SEALED) != 0)
|
||||
writer.Write("sealed ");
|
||||
if ((typeDef.flags & TYPE_ATTRIBUTE_INTERFACE) != 0)
|
||||
writer.Write("interface ");
|
||||
else
|
||||
writer.Write("class ");
|
||||
writer.Write($"{metadata.GetString(typeDef.nameIndex)}");
|
||||
if (typeDef.parentIndex >= 0)
|
||||
{
|
||||
var parent = il2cpp.types[typeDef.parentIndex];
|
||||
var parentname = get_type_name(parent);
|
||||
if (parentname != "object")
|
||||
writer.Write($" : {parentname}");
|
||||
}
|
||||
writer.Write($" // TypeDefIndex: {idx}\n{{\n");
|
||||
if (typeDef.field_count > 0)
|
||||
{
|
||||
writer.Write("\t// Fields\n");
|
||||
var fieldEnd = typeDef.fieldStart + typeDef.field_count;
|
||||
for (var i = typeDef.fieldStart; i < fieldEnd; ++i)
|
||||
{
|
||||
//dump_field(i, idx, i - typeDef.fieldStart);
|
||||
var pField = metadata.fieldDefs[i];
|
||||
var pType = il2cpp.types[pField.typeIndex];
|
||||
var pDefault = metadata.GetFieldDefaultFromIndex(i);
|
||||
writer.Write("\t");
|
||||
if ((pType.attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) ==
|
||||
FIELD_ATTRIBUTE_PRIVATE)
|
||||
writer.Write("private ");
|
||||
else if ((pType.attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) ==
|
||||
FIELD_ATTRIBUTE_PUBLIC)
|
||||
writer.Write("public ");
|
||||
else if ((pType.attrs & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK) ==
|
||||
FIELD_ATTRIBUTE_FAMILY)
|
||||
writer.Write("protected ");
|
||||
if ((pType.attrs & FIELD_ATTRIBUTE_STATIC) != 0)
|
||||
writer.Write("static ");
|
||||
if ((pType.attrs & FIELD_ATTRIBUTE_INIT_ONLY) != 0)
|
||||
writer.Write("readonly ");
|
||||
writer.Write(
|
||||
$"{get_type_name(pType)} {metadata.GetString(pField.nameIndex)}");
|
||||
if (pDefault != null && pDefault.dataIndex != -1)
|
||||
{
|
||||
var pointer = metadata.GetDefaultValueFromIndex(pDefault.dataIndex);
|
||||
if (pointer > 0)
|
||||
{
|
||||
var pTypeToUse = il2cpp.types[pDefault.typeIndex];
|
||||
metadata.Position = pointer;
|
||||
object multi = null;
|
||||
switch (pTypeToUse.type)
|
||||
{
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_BOOLEAN:
|
||||
multi = metadata.ReadBoolean();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_U1:
|
||||
multi = metadata.ReadByte();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_I1:
|
||||
multi = metadata.ReadSByte();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_CHAR:
|
||||
multi = metadata.ReadChar();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_U2:
|
||||
multi = metadata.ReadUInt16();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_I2:
|
||||
multi = metadata.ReadInt16();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_U4:
|
||||
multi = metadata.ReadUInt32();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_I4:
|
||||
multi = metadata.ReadInt32();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_U8:
|
||||
multi = metadata.ReadUInt64();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_I8:
|
||||
multi = metadata.ReadInt64();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_R4:
|
||||
multi = metadata.ReadSingle();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_R8:
|
||||
multi = metadata.ReadDouble();
|
||||
break;
|
||||
case Il2CppTypeEnum.IL2CPP_TYPE_STRING:
|
||||
var uiLen = metadata.ReadInt32();
|
||||
multi = Encoding.UTF8.GetString(metadata.ReadBytes(uiLen));
|
||||
break;
|
||||
}
|
||||
if (multi is string)
|
||||
writer.Write($" = \"{multi}\"");
|
||||
else if (multi != null)
|
||||
writer.Write($" = {multi}");
|
||||
}
|
||||
}
|
||||
writer.Write("; // 0x{0:x}\n", il2cpp.GetFieldOffsetFromIndex(i));
|
||||
}
|
||||
writer.Write("\n");
|
||||
}
|
||||
if (typeDef.property_count > 0)
|
||||
{
|
||||
//dump_property(i);
|
||||
writer.Write("\t// Properties\n");
|
||||
var propertyEnd = typeDef.propertyStart + typeDef.property_count;
|
||||
for (var i = typeDef.propertyStart; i < propertyEnd; ++i)
|
||||
{
|
||||
var propertydef = metadata.propertyDefs[i];
|
||||
writer.Write("\t");
|
||||
if (propertydef.get >= 0)
|
||||
{
|
||||
var methodDef =
|
||||
metadata.methodDefs[typeDef.methodStart + propertydef.get];
|
||||
var pReturnType = il2cpp.types[methodDef.returnType];
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_PRIVATE)
|
||||
writer.Write("private ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_PUBLIC)
|
||||
writer.Write("public ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_FAMILY)
|
||||
writer.Write("protected ");
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_ABSTRACT) != 0)
|
||||
writer.Write("abstract ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_VIRTUAL) != 0)
|
||||
writer.Write("virtual ");
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_STATIC) != 0)
|
||||
writer.Write("static ");
|
||||
writer.Write(
|
||||
$"{get_type_name(pReturnType)} {metadata.GetString(propertydef.nameIndex)} {{ ");
|
||||
}
|
||||
else if (propertydef.set > 0)
|
||||
{
|
||||
var methodDef =
|
||||
metadata.methodDefs[typeDef.methodStart + propertydef.set];
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_PRIVATE)
|
||||
writer.Write("private ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_PUBLIC)
|
||||
writer.Write("public ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_FAMILY)
|
||||
writer.Write("protected ");
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_ABSTRACT) != 0)
|
||||
writer.Write("abstract ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_VIRTUAL) != 0)
|
||||
writer.Write("virtual ");
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_STATIC) != 0)
|
||||
writer.Write("static ");
|
||||
var pParam = metadata.parameterDefs[methodDef.parameterStart];
|
||||
var pType = il2cpp.types[pParam.typeIndex];
|
||||
writer.Write(
|
||||
$"{get_type_name(pType)} {metadata.GetString(propertydef.nameIndex)} {{ ");
|
||||
}
|
||||
if (propertydef.get >= 0)
|
||||
writer.Write("get; ");
|
||||
if (propertydef.set >= 0)
|
||||
writer.Write("set; ");
|
||||
writer.Write("}");
|
||||
writer.Write("\n");
|
||||
}
|
||||
writer.Write("\n");
|
||||
}
|
||||
if (typeDef.method_count > 0)
|
||||
{
|
||||
writer.Write("\t// Methods\n");
|
||||
var methodEnd = typeDef.methodStart + typeDef.method_count;
|
||||
for (var i = typeDef.methodStart; i < methodEnd; ++i)
|
||||
{
|
||||
//dump_method(i);
|
||||
var methodDef = metadata.methodDefs[i];
|
||||
writer.Write("\t");
|
||||
var pReturnType = il2cpp.types[methodDef.returnType];
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_PRIVATE)
|
||||
writer.Write("private ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_PUBLIC)
|
||||
writer.Write("public ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) ==
|
||||
METHOD_ATTRIBUTE_FAMILY)
|
||||
writer.Write("protected ");
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_ABSTRACT) != 0)
|
||||
writer.Write("abstract ");
|
||||
else if ((methodDef.flags & METHOD_ATTRIBUTE_VIRTUAL) != 0)
|
||||
writer.Write("virtual ");
|
||||
if ((methodDef.flags & METHOD_ATTRIBUTE_STATIC) != 0)
|
||||
writer.Write("static ");
|
||||
writer.Write(
|
||||
$"{get_type_name(pReturnType)} {metadata.GetString(methodDef.nameIndex)}(");
|
||||
for (var j = 0; j < methodDef.parameterCount; ++j)
|
||||
{
|
||||
var pParam = metadata.parameterDefs[methodDef.parameterStart + j];
|
||||
var szParamName = metadata.GetString(pParam.nameIndex);
|
||||
var pType = il2cpp.types[pParam.typeIndex];
|
||||
var szTypeName = get_type_name(pType);
|
||||
if ((pType.attrs & PARAM_ATTRIBUTE_OPTIONAL) != 0)
|
||||
writer.Write("optional ");
|
||||
if ((pType.attrs & PARAM_ATTRIBUTE_OUT) != 0)
|
||||
writer.Write("out ");
|
||||
if (j != methodDef.parameterCount - 1)
|
||||
{
|
||||
writer.Write($"{szTypeName} {szParamName}, ");
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write($"{szTypeName} {szParamName}");
|
||||
}
|
||||
}
|
||||
if (methodDef.methodIndex >= 0)
|
||||
writer.Write("); // {0:x}\n",
|
||||
il2cpp.methodPointers[methodDef.methodIndex]);
|
||||
else
|
||||
writer.Write("); // 0\n");
|
||||
}
|
||||
}
|
||||
writer.Write("}\n");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine("ERROR: Some errors in dumping");
|
||||
writer.Write("/*");
|
||||
writer.Write($"{e.Message}\n{e.StackTrace}\n");
|
||||
writer.Write("*/\n}\n");
|
||||
}
|
||||
}
|
||||
writer.Close();
|
||||
Console.WriteLine("Done !");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static string get_type_name(Il2CppType pType)
|
||||
{
|
||||
string ret;
|
||||
if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_CLASS || pType.type == Il2CppTypeEnum.IL2CPP_TYPE_VALUETYPE)
|
||||
{
|
||||
var klass = metadata.typeDefs[pType.data.klassIndex];
|
||||
ret = metadata.GetString(klass.nameIndex);
|
||||
}
|
||||
else if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST)
|
||||
{
|
||||
var generic_class = il2cpp.MapVATR<Il2CppGenericClass>(pType.data.generic_class);
|
||||
var pMainDef = metadata.typeDefs[generic_class.typeDefinitionIndex];
|
||||
ret = metadata.GetString(pMainDef.nameIndex);
|
||||
var typeNames = new List<string>();
|
||||
var pInst = il2cpp.MapVATR<Il2CppGenericInst>(generic_class.context.class_inst);
|
||||
var pointers = il2cpp.MapVATR<uint>(pInst.type_argv, (int)pInst.type_argc);
|
||||
for (var i = 0; i < pInst.type_argc; ++i)
|
||||
{
|
||||
var pOriType = il2cpp.MapVATR<Il2CppType>(pointers[i]);
|
||||
pOriType.Init();
|
||||
typeNames.Add(get_type_name(pOriType));
|
||||
}
|
||||
ret += $"<{string.Join(", ", typeNames)}>";
|
||||
}
|
||||
else if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_ARRAY)
|
||||
{
|
||||
var arrayType = il2cpp.MapVATR<Il2CppArrayType>(pType.data.array);
|
||||
var type = il2cpp.MapVATR<Il2CppType>(arrayType.etype);
|
||||
type.Init();
|
||||
ret = $"{get_type_name(type)}[]";
|
||||
}
|
||||
else if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_SZARRAY)
|
||||
{
|
||||
var type = il2cpp.MapVATR<Il2CppType>(pType.data.type);
|
||||
type.Init();
|
||||
ret = $"{get_type_name(type)}[]";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((int)pType.type >= szTypeString.Length)
|
||||
ret = "unknow";
|
||||
else
|
||||
ret = szTypeString[(int)pType.type];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
153
Il2CppDumper/v16/Elf.cs
Normal file
153
Il2CppDumper/v16/Elf.cs
Normal file
|
@ -0,0 +1,153 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppDumper.v16
|
||||
{
|
||||
class Elf : Il2Cpp
|
||||
{
|
||||
private elf_header elf_header;
|
||||
private program_header_table[] program_table_element;
|
||||
private static byte[] ARMFeatureBytes = { 0x1c, 0x0, 0x9f, 0xe5, 0x1c, 0x10, 0x9f, 0xe5, 0x1c, 0x20, 0x9f, 0xe5 };
|
||||
private static byte[] X86FeatureBytes = { 0x55, 0x89, 0xE5, 0x53, 0x83, 0xE4, 0xF0, 0x83, 0xEC, 0x20, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x5B };
|
||||
|
||||
|
||||
public Elf(Stream stream) : base(stream)
|
||||
{
|
||||
elf_header = new elf_header();
|
||||
elf_header.m_dwFormat = ReadUInt32();
|
||||
elf_header.m_arch = ReadByte();
|
||||
if (elf_header.m_arch == 2)//64
|
||||
{
|
||||
throw new Exception("ERROR: 64 bit not supported.");
|
||||
}
|
||||
elf_header.m_endian = ReadByte();
|
||||
elf_header.m_version = ReadByte();
|
||||
elf_header.m_osabi = ReadByte();
|
||||
elf_header.m_osabi_ver = ReadByte();
|
||||
elf_header.e_pad = ReadBytes(7);
|
||||
elf_header.e_type = ReadUInt16();
|
||||
elf_header.e_machine = ReadUInt16();
|
||||
elf_header.e_version = ReadUInt32();
|
||||
elf_header.e_entry = ReadUInt32();
|
||||
elf_header.e_phoff = ReadUInt32();
|
||||
elf_header.e_shoff = ReadUInt32();
|
||||
elf_header.e_flags = ReadUInt32();
|
||||
elf_header.e_ehsize = ReadUInt16();
|
||||
elf_header.e_phentsize = ReadUInt16();
|
||||
elf_header.e_phnum = ReadUInt16();
|
||||
elf_header.e_shentsize = ReadUInt16();
|
||||
elf_header.e_shnum = ReadUInt16();
|
||||
elf_header.e_shtrndx = ReadUInt16();
|
||||
program_table_element = ReadClassArray<program_header_table>(elf_header.e_phoff, elf_header.e_phnum);
|
||||
}
|
||||
|
||||
public Elf(Stream stream, uint codeRegistration, uint metadataRegistration) : this(stream)
|
||||
{
|
||||
Init(codeRegistration, metadataRegistration);
|
||||
}
|
||||
|
||||
public override uint MapVATR(uint uiAddr)
|
||||
{
|
||||
var program_header_table = program_table_element.First(x => uiAddr >= x.p_vaddr && uiAddr <= (x.p_vaddr + x.p_memsz));
|
||||
return uiAddr - (program_header_table.p_vaddr - program_header_table.p_offset);
|
||||
}
|
||||
|
||||
//TODO 需要验证
|
||||
public override bool Auto()
|
||||
{
|
||||
throw new NotSupportedException("Auto no supported");
|
||||
/*//取.dynamic
|
||||
var dynamic = new elf_32_shdr();
|
||||
var PT_DYNAMIC = program_table_element.First(x => x.p_type == 2u);
|
||||
dynamic.sh_offset = PT_DYNAMIC.p_offset;
|
||||
dynamic.sh_size = PT_DYNAMIC.p_filesz;
|
||||
//从.dynamic获取_GLOBAL_OFFSET_TABLE_和.init_array
|
||||
uint _GLOBAL_OFFSET_TABLE_ = 0;
|
||||
var init_array = new elf_32_shdr();
|
||||
Position = dynamic.sh_offset;
|
||||
var dynamicend = dynamic.sh_offset + dynamic.sh_size;
|
||||
while (Position < dynamicend)
|
||||
{
|
||||
var tag = ReadInt32();
|
||||
if (tag == 3)//DT_PLTGOT
|
||||
{
|
||||
_GLOBAL_OFFSET_TABLE_ = ReadUInt32();
|
||||
}
|
||||
else if (tag == 25)//DT_INIT_ARRAY
|
||||
{
|
||||
init_array.sh_offset = MapVATR(ReadUInt32());
|
||||
}
|
||||
else if (tag == 27)//DT_INIT_ARRAYSZ
|
||||
{
|
||||
init_array.sh_size = ReadUInt32();
|
||||
}
|
||||
else
|
||||
{
|
||||
Position += 4;//skip
|
||||
}
|
||||
}
|
||||
if (_GLOBAL_OFFSET_TABLE_ != 0)
|
||||
{
|
||||
//从.init_array获取函数
|
||||
var addrs = ReadClassArray<uint>(init_array.sh_offset, (int)init_array.sh_size / 4);
|
||||
foreach (var i in addrs)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
Position = i;
|
||||
if (elf_header.e_machine == 0x28)
|
||||
{
|
||||
var buff = ReadBytes(12);
|
||||
if (ARMFeatureBytes.SequenceEqual(buff))
|
||||
{
|
||||
Position = i + 0x2c;
|
||||
var subaddr = ReadUInt32() + _GLOBAL_OFFSET_TABLE_;
|
||||
Position = subaddr + 0x28;
|
||||
var codeRegistration = ReadUInt32() + _GLOBAL_OFFSET_TABLE_;
|
||||
Console.WriteLine("CodeRegistration : {0:x}", codeRegistration);
|
||||
Position = subaddr + 0x2C;
|
||||
var ptr = ReadUInt32() + _GLOBAL_OFFSET_TABLE_;
|
||||
Position = MapVATR(ptr);
|
||||
var metadataRegistration = ReadUInt32();
|
||||
Console.WriteLine("MetadataRegistration : {0:x}", metadataRegistration);
|
||||
Init(codeRegistration, metadataRegistration);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (elf_header.e_machine == 0x3)
|
||||
{
|
||||
var buff = ReadBytes(16);
|
||||
if (X86FeatureBytes.SequenceEqual(buff))
|
||||
{
|
||||
Position = i + 0x18;
|
||||
var subaddr = ReadUInt32() + _GLOBAL_OFFSET_TABLE_;
|
||||
Position = subaddr + 0x2C;
|
||||
var codeRegistration = ReadUInt32() + _GLOBAL_OFFSET_TABLE_;
|
||||
Console.WriteLine("CodeRegistration : {0:x}", codeRegistration);
|
||||
Position = subaddr + 0x22;
|
||||
var ptr = ReadUInt32() + _GLOBAL_OFFSET_TABLE_;
|
||||
Position = MapVATR(ptr);
|
||||
var metadataRegistration = ReadUInt32();
|
||||
Console.WriteLine("MetadataRegistration : {0:x}", metadataRegistration);
|
||||
Init(codeRegistration, metadataRegistration);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("ERROR: Automatic processing does not support this ELF file.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("ERROR: Unable to get GOT form PT_DYNAMIC.");
|
||||
}
|
||||
return false;*/
|
||||
}
|
||||
}
|
||||
}
|
48
Il2CppDumper/v16/Il2Cpp.cs
Normal file
48
Il2CppDumper/v16/Il2Cpp.cs
Normal file
|
@ -0,0 +1,48 @@
|
|||
using System.IO;
|
||||
|
||||
namespace Il2CppDumper.v16
|
||||
{
|
||||
abstract class Il2Cpp : MyBinaryReader
|
||||
{
|
||||
private Il2CppMetadataRegistration pMetadataRegistration;
|
||||
private Il2CppCodeRegistration pCodeRegistration;
|
||||
public uint[] methodPointers;
|
||||
private int[] fieldOffsets;
|
||||
public Il2CppType[] types;
|
||||
|
||||
public abstract bool Auto();
|
||||
public abstract uint MapVATR(uint uiAddr);
|
||||
|
||||
protected Il2Cpp(Stream stream) : base(stream) { }
|
||||
|
||||
protected void Init(uint codeRegistration, uint metadataRegistration)
|
||||
{
|
||||
pCodeRegistration = MapVATR<Il2CppCodeRegistration>(codeRegistration);
|
||||
pMetadataRegistration = MapVATR<Il2CppMetadataRegistration>(metadataRegistration);
|
||||
methodPointers = MapVATR<uint>(pCodeRegistration.methodPointers, (int)pCodeRegistration.methodPointersCount);
|
||||
fieldOffsets = MapVATR<int>(pMetadataRegistration.fieldOffsets, pMetadataRegistration.fieldOffsetsCount);
|
||||
var ptypes = MapVATR<uint>(pMetadataRegistration.types, pMetadataRegistration.typesCount);
|
||||
types = new Il2CppType[pMetadataRegistration.typesCount];
|
||||
for (var i = 0; i < pMetadataRegistration.typesCount; ++i)
|
||||
{
|
||||
types[i] = MapVATR<Il2CppType>(ptypes[i]);
|
||||
types[i].Init();
|
||||
}
|
||||
}
|
||||
|
||||
public int GetFieldOffsetFromIndex(int fieldIndex)
|
||||
{
|
||||
return fieldOffsets[fieldIndex];
|
||||
}
|
||||
|
||||
public T MapVATR<T>(uint uiAddr) where T : new()
|
||||
{
|
||||
return ReadClass<T>(MapVATR(uiAddr));
|
||||
}
|
||||
|
||||
public T[] MapVATR<T>(uint uiAddr, int count) where T : new()
|
||||
{
|
||||
return ReadClassArray<T>(MapVATR(uiAddr), count);
|
||||
}
|
||||
}
|
||||
}
|
161
Il2CppDumper/v16/Il2CppClass.cs
Normal file
161
Il2CppDumper/v16/Il2CppClass.cs
Normal file
|
@ -0,0 +1,161 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppDumper.v16
|
||||
{
|
||||
public class Il2CppCodeRegistration
|
||||
{
|
||||
public uint methodPointersCount;
|
||||
public uint methodPointers;
|
||||
public uint delegateWrappersFromNativeToManagedCount;
|
||||
public uint delegateWrappersFromNativeToManaged; // note the double indirection to handle different calling conventions
|
||||
public uint delegateWrappersFromManagedToNativeCount;
|
||||
public uint delegateWrappersFromManagedToNative;
|
||||
public uint marshalingFunctionsCount;
|
||||
public uint marshalingFunctions;
|
||||
public uint genericMethodPointersCount;
|
||||
public uint genericMethodPointers;
|
||||
public uint invokerPointersCount;
|
||||
public uint invokerPointers;
|
||||
public int customAttributeCount;
|
||||
public uint customAttributeGenerators;
|
||||
}
|
||||
|
||||
public class Il2CppMetadataRegistration
|
||||
{
|
||||
public int genericClassesCount;
|
||||
public uint genericClasses;
|
||||
public int genericInstsCount;
|
||||
public uint genericInsts;
|
||||
public int genericMethodTableCount;
|
||||
public uint genericMethodTable;
|
||||
public int typesCount;
|
||||
public uint types;
|
||||
public int methodSpecsCount;
|
||||
public uint methodSpecs;
|
||||
public int methodReferencesCount;
|
||||
public uint methodReferences;
|
||||
|
||||
public int fieldOffsetsCount;
|
||||
public uint fieldOffsets;
|
||||
|
||||
public int typeDefinitionsSizesCount;
|
||||
public uint typeDefinitionsSizes;
|
||||
}
|
||||
|
||||
public enum Il2CppTypeEnum
|
||||
{
|
||||
IL2CPP_TYPE_END = 0x00, /* End of List */
|
||||
IL2CPP_TYPE_VOID = 0x01,
|
||||
IL2CPP_TYPE_BOOLEAN = 0x02,
|
||||
IL2CPP_TYPE_CHAR = 0x03,
|
||||
IL2CPP_TYPE_I1 = 0x04,
|
||||
IL2CPP_TYPE_U1 = 0x05,
|
||||
IL2CPP_TYPE_I2 = 0x06,
|
||||
IL2CPP_TYPE_U2 = 0x07,
|
||||
IL2CPP_TYPE_I4 = 0x08,
|
||||
IL2CPP_TYPE_U4 = 0x09,
|
||||
IL2CPP_TYPE_I8 = 0x0a,
|
||||
IL2CPP_TYPE_U8 = 0x0b,
|
||||
IL2CPP_TYPE_R4 = 0x0c,
|
||||
IL2CPP_TYPE_R8 = 0x0d,
|
||||
IL2CPP_TYPE_STRING = 0x0e,
|
||||
IL2CPP_TYPE_PTR = 0x0f, /* arg: <type> token */
|
||||
IL2CPP_TYPE_BYREF = 0x10, /* arg: <type> token */
|
||||
IL2CPP_TYPE_VALUETYPE = 0x11, /* arg: <type> token */
|
||||
IL2CPP_TYPE_CLASS = 0x12, /* arg: <type> token */
|
||||
IL2CPP_TYPE_VAR = 0x13, /* Generic parameter in a generic type definition, represented as number (compressed unsigned integer) number */
|
||||
IL2CPP_TYPE_ARRAY = 0x14, /* type, rank, boundsCount, bound1, loCount, lo1 */
|
||||
IL2CPP_TYPE_GENERICINST = 0x15, /* <type> <type-arg-count> <type-1> \x{2026} <type-n> */
|
||||
IL2CPP_TYPE_TYPEDBYREF = 0x16,
|
||||
IL2CPP_TYPE_I = 0x18,
|
||||
IL2CPP_TYPE_U = 0x19,
|
||||
IL2CPP_TYPE_FNPTR = 0x1b, /* arg: full method signature */
|
||||
IL2CPP_TYPE_OBJECT = 0x1c,
|
||||
IL2CPP_TYPE_SZARRAY = 0x1d, /* 0-based one-dim-array */
|
||||
IL2CPP_TYPE_MVAR = 0x1e, /* Generic parameter in a generic method definition, represented as number (compressed unsigned integer) */
|
||||
IL2CPP_TYPE_CMOD_REQD = 0x1f, /* arg: typedef or typeref token */
|
||||
IL2CPP_TYPE_CMOD_OPT = 0x20, /* optional arg: typedef or typref token */
|
||||
IL2CPP_TYPE_INTERNAL = 0x21, /* CLR internal type */
|
||||
|
||||
IL2CPP_TYPE_MODIFIER = 0x40, /* Or with the following types */
|
||||
IL2CPP_TYPE_SENTINEL = 0x41, /* Sentinel for varargs method signature */
|
||||
IL2CPP_TYPE_PINNED = 0x45, /* Local var that points to pinned object */
|
||||
|
||||
IL2CPP_TYPE_ENUM = 0x55 /* an enumeration */
|
||||
}
|
||||
|
||||
public class Il2CppType
|
||||
{
|
||||
public uint datapoint;
|
||||
public Anonymous data { get; set; }
|
||||
public uint bits;
|
||||
public uint attrs { get; set; }
|
||||
public Il2CppTypeEnum type { get; set; }
|
||||
public uint num_mods { get; set; }
|
||||
public uint byref { get; set; }
|
||||
public uint pinned { get; set; }
|
||||
|
||||
public void Init()
|
||||
{
|
||||
var str = Convert.ToString(bits, 2);
|
||||
if (str.Length != 32)
|
||||
{
|
||||
str = new string(Enumerable.Repeat('0', 32 - str.Length).Concat(str.ToCharArray()).ToArray());
|
||||
}
|
||||
attrs = Convert.ToUInt32(str.Substring(16, 16), 2);
|
||||
type = (Il2CppTypeEnum)Convert.ToInt32(str.Substring(8, 8), 2);
|
||||
num_mods = Convert.ToUInt32(str.Substring(2, 6), 2);
|
||||
byref = Convert.ToUInt32(str.Substring(1, 1), 2);
|
||||
pinned = Convert.ToUInt32(str.Substring(0, 1), 2);
|
||||
data = new Anonymous() { dummy = datapoint };
|
||||
}
|
||||
|
||||
public class Anonymous
|
||||
{
|
||||
public uint dummy;
|
||||
public int klassIndex => (int)dummy;
|
||||
|
||||
public uint type => dummy;
|
||||
public uint array => dummy;
|
||||
|
||||
public int genericParameterIndex => (int)dummy;
|
||||
public uint generic_class => dummy;
|
||||
}
|
||||
}
|
||||
|
||||
public class Il2CppGenericClass
|
||||
{
|
||||
public int typeDefinitionIndex; /* the generic type definition */
|
||||
public Il2CppGenericContext context; /* a context that contains the type instantiation doesn't contain any method instantiation */
|
||||
public uint cached_class; /* if present, the Il2CppClass corresponding to the instantiation. */
|
||||
}
|
||||
|
||||
public class Il2CppGenericContext
|
||||
{
|
||||
/* The instantiation corresponding to the class generic parameters */
|
||||
public uint class_inst;
|
||||
/* The instantiation corresponding to the method generic parameters */
|
||||
public uint method_inst;
|
||||
}
|
||||
|
||||
|
||||
public class Il2CppGenericInst
|
||||
{
|
||||
public uint type_argc;
|
||||
public uint type_argv;
|
||||
}
|
||||
|
||||
public class Il2CppArrayType
|
||||
{
|
||||
public uint etype;
|
||||
public byte rank;
|
||||
public byte numsizes;
|
||||
public byte numlobounds;
|
||||
public uint sizes;
|
||||
public uint lobounds;
|
||||
}
|
||||
}
|
104
Il2CppDumper/v16/Macho.cs
Normal file
104
Il2CppDumper/v16/Macho.cs
Normal file
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using static Il2CppDumper.ArmHelper;
|
||||
|
||||
namespace Il2CppDumper.v16
|
||||
{
|
||||
class Macho : Il2Cpp
|
||||
{
|
||||
private List<MachoSection> sections = new List<MachoSection>();
|
||||
private static byte[] FeatureBytes1 = { 0x0, 0x22 };//MOVS R2, #0
|
||||
private static byte[] FeatureBytes2 = { 0x78, 0x44, 0x79, 0x44 };//ADD R0, PC and ADD R1, PC
|
||||
|
||||
|
||||
public Macho(Stream stream) : base(stream)
|
||||
{
|
||||
Position += 16;//skip
|
||||
var ncmds = ReadUInt32();
|
||||
Position += 8;//skip
|
||||
for (var i = 0; i < ncmds; i++)
|
||||
{
|
||||
var offset = Position;
|
||||
var loadCommandType = ReadUInt32();
|
||||
var command_size = ReadUInt32();
|
||||
if (loadCommandType == 1) //SEGMENT
|
||||
{
|
||||
var segment_name = Encoding.UTF8.GetString(ReadBytes(16)).TrimEnd('\0');
|
||||
if (segment_name == "__TEXT" || segment_name == "__DATA")
|
||||
{
|
||||
Position += 24;//skip
|
||||
var number_of_sections = ReadUInt32();
|
||||
Position += 4;//skip
|
||||
for (var j = 0; j < number_of_sections; j++)
|
||||
{
|
||||
var section_name = Encoding.UTF8.GetString(ReadBytes(16)).TrimEnd('\0');
|
||||
Position += 16;
|
||||
var address = ReadUInt32();
|
||||
var size = ReadUInt32();
|
||||
var offset2 = ReadUInt32();
|
||||
var end = address + size;
|
||||
sections.Add(new MachoSection() { section_name = section_name, address = address, size = size, offset = offset2, end = end });
|
||||
Position += 24;
|
||||
}
|
||||
}
|
||||
}
|
||||
Position = offset + command_size;//skip
|
||||
}
|
||||
}
|
||||
|
||||
public Macho(Stream stream, uint codeRegistration, uint metadataRegistration) : this(stream)
|
||||
{
|
||||
Init(codeRegistration, metadataRegistration);
|
||||
}
|
||||
|
||||
public override uint MapVATR(uint uiAddr)
|
||||
{
|
||||
var section = sections.First(x => uiAddr >= x.address && uiAddr <= x.end);
|
||||
return uiAddr - (section.address - section.offset);
|
||||
}
|
||||
|
||||
public override bool Auto()
|
||||
{
|
||||
var __mod_init_func = sections.First(x => x.section_name == "__mod_init_func");
|
||||
var addrs = ReadClassArray<uint>(__mod_init_func.offset, (int)__mod_init_func.size / 4);
|
||||
foreach (var a in addrs)
|
||||
{
|
||||
if (a > 0)
|
||||
{
|
||||
var i = a - 1;
|
||||
Position = MapVATR(i);
|
||||
Position += 4;
|
||||
var buff = ReadBytes(2);
|
||||
if (FeatureBytes1.SequenceEqual(buff))
|
||||
{
|
||||
Position += 12;
|
||||
buff = ReadBytes(4);
|
||||
if (FeatureBytes2.SequenceEqual(buff))
|
||||
{
|
||||
Position = MapVATR(i) + 10;
|
||||
var subaddr = decodeMov(ReadBytes(8)) + i + 24u - 1u;
|
||||
var rsubaddr = MapVATR(subaddr);
|
||||
Position = rsubaddr;
|
||||
var ptr = decodeMov(ReadBytes(8)) + subaddr + 16u;
|
||||
Position = MapVATR(ptr);
|
||||
var metadataRegistration = ReadUInt32();
|
||||
Position = rsubaddr + 8;
|
||||
buff = ReadBytes(4);
|
||||
Position = rsubaddr + 14;
|
||||
buff = buff.Concat(ReadBytes(4)).ToArray();
|
||||
var codeRegistration = decodeMov(buff) + subaddr + 22u;
|
||||
Console.WriteLine("CodeRegistration : {0:x}", codeRegistration);
|
||||
Console.WriteLine("MetadataRegistration : {0:x}", metadataRegistration);
|
||||
Init(codeRegistration, metadataRegistration);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
82
Il2CppDumper/v16/Metadata.cs
Normal file
82
Il2CppDumper/v16/Metadata.cs
Normal file
|
@ -0,0 +1,82 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppDumper.v16
|
||||
{
|
||||
class Metadata : MyBinaryReader
|
||||
{
|
||||
private Il2CppGlobalMetadataHeader pMetadataHdr;
|
||||
public int uiImageCount;
|
||||
public int uiNumTypes;
|
||||
public Il2CppImageDefinition[] imageDefs;
|
||||
public Il2CppTypeDefinition[] typeDefs;
|
||||
public Il2CppMethodDefinition[] methodDefs;
|
||||
public Il2CppParameterDefinition[] parameterDefs;
|
||||
public Il2CppFieldDefinition[] fieldDefs;
|
||||
private Il2CppFieldDefaultValue[] fieldDefaultValues;
|
||||
public Il2CppPropertyDefinition[] propertyDefs;
|
||||
|
||||
public Metadata(Stream stream) : base(stream)
|
||||
{
|
||||
pMetadataHdr = ReadClass<Il2CppGlobalMetadataHeader>();
|
||||
uiImageCount = pMetadataHdr.imagesCount / MySizeOf(typeof(Il2CppImageDefinition));
|
||||
uiNumTypes = pMetadataHdr.typeDefinitionsCount / MySizeOf(typeof(Il2CppTypeDefinition));
|
||||
imageDefs = ReadClassArray<Il2CppImageDefinition>(pMetadataHdr.imagesOffset, uiImageCount);
|
||||
//GetTypeDefFromIndex
|
||||
typeDefs = ReadClassArray<Il2CppTypeDefinition>(pMetadataHdr.typeDefinitionsOffset, uiNumTypes);
|
||||
//GetMethodDefinition
|
||||
methodDefs = ReadClassArray<Il2CppMethodDefinition>(pMetadataHdr.methodsOffset, pMetadataHdr.methodsCount / MySizeOf(typeof(Il2CppMethodDefinition)));
|
||||
//GetParameterFromIndex
|
||||
parameterDefs = ReadClassArray<Il2CppParameterDefinition>(pMetadataHdr.parametersOffset, pMetadataHdr.parametersCount / MySizeOf(typeof(Il2CppParameterDefinition)));
|
||||
//GetFieldDefFromIndex
|
||||
fieldDefs = ReadClassArray<Il2CppFieldDefinition>(pMetadataHdr.fieldsOffset, pMetadataHdr.fieldsCount / MySizeOf(typeof(Il2CppFieldDefinition)));
|
||||
//GetFieldDefaultValuesFromIndex
|
||||
fieldDefaultValues = ReadClassArray<Il2CppFieldDefaultValue>(pMetadataHdr.fieldDefaultValuesOffset, pMetadataHdr.fieldDefaultValuesCount / MySizeOf(typeof(Il2CppFieldDefaultValue)));
|
||||
//GetPropertyDefinitionFromIndex
|
||||
propertyDefs = ReadClassArray<Il2CppPropertyDefinition>(pMetadataHdr.propertiesOffset, pMetadataHdr.propertiesCount / MySizeOf(typeof(Il2CppPropertyDefinition)));
|
||||
}
|
||||
|
||||
public Il2CppFieldDefaultValue GetFieldDefaultFromIndex(int idx)
|
||||
{
|
||||
return fieldDefaultValues.FirstOrDefault(x => x.fieldIndex == idx);
|
||||
}
|
||||
|
||||
public int GetDefaultValueFromIndex(int idx)
|
||||
{
|
||||
return pMetadataHdr.fieldAndParameterDefaultValueDataOffset + idx;
|
||||
}
|
||||
|
||||
public string GetString(int idx)
|
||||
{
|
||||
return ReadStringToNull(pMetadataHdr.stringOffset + idx);
|
||||
}
|
||||
|
||||
private int MySizeOf(Type type)
|
||||
{
|
||||
var size = 0;
|
||||
foreach (var i in type.GetFields())
|
||||
{
|
||||
if (i.FieldType == typeof(int))
|
||||
{
|
||||
size += 4;
|
||||
}
|
||||
else if (i.FieldType == typeof(uint))
|
||||
{
|
||||
size += 4;
|
||||
}
|
||||
else if (i.FieldType == typeof(short))
|
||||
{
|
||||
size += 2;
|
||||
}
|
||||
else if (i.FieldType == typeof(ushort))
|
||||
{
|
||||
size += 2;
|
||||
}
|
||||
}
|
||||
return size;
|
||||
}
|
||||
}
|
||||
}
|
171
Il2CppDumper/v16/MetadataClass.cs
Normal file
171
Il2CppDumper/v16/MetadataClass.cs
Normal file
|
@ -0,0 +1,171 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppDumper.v16
|
||||
{
|
||||
public class Il2CppGlobalMetadataHeader
|
||||
{
|
||||
public uint sanity;
|
||||
public int version;
|
||||
public int stringLiteralOffset; // string data for managed code
|
||||
public int stringLiteralCount;
|
||||
public int stringLiteralDataOffset;
|
||||
public int stringLiteralDataCount;
|
||||
public int stringOffset; // string data for metadata
|
||||
public int stringCount;
|
||||
public int eventsOffset; // Il2CppEventDefinition
|
||||
public int eventsCount;
|
||||
public int propertiesOffset; // Il2CppPropertyDefinition
|
||||
public int propertiesCount;
|
||||
public int methodsOffset; // Il2CppMethodDefinition
|
||||
public int methodsCount;
|
||||
public int parameterDefaultValuesOffset; // Il2CppParameterDefaultValue
|
||||
public int parameterDefaultValuesCount;
|
||||
public int fieldDefaultValuesOffset; // Il2CppFieldDefaultValue
|
||||
public int fieldDefaultValuesCount;
|
||||
public int fieldAndParameterDefaultValueDataOffset; // uint8_t
|
||||
public int fieldAndParameterDefaultValueDataCount;
|
||||
public int fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize
|
||||
public int fieldMarshaledSizesCount;
|
||||
public int parametersOffset; // Il2CppParameterDefinition
|
||||
public int parametersCount;
|
||||
public int fieldsOffset; // Il2CppFieldDefinition
|
||||
public int fieldsCount;
|
||||
public int genericParametersOffset; // Il2CppGenericParameter
|
||||
public int genericParametersCount;
|
||||
public int genericParameterConstraintsOffset; // TypeIndex
|
||||
public int genericParameterConstraintsCount;
|
||||
public int genericContainersOffset; // Il2CppGenericContainer
|
||||
public int genericContainersCount;
|
||||
public int nestedTypesOffset; // TypeDefinitionIndex
|
||||
public int nestedTypesCount;
|
||||
public int interfacesOffset; // TypeIndex
|
||||
public int interfacesCount;
|
||||
public int vtableMethodsOffset; // EncodedMethodIndex
|
||||
public int vtableMethodsCount;
|
||||
public int interfaceOffsetsOffset; // Il2CppInterfaceOffsetPair
|
||||
public int interfaceOffsetsCount;
|
||||
public int typeDefinitionsOffset; // Il2CppTypeDefinition
|
||||
public int typeDefinitionsCount;
|
||||
public int rgctxEntriesOffset; // Il2CppRGCTXDefinition
|
||||
public int rgctxEntriesCount;
|
||||
public int imagesOffset; // Il2CppImageDefinition
|
||||
public int imagesCount;
|
||||
public int assembliesOffset; // Il2CppAssemblyDefinition
|
||||
public int assembliesCount;
|
||||
}
|
||||
|
||||
public class Il2CppImageDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int assemblyIndex;
|
||||
|
||||
public int typeStart;
|
||||
public uint typeCount;
|
||||
|
||||
public int entryPointIndex;
|
||||
}
|
||||
|
||||
public class Il2CppTypeDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int namespaceIndex;
|
||||
public int customAttributeIndex;
|
||||
public int byvalTypeIndex;
|
||||
public int byrefTypeIndex;
|
||||
|
||||
public int declaringTypeIndex;
|
||||
public int parentIndex;
|
||||
public int elementTypeIndex; // we can probably remove this one. Only used for enums
|
||||
|
||||
public int rgctxStartIndex;
|
||||
public int rgctxCount;
|
||||
|
||||
public int genericContainerIndex;
|
||||
|
||||
public int delegateWrapperFromManagedToNativeIndex;
|
||||
public int marshalingFunctionsIndex;
|
||||
|
||||
public uint flags;
|
||||
|
||||
public int fieldStart;
|
||||
public int methodStart;
|
||||
public int eventStart;
|
||||
public int propertyStart;
|
||||
public int nestedTypesStart;
|
||||
public int interfacesStart;
|
||||
public int vtableStart;
|
||||
public int interfaceOffsetsStart;
|
||||
|
||||
public ushort method_count;
|
||||
public ushort property_count;
|
||||
public ushort field_count;
|
||||
public ushort event_count;
|
||||
public ushort nested_type_count;
|
||||
public ushort vtable_count;
|
||||
public ushort interfaces_count;
|
||||
public ushort interface_offsets_count;
|
||||
|
||||
// bitfield to portably encode boolean values as single bits
|
||||
// 01 - valuetype;
|
||||
// 02 - enumtype;
|
||||
// 03 - has_finalize;
|
||||
// 04 - has_cctor;
|
||||
// 05 - is_blittable;
|
||||
// 06-09 - One of nine possible PackingSize values (0, 1, 2, 4, 8, 16, 32, 64, or 128)
|
||||
public uint bitfield;
|
||||
}
|
||||
|
||||
public class Il2CppMethodDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int declaringType;
|
||||
public int returnType;
|
||||
public int parameterStart;
|
||||
public int customAttributeIndex;
|
||||
public int genericContainerIndex;
|
||||
public int methodIndex;
|
||||
public int invokerIndex;
|
||||
public int delegateWrapperIndex;
|
||||
public int rgctxStartIndex;
|
||||
public int rgctxCount;
|
||||
public uint token;
|
||||
public ushort flags;
|
||||
public ushort iflags;
|
||||
public ushort slot;
|
||||
public ushort parameterCount;
|
||||
}
|
||||
|
||||
public class Il2CppParameterDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public uint token;
|
||||
public int customAttributeIndex;
|
||||
public int typeIndex;
|
||||
}
|
||||
|
||||
public class Il2CppFieldDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int typeIndex;
|
||||
public int customAttributeIndex;
|
||||
}
|
||||
|
||||
public class Il2CppFieldDefaultValue
|
||||
{
|
||||
public int fieldIndex;
|
||||
public int typeIndex;
|
||||
public int dataIndex;
|
||||
}
|
||||
|
||||
public class Il2CppPropertyDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int get;
|
||||
public int set;
|
||||
public uint attrs;
|
||||
public int customAttributeIndex;
|
||||
}
|
||||
}
|
161
Il2CppDumper/v20/Il2CppClass.cs
Normal file
161
Il2CppDumper/v20/Il2CppClass.cs
Normal file
|
@ -0,0 +1,161 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppDumper.v20
|
||||
{
|
||||
public class Il2CppCodeRegistration
|
||||
{
|
||||
public uint methodPointersCount;
|
||||
public uint methodPointers;
|
||||
public uint delegateWrappersFromNativeToManagedCount;
|
||||
public uint delegateWrappersFromNativeToManaged; // note the double indirection to handle different calling conventions
|
||||
public uint delegateWrappersFromManagedToNativeCount;
|
||||
public uint delegateWrappersFromManagedToNative;
|
||||
public uint marshalingFunctionsCount;
|
||||
public uint marshalingFunctions;
|
||||
public uint genericMethodPointersCount;
|
||||
public uint genericMethodPointers;
|
||||
public uint invokerPointersCount;
|
||||
public uint invokerPointers;
|
||||
public int customAttributeCount;
|
||||
public uint customAttributeGenerators;
|
||||
}
|
||||
|
||||
public class Il2CppMetadataRegistration
|
||||
{
|
||||
public int genericClassesCount;
|
||||
public uint genericClasses;
|
||||
public int genericInstsCount;
|
||||
public uint genericInsts;
|
||||
public int genericMethodTableCount;
|
||||
public uint genericMethodTable;
|
||||
public int typesCount;
|
||||
public uint types;
|
||||
public int methodSpecsCount;
|
||||
public uint methodSpecs;
|
||||
|
||||
public int fieldOffsetsCount;
|
||||
public uint fieldOffsets;
|
||||
|
||||
public int typeDefinitionsSizesCount;
|
||||
public uint typeDefinitionsSizes;
|
||||
public uint metadataUsagesCount;
|
||||
public uint metadataUsages;
|
||||
}
|
||||
|
||||
public enum Il2CppTypeEnum
|
||||
{
|
||||
IL2CPP_TYPE_END = 0x00, /* End of List */
|
||||
IL2CPP_TYPE_VOID = 0x01,
|
||||
IL2CPP_TYPE_BOOLEAN = 0x02,
|
||||
IL2CPP_TYPE_CHAR = 0x03,
|
||||
IL2CPP_TYPE_I1 = 0x04,
|
||||
IL2CPP_TYPE_U1 = 0x05,
|
||||
IL2CPP_TYPE_I2 = 0x06,
|
||||
IL2CPP_TYPE_U2 = 0x07,
|
||||
IL2CPP_TYPE_I4 = 0x08,
|
||||
IL2CPP_TYPE_U4 = 0x09,
|
||||
IL2CPP_TYPE_I8 = 0x0a,
|
||||
IL2CPP_TYPE_U8 = 0x0b,
|
||||
IL2CPP_TYPE_R4 = 0x0c,
|
||||
IL2CPP_TYPE_R8 = 0x0d,
|
||||
IL2CPP_TYPE_STRING = 0x0e,
|
||||
IL2CPP_TYPE_PTR = 0x0f, /* arg: <type> token */
|
||||
IL2CPP_TYPE_BYREF = 0x10, /* arg: <type> token */
|
||||
IL2CPP_TYPE_VALUETYPE = 0x11, /* arg: <type> token */
|
||||
IL2CPP_TYPE_CLASS = 0x12, /* arg: <type> token */
|
||||
IL2CPP_TYPE_VAR = 0x13, /* Generic parameter in a generic type definition, represented as number (compressed unsigned integer) number */
|
||||
IL2CPP_TYPE_ARRAY = 0x14, /* type, rank, boundsCount, bound1, loCount, lo1 */
|
||||
IL2CPP_TYPE_GENERICINST = 0x15, /* <type> <type-arg-count> <type-1> \x{2026} <type-n> */
|
||||
IL2CPP_TYPE_TYPEDBYREF = 0x16,
|
||||
IL2CPP_TYPE_I = 0x18,
|
||||
IL2CPP_TYPE_U = 0x19,
|
||||
IL2CPP_TYPE_FNPTR = 0x1b, /* arg: full method signature */
|
||||
IL2CPP_TYPE_OBJECT = 0x1c,
|
||||
IL2CPP_TYPE_SZARRAY = 0x1d, /* 0-based one-dim-array */
|
||||
IL2CPP_TYPE_MVAR = 0x1e, /* Generic parameter in a generic method definition, represented as number (compressed unsigned integer) */
|
||||
IL2CPP_TYPE_CMOD_REQD = 0x1f, /* arg: typedef or typeref token */
|
||||
IL2CPP_TYPE_CMOD_OPT = 0x20, /* optional arg: typedef or typref token */
|
||||
IL2CPP_TYPE_INTERNAL = 0x21, /* CLR internal type */
|
||||
|
||||
IL2CPP_TYPE_MODIFIER = 0x40, /* Or with the following types */
|
||||
IL2CPP_TYPE_SENTINEL = 0x41, /* Sentinel for varargs method signature */
|
||||
IL2CPP_TYPE_PINNED = 0x45, /* Local var that points to pinned object */
|
||||
|
||||
IL2CPP_TYPE_ENUM = 0x55 /* an enumeration */
|
||||
}
|
||||
|
||||
public class Il2CppType
|
||||
{
|
||||
public uint datapoint;
|
||||
public Anonymous data { get; set; }
|
||||
public uint bits;
|
||||
public uint attrs { get; set; }
|
||||
public Il2CppTypeEnum type { get; set; }
|
||||
public uint num_mods { get; set; }
|
||||
public uint byref { get; set; }
|
||||
public uint pinned { get; set; }
|
||||
|
||||
public void Init()
|
||||
{
|
||||
var str = Convert.ToString(bits, 2);
|
||||
if (str.Length != 32)
|
||||
{
|
||||
str = new string(Enumerable.Repeat('0', 32 - str.Length).Concat(str.ToCharArray()).ToArray());
|
||||
}
|
||||
attrs = Convert.ToUInt32(str.Substring(16, 16), 2);
|
||||
type = (Il2CppTypeEnum)Convert.ToInt32(str.Substring(8, 8), 2);
|
||||
num_mods = Convert.ToUInt32(str.Substring(2, 6), 2);
|
||||
byref = Convert.ToUInt32(str.Substring(1, 1), 2);
|
||||
pinned = Convert.ToUInt32(str.Substring(0, 1), 2);
|
||||
data = new Anonymous() { dummy = datapoint };
|
||||
}
|
||||
|
||||
public class Anonymous
|
||||
{
|
||||
public uint dummy;
|
||||
public int klassIndex => (int)dummy;
|
||||
|
||||
public uint type => dummy;
|
||||
public uint array => dummy;
|
||||
|
||||
public int genericParameterIndex => (int)dummy;
|
||||
public uint generic_class => dummy;
|
||||
}
|
||||
}
|
||||
|
||||
public class Il2CppGenericClass
|
||||
{
|
||||
public int typeDefinitionIndex; /* the generic type definition */
|
||||
public Il2CppGenericContext context; /* a context that contains the type instantiation doesn't contain any method instantiation */
|
||||
public uint cached_class; /* if present, the Il2CppClass corresponding to the instantiation. */
|
||||
}
|
||||
|
||||
public class Il2CppGenericContext
|
||||
{
|
||||
/* The instantiation corresponding to the class generic parameters */
|
||||
public uint class_inst;
|
||||
/* The instantiation corresponding to the method generic parameters */
|
||||
public uint method_inst;
|
||||
}
|
||||
|
||||
|
||||
public class Il2CppGenericInst
|
||||
{
|
||||
public uint type_argc;
|
||||
public uint type_argv;
|
||||
}
|
||||
|
||||
public class Il2CppArrayType
|
||||
{
|
||||
public uint etype;
|
||||
public byte rank;
|
||||
public byte numsizes;
|
||||
public byte numlobounds;
|
||||
public uint sizes;
|
||||
public uint lobounds;
|
||||
}
|
||||
}
|
184
Il2CppDumper/v20/MetadataClass.cs
Normal file
184
Il2CppDumper/v20/MetadataClass.cs
Normal file
|
@ -0,0 +1,184 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppDumper.v20
|
||||
{
|
||||
public class Il2CppGlobalMetadataHeader
|
||||
{
|
||||
public uint sanity;
|
||||
public int version;
|
||||
public int stringLiteralOffset; // string data for managed code
|
||||
public int stringLiteralCount;
|
||||
public int stringLiteralDataOffset;
|
||||
public int stringLiteralDataCount;
|
||||
public int stringOffset; // string data for metadata
|
||||
public int stringCount;
|
||||
public int eventsOffset; // Il2CppEventDefinition
|
||||
public int eventsCount;
|
||||
public int propertiesOffset; // Il2CppPropertyDefinition
|
||||
public int propertiesCount;
|
||||
public int methodsOffset; // Il2CppMethodDefinition
|
||||
public int methodsCount;
|
||||
public int parameterDefaultValuesOffset; // Il2CppParameterDefaultValue
|
||||
public int parameterDefaultValuesCount;
|
||||
public int fieldDefaultValuesOffset; // Il2CppFieldDefaultValue
|
||||
public int fieldDefaultValuesCount;
|
||||
public int fieldAndParameterDefaultValueDataOffset; // uint8_t
|
||||
public int fieldAndParameterDefaultValueDataCount;
|
||||
public int fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize
|
||||
public int fieldMarshaledSizesCount;
|
||||
public int parametersOffset; // Il2CppParameterDefinition
|
||||
public int parametersCount;
|
||||
public int fieldsOffset; // Il2CppFieldDefinition
|
||||
public int fieldsCount;
|
||||
public int genericParametersOffset; // Il2CppGenericParameter
|
||||
public int genericParametersCount;
|
||||
public int genericParameterConstraintsOffset; // TypeIndex
|
||||
public int genericParameterConstraintsCount;
|
||||
public int genericContainersOffset; // Il2CppGenericContainer
|
||||
public int genericContainersCount;
|
||||
public int nestedTypesOffset; // TypeDefinitionIndex
|
||||
public int nestedTypesCount;
|
||||
public int interfacesOffset; // TypeIndex
|
||||
public int interfacesCount;
|
||||
public int vtableMethodsOffset; // EncodedMethodIndex
|
||||
public int vtableMethodsCount;
|
||||
public int interfaceOffsetsOffset; // Il2CppInterfaceOffsetPair
|
||||
public int interfaceOffsetsCount;
|
||||
public int typeDefinitionsOffset; // Il2CppTypeDefinition
|
||||
public int typeDefinitionsCount;
|
||||
public int rgctxEntriesOffset; // Il2CppRGCTXDefinition
|
||||
public int rgctxEntriesCount;
|
||||
public int imagesOffset; // Il2CppImageDefinition
|
||||
public int imagesCount;
|
||||
public int assembliesOffset; // Il2CppAssemblyDefinition
|
||||
public int assembliesCount;
|
||||
public int metadataUsageListsOffset; // Il2CppMetadataUsageList
|
||||
public int metadataUsageListsCount;
|
||||
public int metadataUsagePairsOffset; // Il2CppMetadataUsagePair
|
||||
public int metadataUsagePairsCount;
|
||||
public int fieldRefsOffset; // Il2CppFieldRef
|
||||
public int fieldRefsCount;
|
||||
public int referencedAssembliesOffset; // int32_t
|
||||
public int referencedAssembliesCount;
|
||||
}
|
||||
|
||||
public class Il2CppImageDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int assemblyIndex;
|
||||
|
||||
public int typeStart;
|
||||
public uint typeCount;
|
||||
|
||||
public int entryPointIndex;
|
||||
public uint token;
|
||||
}
|
||||
|
||||
public class Il2CppTypeDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int namespaceIndex;
|
||||
public int customAttributeIndex;
|
||||
public int byvalTypeIndex;
|
||||
public int byrefTypeIndex;
|
||||
|
||||
public int declaringTypeIndex;
|
||||
public int parentIndex;
|
||||
public int elementTypeIndex; // we can probably remove this one. Only used for enums
|
||||
|
||||
public int rgctxStartIndex;
|
||||
public int rgctxCount;
|
||||
|
||||
public int genericContainerIndex;
|
||||
|
||||
public int delegateWrapperFromManagedToNativeIndex;
|
||||
public int marshalingFunctionsIndex;
|
||||
|
||||
public uint flags;
|
||||
|
||||
public int fieldStart;
|
||||
public int methodStart;
|
||||
public int eventStart;
|
||||
public int propertyStart;
|
||||
public int nestedTypesStart;
|
||||
public int interfacesStart;
|
||||
public int vtableStart;
|
||||
public int interfaceOffsetsStart;
|
||||
|
||||
public ushort method_count;
|
||||
public ushort property_count;
|
||||
public ushort field_count;
|
||||
public ushort event_count;
|
||||
public ushort nested_type_count;
|
||||
public ushort vtable_count;
|
||||
public ushort interfaces_count;
|
||||
public ushort interface_offsets_count;
|
||||
|
||||
// bitfield to portably encode boolean values as single bits
|
||||
// 01 - valuetype;
|
||||
// 02 - enumtype;
|
||||
// 03 - has_finalize;
|
||||
// 04 - has_cctor;
|
||||
// 05 - is_blittable;
|
||||
// 06 - is_import;
|
||||
// 07-10 - One of nine possible PackingSize values (0, 1, 2, 4, 8, 16, 32, 64, or 128)
|
||||
public uint bitfield;
|
||||
public uint token;
|
||||
}
|
||||
|
||||
public class Il2CppMethodDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int declaringType;
|
||||
public int returnType;
|
||||
public int parameterStart;
|
||||
public int customAttributeIndex;
|
||||
public int genericContainerIndex;
|
||||
public int methodIndex;
|
||||
public int invokerIndex;
|
||||
public int delegateWrapperIndex;
|
||||
public int rgctxStartIndex;
|
||||
public int rgctxCount;
|
||||
public uint token;
|
||||
public ushort flags;
|
||||
public ushort iflags;
|
||||
public ushort slot;
|
||||
public ushort parameterCount;
|
||||
}
|
||||
|
||||
public class Il2CppParameterDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public uint token;
|
||||
public int customAttributeIndex;
|
||||
public int typeIndex;
|
||||
}
|
||||
|
||||
public class Il2CppFieldDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int typeIndex;
|
||||
public int customAttributeIndex;
|
||||
public uint token;
|
||||
}
|
||||
|
||||
public class Il2CppFieldDefaultValue
|
||||
{
|
||||
public int fieldIndex;
|
||||
public int typeIndex;
|
||||
public int dataIndex;
|
||||
}
|
||||
|
||||
public class Il2CppPropertyDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int get;
|
||||
public int set;
|
||||
public uint attrs;
|
||||
public int customAttributeIndex;
|
||||
public uint token;
|
||||
}
|
||||
}
|
167
Il2CppDumper/v22/Il2CppClass.cs
Normal file
167
Il2CppDumper/v22/Il2CppClass.cs
Normal file
|
@ -0,0 +1,167 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppDumper.v22
|
||||
{
|
||||
public class Il2CppCodeRegistration
|
||||
{
|
||||
public uint methodPointersCount;
|
||||
public uint methodPointers;
|
||||
public uint reversePInvokeWrapperCount;
|
||||
public uint reversePInvokeWrappers;
|
||||
public uint delegateWrappersFromManagedToNativeCount;
|
||||
public uint delegateWrappersFromManagedToNative;
|
||||
public uint marshalingFunctionsCount;
|
||||
public uint marshalingFunctions;
|
||||
public uint ccwMarshalingFunctionsCount;
|
||||
public uint ccwMarshalingFunctions;
|
||||
public uint genericMethodPointersCount;
|
||||
public uint genericMethodPointers;
|
||||
public uint invokerPointersCount;
|
||||
public uint invokerPointers;
|
||||
public int customAttributeCount;
|
||||
public uint customAttributeGenerators;
|
||||
public int guidCount;
|
||||
public uint guids;
|
||||
public uint unresolvedVirtualCallCount;
|
||||
public uint unresolvedVirtualCallPointers;
|
||||
}
|
||||
|
||||
public class Il2CppMetadataRegistration
|
||||
{
|
||||
public int genericClassesCount;
|
||||
public uint genericClasses;
|
||||
public int genericInstsCount;
|
||||
public uint genericInsts;
|
||||
public int genericMethodTableCount;
|
||||
public uint genericMethodTable;
|
||||
public int typesCount;
|
||||
public uint types;
|
||||
public int methodSpecsCount;
|
||||
public uint methodSpecs;
|
||||
|
||||
public int fieldOffsetsCount;
|
||||
public uint fieldOffsets;
|
||||
|
||||
public int typeDefinitionsSizesCount;
|
||||
public uint typeDefinitionsSizes;
|
||||
public uint metadataUsagesCount;
|
||||
public uint metadataUsages;
|
||||
}
|
||||
|
||||
public enum Il2CppTypeEnum
|
||||
{
|
||||
IL2CPP_TYPE_END = 0x00, /* End of List */
|
||||
IL2CPP_TYPE_VOID = 0x01,
|
||||
IL2CPP_TYPE_BOOLEAN = 0x02,
|
||||
IL2CPP_TYPE_CHAR = 0x03,
|
||||
IL2CPP_TYPE_I1 = 0x04,
|
||||
IL2CPP_TYPE_U1 = 0x05,
|
||||
IL2CPP_TYPE_I2 = 0x06,
|
||||
IL2CPP_TYPE_U2 = 0x07,
|
||||
IL2CPP_TYPE_I4 = 0x08,
|
||||
IL2CPP_TYPE_U4 = 0x09,
|
||||
IL2CPP_TYPE_I8 = 0x0a,
|
||||
IL2CPP_TYPE_U8 = 0x0b,
|
||||
IL2CPP_TYPE_R4 = 0x0c,
|
||||
IL2CPP_TYPE_R8 = 0x0d,
|
||||
IL2CPP_TYPE_STRING = 0x0e,
|
||||
IL2CPP_TYPE_PTR = 0x0f, /* arg: <type> token */
|
||||
IL2CPP_TYPE_BYREF = 0x10, /* arg: <type> token */
|
||||
IL2CPP_TYPE_VALUETYPE = 0x11, /* arg: <type> token */
|
||||
IL2CPP_TYPE_CLASS = 0x12, /* arg: <type> token */
|
||||
IL2CPP_TYPE_VAR = 0x13, /* Generic parameter in a generic type definition, represented as number (compressed unsigned integer) number */
|
||||
IL2CPP_TYPE_ARRAY = 0x14, /* type, rank, boundsCount, bound1, loCount, lo1 */
|
||||
IL2CPP_TYPE_GENERICINST = 0x15, /* <type> <type-arg-count> <type-1> \x{2026} <type-n> */
|
||||
IL2CPP_TYPE_TYPEDBYREF = 0x16,
|
||||
IL2CPP_TYPE_I = 0x18,
|
||||
IL2CPP_TYPE_U = 0x19,
|
||||
IL2CPP_TYPE_FNPTR = 0x1b, /* arg: full method signature */
|
||||
IL2CPP_TYPE_OBJECT = 0x1c,
|
||||
IL2CPP_TYPE_SZARRAY = 0x1d, /* 0-based one-dim-array */
|
||||
IL2CPP_TYPE_MVAR = 0x1e, /* Generic parameter in a generic method definition, represented as number (compressed unsigned integer) */
|
||||
IL2CPP_TYPE_CMOD_REQD = 0x1f, /* arg: typedef or typeref token */
|
||||
IL2CPP_TYPE_CMOD_OPT = 0x20, /* optional arg: typedef or typref token */
|
||||
IL2CPP_TYPE_INTERNAL = 0x21, /* CLR internal type */
|
||||
|
||||
IL2CPP_TYPE_MODIFIER = 0x40, /* Or with the following types */
|
||||
IL2CPP_TYPE_SENTINEL = 0x41, /* Sentinel for varargs method signature */
|
||||
IL2CPP_TYPE_PINNED = 0x45, /* Local var that points to pinned object */
|
||||
|
||||
IL2CPP_TYPE_ENUM = 0x55 /* an enumeration */
|
||||
}
|
||||
|
||||
public class Il2CppType
|
||||
{
|
||||
public uint datapoint;
|
||||
public Anonymous data { get; set; }
|
||||
public uint bits;
|
||||
public uint attrs { get; set; }
|
||||
public Il2CppTypeEnum type { get; set; }
|
||||
public uint num_mods { get; set; }
|
||||
public uint byref { get; set; }
|
||||
public uint pinned { get; set; }
|
||||
|
||||
public void Init()
|
||||
{
|
||||
var str = Convert.ToString(bits, 2);
|
||||
if (str.Length != 32)
|
||||
{
|
||||
str = new string(Enumerable.Repeat('0', 32 - str.Length).Concat(str.ToCharArray()).ToArray());
|
||||
}
|
||||
attrs = Convert.ToUInt32(str.Substring(16, 16), 2);
|
||||
type = (Il2CppTypeEnum)Convert.ToInt32(str.Substring(8, 8), 2);
|
||||
num_mods = Convert.ToUInt32(str.Substring(2, 6), 2);
|
||||
byref = Convert.ToUInt32(str.Substring(1, 1), 2);
|
||||
pinned = Convert.ToUInt32(str.Substring(0, 1), 2);
|
||||
data = new Anonymous() { dummy = datapoint };
|
||||
}
|
||||
|
||||
public class Anonymous
|
||||
{
|
||||
public uint dummy;
|
||||
public int klassIndex => (int)dummy;
|
||||
|
||||
public uint type => dummy;
|
||||
public uint array => dummy;
|
||||
|
||||
public int genericParameterIndex => (int)dummy;
|
||||
public uint generic_class => dummy;
|
||||
}
|
||||
}
|
||||
|
||||
public class Il2CppGenericClass
|
||||
{
|
||||
public int typeDefinitionIndex; /* the generic type definition */
|
||||
public Il2CppGenericContext context; /* a context that contains the type instantiation doesn't contain any method instantiation */
|
||||
public uint cached_class; /* if present, the Il2CppClass corresponding to the instantiation. */
|
||||
}
|
||||
|
||||
public class Il2CppGenericContext
|
||||
{
|
||||
/* The instantiation corresponding to the class generic parameters */
|
||||
public uint class_inst;
|
||||
/* The instantiation corresponding to the method generic parameters */
|
||||
public uint method_inst;
|
||||
}
|
||||
|
||||
|
||||
public class Il2CppGenericInst
|
||||
{
|
||||
public uint type_argc;
|
||||
public uint type_argv;
|
||||
}
|
||||
|
||||
public class Il2CppArrayType
|
||||
{
|
||||
public uint etype;
|
||||
public byte rank;
|
||||
public byte numsizes;
|
||||
public byte numlobounds;
|
||||
public uint sizes;
|
||||
public uint lobounds;
|
||||
}
|
||||
}
|
200
Il2CppDumper/v22/MetadataClass.cs
Normal file
200
Il2CppDumper/v22/MetadataClass.cs
Normal file
|
@ -0,0 +1,200 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppDumper.v22
|
||||
{
|
||||
public class Il2CppGlobalMetadataHeader
|
||||
{
|
||||
public uint sanity;
|
||||
public int version;
|
||||
public int stringLiteralOffset; // string data for managed code
|
||||
public int stringLiteralCount;
|
||||
public int stringLiteralDataOffset;
|
||||
public int stringLiteralDataCount;
|
||||
public int stringOffset; // string data for metadata
|
||||
public int stringCount;
|
||||
public int eventsOffset; // Il2CppEventDefinition
|
||||
public int eventsCount;
|
||||
public int propertiesOffset; // Il2CppPropertyDefinition
|
||||
public int propertiesCount;
|
||||
public int methodsOffset; // Il2CppMethodDefinition
|
||||
public int methodsCount;
|
||||
public int parameterDefaultValuesOffset; // Il2CppParameterDefaultValue
|
||||
public int parameterDefaultValuesCount;
|
||||
public int fieldDefaultValuesOffset; // Il2CppFieldDefaultValue
|
||||
public int fieldDefaultValuesCount;
|
||||
public int fieldAndParameterDefaultValueDataOffset; // uint8_t
|
||||
public int fieldAndParameterDefaultValueDataCount;
|
||||
public int fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize
|
||||
public int fieldMarshaledSizesCount;
|
||||
public int parametersOffset; // Il2CppParameterDefinition
|
||||
public int parametersCount;
|
||||
public int fieldsOffset; // Il2CppFieldDefinition
|
||||
public int fieldsCount;
|
||||
public int genericParametersOffset; // Il2CppGenericParameter
|
||||
public int genericParametersCount;
|
||||
public int genericParameterConstraintsOffset; // TypeIndex
|
||||
public int genericParameterConstraintsCount;
|
||||
public int genericContainersOffset; // Il2CppGenericContainer
|
||||
public int genericContainersCount;
|
||||
public int nestedTypesOffset; // TypeDefinitionIndex
|
||||
public int nestedTypesCount;
|
||||
public int interfacesOffset; // TypeIndex
|
||||
public int interfacesCount;
|
||||
public int vtableMethodsOffset; // EncodedMethodIndex
|
||||
public int vtableMethodsCount;
|
||||
public int interfaceOffsetsOffset; // Il2CppInterfaceOffsetPair
|
||||
public int interfaceOffsetsCount;
|
||||
public int typeDefinitionsOffset; // Il2CppTypeDefinition
|
||||
public int typeDefinitionsCount;
|
||||
public int rgctxEntriesOffset; // Il2CppRGCTXDefinition
|
||||
public int rgctxEntriesCount;
|
||||
public int imagesOffset; // Il2CppImageDefinition
|
||||
public int imagesCount;
|
||||
public int assembliesOffset; // Il2CppAssemblyDefinition
|
||||
public int assembliesCount;
|
||||
public int metadataUsageListsOffset; // Il2CppMetadataUsageList
|
||||
public int metadataUsageListsCount;
|
||||
public int metadataUsagePairsOffset; // Il2CppMetadataUsagePair
|
||||
public int metadataUsagePairsCount;
|
||||
public int fieldRefsOffset; // Il2CppFieldRef
|
||||
public int fieldRefsCount;
|
||||
public int referencedAssembliesOffset; // int32_t
|
||||
public int referencedAssembliesCount;
|
||||
public int attributesInfoOffset; // Il2CppCustomAttributeTypeRange
|
||||
public int attributesInfoCount;
|
||||
public int attributeTypesOffset; // TypeIndex
|
||||
public int attributeTypesCount;
|
||||
public int unresolvedVirtualCallParameterTypesOffset; // TypeIndex
|
||||
public int unresolvedVirtualCallParameterTypesCount;
|
||||
public int unresolvedVirtualCallParameterRangesOffset; // Il2CppRange
|
||||
public int unresolvedVirtualCallParameterRangesCount;
|
||||
}
|
||||
|
||||
public class Il2CppImageDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int assemblyIndex;
|
||||
|
||||
public int typeStart;
|
||||
public uint typeCount;
|
||||
|
||||
public int entryPointIndex;
|
||||
public uint token;
|
||||
}
|
||||
|
||||
public class Il2CppTypeDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int namespaceIndex;
|
||||
public int customAttributeIndex;
|
||||
public int byvalTypeIndex;
|
||||
public int byrefTypeIndex;
|
||||
|
||||
public int declaringTypeIndex;
|
||||
public int parentIndex;
|
||||
public int elementTypeIndex; // we can probably remove this one. Only used for enums
|
||||
|
||||
public int rgctxStartIndex;
|
||||
public int rgctxCount;
|
||||
|
||||
public int genericContainerIndex;
|
||||
|
||||
public int reversePInvokeWrapperIndex;
|
||||
public int marshalingFunctionsIndex;
|
||||
public int ccwFunctionIndex;
|
||||
public int guidIndex;
|
||||
|
||||
public uint flags;
|
||||
|
||||
public int fieldStart;
|
||||
public int methodStart;
|
||||
public int eventStart;
|
||||
public int propertyStart;
|
||||
public int nestedTypesStart;
|
||||
public int interfacesStart;
|
||||
public int vtableStart;
|
||||
public int interfaceOffsetsStart;
|
||||
|
||||
public ushort method_count;
|
||||
public ushort property_count;
|
||||
public ushort field_count;
|
||||
public ushort event_count;
|
||||
public ushort nested_type_count;
|
||||
public ushort vtable_count;
|
||||
public ushort interfaces_count;
|
||||
public ushort interface_offsets_count;
|
||||
|
||||
// bitfield to portably encode boolean values as single bits
|
||||
// 01 - valuetype;
|
||||
// 02 - enumtype;
|
||||
// 03 - has_finalize;
|
||||
// 04 - has_cctor;
|
||||
// 05 - is_blittable;
|
||||
// 06 - is_import_or_windows_runtime;
|
||||
// 07-10 - One of nine possible PackingSize values (0, 1, 2, 4, 8, 16, 32, 64, or 128)
|
||||
public uint bitfield;
|
||||
public uint token;
|
||||
}
|
||||
|
||||
public class Il2CppMethodDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int declaringType;
|
||||
public int returnType;
|
||||
public int parameterStart;
|
||||
public int customAttributeIndex;
|
||||
public int genericContainerIndex;
|
||||
public int methodIndex;
|
||||
public int invokerIndex;
|
||||
public int reversePInvokeWrapperIndex;
|
||||
public int rgctxStartIndex;
|
||||
public int rgctxCount;
|
||||
public uint token;
|
||||
public ushort flags;
|
||||
public ushort iflags;
|
||||
public ushort slot;
|
||||
public ushort parameterCount;
|
||||
}
|
||||
|
||||
public class Il2CppParameterDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public uint token;
|
||||
public int customAttributeIndex;
|
||||
public int typeIndex;
|
||||
}
|
||||
|
||||
public class Il2CppFieldDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int typeIndex;
|
||||
public int customAttributeIndex;
|
||||
public uint token;
|
||||
}
|
||||
|
||||
public class Il2CppFieldDefaultValue
|
||||
{
|
||||
public int fieldIndex;
|
||||
public int typeIndex;
|
||||
public int dataIndex;
|
||||
}
|
||||
|
||||
public class Il2CppPropertyDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int get;
|
||||
public int set;
|
||||
public uint attrs;
|
||||
public int customAttributeIndex;
|
||||
public uint token;
|
||||
}
|
||||
|
||||
public class Il2CppCustomAttributeTypeRange
|
||||
{
|
||||
public int start;
|
||||
public int count;
|
||||
}
|
||||
}
|
|
@ -2,11 +2,10 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0169
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper.v23._64bit
|
||||
{
|
||||
class Il2CppCodeRegistration
|
||||
public class Il2CppCodeRegistration
|
||||
{
|
||||
public ulong methodPointersCount;
|
||||
public ulong methodPointers;
|
||||
|
@ -24,7 +23,7 @@ namespace Il2CppDumper.v23._64bit
|
|||
public ulong interopData;
|
||||
}
|
||||
|
||||
class Il2CppMetadataRegistration
|
||||
public class Il2CppMetadataRegistration
|
||||
{
|
||||
public long genericClassesCount;
|
||||
public ulong genericClasses;
|
||||
|
@ -46,7 +45,7 @@ namespace Il2CppDumper.v23._64bit
|
|||
public ulong metadataUsages;
|
||||
}
|
||||
|
||||
enum Il2CppTypeEnum
|
||||
public enum Il2CppTypeEnum
|
||||
{
|
||||
IL2CPP_TYPE_END = 0x00, /* End of List */
|
||||
IL2CPP_TYPE_VOID = 0x01,
|
||||
|
@ -88,7 +87,7 @@ namespace Il2CppDumper.v23._64bit
|
|||
IL2CPP_TYPE_ENUM = 0x55 /* an enumeration */
|
||||
}
|
||||
|
||||
class Il2CppType
|
||||
public class Il2CppType
|
||||
{
|
||||
public ulong datapoint;
|
||||
public Anonymous data { get; set; }
|
||||
|
@ -127,14 +126,14 @@ namespace Il2CppDumper.v23._64bit
|
|||
}
|
||||
}
|
||||
|
||||
class Il2CppGenericClass
|
||||
public class Il2CppGenericClass
|
||||
{
|
||||
public long typeDefinitionIndex; /* the generic type definition */
|
||||
public Il2CppGenericContext context; /* a context that contains the type instantiation doesn't contain any method instantiation */
|
||||
public ulong cached_class; /* if present, the Il2CppClass corresponding to the instantiation. */
|
||||
}
|
||||
|
||||
class Il2CppGenericContext
|
||||
public class Il2CppGenericContext
|
||||
{
|
||||
/* The instantiation corresponding to the class generic parameters */
|
||||
public ulong class_inst;
|
||||
|
@ -142,13 +141,13 @@ namespace Il2CppDumper.v23._64bit
|
|||
public ulong method_inst;
|
||||
}
|
||||
|
||||
class Il2CppGenericInst
|
||||
public class Il2CppGenericInst
|
||||
{
|
||||
public ulong type_argc;
|
||||
public ulong type_argv;
|
||||
}
|
||||
|
||||
class Il2CppArrayType
|
||||
public class Il2CppArrayType
|
||||
{
|
||||
public ulong etype;
|
||||
public byte rank;
|
||||
|
|
|
@ -2,10 +2,10 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper.v23._64bit
|
||||
{
|
||||
class MachoSection
|
||||
public class MachoSection
|
||||
{
|
||||
public string section_name;
|
||||
public ulong address;
|
||||
|
@ -14,7 +14,7 @@ namespace Il2CppDumper.v23._64bit
|
|||
public ulong end;
|
||||
}
|
||||
|
||||
class Fat
|
||||
public class Fat
|
||||
{
|
||||
public ulong file_offset;
|
||||
public ulong size;
|
||||
|
|
|
@ -25,7 +25,7 @@ namespace Il2CppDumper.v23
|
|||
goto case 0xFEEDFACE;
|
||||
case 0xCAFEBABE:
|
||||
case 0xBEBAFECA:
|
||||
Console.Write("WARNING: fat macho will only dump the first object file.");
|
||||
Console.WriteLine("WARNING: fat macho will only dump the first object file.");
|
||||
var fat = new MachoFat(new MemoryStream(il2cppfile));
|
||||
il2cppfile = fat.GetFirstMacho();
|
||||
var magic = fat.GetFirstMachoMagic();
|
||||
|
|
|
@ -2,11 +2,10 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0169
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper.v23
|
||||
{
|
||||
class Il2CppCodeRegistration
|
||||
public class Il2CppCodeRegistration
|
||||
{
|
||||
public uint methodPointersCount;
|
||||
public uint methodPointers;
|
||||
|
@ -24,7 +23,7 @@ namespace Il2CppDumper.v23
|
|||
public uint interopData;
|
||||
}
|
||||
|
||||
class Il2CppMetadataRegistration
|
||||
public class Il2CppMetadataRegistration
|
||||
{
|
||||
public int genericClassesCount;
|
||||
public uint genericClasses;
|
||||
|
@ -46,7 +45,7 @@ namespace Il2CppDumper.v23
|
|||
public uint metadataUsages;
|
||||
}
|
||||
|
||||
enum Il2CppTypeEnum
|
||||
public enum Il2CppTypeEnum
|
||||
{
|
||||
IL2CPP_TYPE_END = 0x00, /* End of List */
|
||||
IL2CPP_TYPE_VOID = 0x01,
|
||||
|
@ -88,7 +87,7 @@ namespace Il2CppDumper.v23
|
|||
IL2CPP_TYPE_ENUM = 0x55 /* an enumeration */
|
||||
}
|
||||
|
||||
class Il2CppType
|
||||
public class Il2CppType
|
||||
{
|
||||
public uint datapoint;
|
||||
public Anonymous data { get; set; }
|
||||
|
@ -127,14 +126,14 @@ namespace Il2CppDumper.v23
|
|||
}
|
||||
}
|
||||
|
||||
class Il2CppGenericClass
|
||||
public class Il2CppGenericClass
|
||||
{
|
||||
public int typeDefinitionIndex; /* the generic type definition */
|
||||
public Il2CppGenericContext context; /* a context that contains the type instantiation doesn't contain any method instantiation */
|
||||
public uint cached_class; /* if present, the Il2CppClass corresponding to the instantiation. */
|
||||
}
|
||||
|
||||
class Il2CppGenericContext
|
||||
public class Il2CppGenericContext
|
||||
{
|
||||
/* The instantiation corresponding to the class generic parameters */
|
||||
public uint class_inst;
|
||||
|
@ -142,13 +141,13 @@ namespace Il2CppDumper.v23
|
|||
public uint method_inst;
|
||||
}
|
||||
|
||||
class Il2CppGenericInst
|
||||
public class Il2CppGenericInst
|
||||
{
|
||||
public uint type_argc;
|
||||
public uint type_argv;
|
||||
}
|
||||
|
||||
class Il2CppArrayType
|
||||
public class Il2CppArrayType
|
||||
{
|
||||
public uint etype;
|
||||
public byte rank;
|
||||
|
|
|
@ -2,11 +2,10 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
#pragma warning disable CS0169
|
||||
#pragma warning disable CS0649
|
||||
|
||||
namespace Il2CppDumper.v23
|
||||
{
|
||||
class Il2CppGlobalMetadataHeader
|
||||
public class Il2CppGlobalMetadataHeader
|
||||
{
|
||||
public uint sanity;
|
||||
public int version;
|
||||
|
@ -62,7 +61,7 @@ namespace Il2CppDumper.v23
|
|||
public int metadataUsagePairsCount;
|
||||
public int fieldRefsOffset; // Il2CppFieldRef
|
||||
public int fieldRefsCount;
|
||||
public int referencedAssembliesOffset; // int
|
||||
public int referencedAssembliesOffset; // int32_t
|
||||
public int referencedAssembliesCount;
|
||||
public int attributesInfoOffset; // Il2CppCustomAttributeTypeRange
|
||||
public int attributesInfoCount;
|
||||
|
@ -76,7 +75,7 @@ namespace Il2CppDumper.v23
|
|||
public int windowsRuntimeTypeNamesSize;
|
||||
}
|
||||
|
||||
class Il2CppImageDefinition
|
||||
public class Il2CppImageDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int assemblyIndex;
|
||||
|
@ -88,7 +87,7 @@ namespace Il2CppDumper.v23
|
|||
public uint token;
|
||||
}
|
||||
|
||||
class Il2CppTypeDefinition
|
||||
public class Il2CppTypeDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int namespaceIndex;
|
||||
|
@ -137,7 +136,7 @@ namespace Il2CppDumper.v23
|
|||
public uint token;
|
||||
}
|
||||
|
||||
class Il2CppMethodDefinition
|
||||
public class Il2CppMethodDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int declaringType;
|
||||
|
@ -157,7 +156,7 @@ namespace Il2CppDumper.v23
|
|||
public ushort parameterCount;
|
||||
}
|
||||
|
||||
class Il2CppParameterDefinition
|
||||
public class Il2CppParameterDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public uint token;
|
||||
|
@ -165,7 +164,7 @@ namespace Il2CppDumper.v23
|
|||
public int typeIndex;
|
||||
}
|
||||
|
||||
class Il2CppFieldDefinition
|
||||
public class Il2CppFieldDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int typeIndex;
|
||||
|
@ -173,14 +172,14 @@ namespace Il2CppDumper.v23
|
|||
public uint token;
|
||||
}
|
||||
|
||||
class Il2CppFieldDefaultValue
|
||||
public class Il2CppFieldDefaultValue
|
||||
{
|
||||
public int fieldIndex;
|
||||
public int typeIndex;
|
||||
public int dataIndex;
|
||||
}
|
||||
|
||||
class Il2CppPropertyDefinition
|
||||
public class Il2CppPropertyDefinition
|
||||
{
|
||||
public int nameIndex;
|
||||
public int get;
|
||||
|
@ -190,7 +189,7 @@ namespace Il2CppDumper.v23
|
|||
public uint token;
|
||||
}
|
||||
|
||||
class Il2CppCustomAttributeTypeRange
|
||||
public class Il2CppCustomAttributeTypeRange
|
||||
{
|
||||
public int start;
|
||||
public int count;
|
||||
|
|
Loading…
Add table
Reference in a new issue