From 805bd90fa238aa4860dbfed872dfb5def70b651f Mon Sep 17 00:00:00 2001 From: Perfare Date: Thu, 27 Feb 2020 14:45:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=A4=9A=E7=9A=84?= =?UTF-8?q?=E5=A4=B4=E6=96=87=E4=BB=B6=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Il2CppDumper/Outputs/HeaderConstants.cs | 191 ++++++++++++++++++++++-- Il2CppDumper/Outputs/ScriptGenerator.cs | 61 +++++--- 2 files changed, 219 insertions(+), 33 deletions(-) diff --git a/Il2CppDumper/Outputs/HeaderConstants.cs b/Il2CppDumper/Outputs/HeaderConstants.cs index 2c06287..1b71477 100644 --- a/Il2CppDumper/Outputs/HeaderConstants.cs +++ b/Il2CppDumper/Outputs/HeaderConstants.cs @@ -8,7 +8,27 @@ namespace Il2CppDumper { public static class HeaderConstants { - public readonly static string HeaderV242 = + public readonly static string TypedefHeader = +@"typedef signed char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef long long int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +#ifdef _WIN64 + typedef unsigned __int64 uintptr_t; + typedef __int64 intptr_t; +#else + typedef unsigned int uintptr_t; + typedef int intptr_t; +#endif + +"; + + public readonly static string GenericHeader = @"struct VirtualInvokeData { uintptr_t methodPtr; @@ -23,7 +43,29 @@ struct Il2CppType struct Il2CppClass; -struct Il2CppClass_1 +struct Il2CppObject +{ + Il2CppClass *klass; + void *monitor; +}; + +struct Il2CppArrayBounds +{ + uintptr_t length; + int32_t lower_bound; +}; + +struct Il2CppArray +{ + Il2CppObject obj; + Il2CppArrayBounds *bounds; + uintptr_t max_length; +}; + +"; + + public readonly static string HeaderV242 = +@"struct Il2CppClass_1 { void* image; void* gc_desc; @@ -67,7 +109,6 @@ struct Il2CppClass_2 int32_t thread_static_fields_offset; uint32_t flags; uint32_t token; - uint16_t method_count; uint16_t property_count; uint16_t field_count; @@ -76,7 +117,6 @@ struct Il2CppClass_2 uint16_t vtable_count; uint16_t interfaces_count; uint16_t interface_offsets_count; - uint8_t typeHierarchyDepth; uint8_t genericRecursionDepth; uint8_t rank; @@ -95,23 +135,146 @@ struct Il2CppClass VirtualInvokeData vtable[255]; }; -struct Il2CppObject +"; + + public readonly static string HeaderV241 = +@"struct Il2CppClass_1 { - Il2CppClass *klass; - void *monitor; + void* image; + void* gc_desc; + const char* name; + const char* namespaze; + Il2CppType byval_arg; + Il2CppType this_arg; + Il2CppClass* element_class; + Il2CppClass* castClass; + Il2CppClass* declaringType; + Il2CppClass* parent; + void *generic_class; + void* typeDefinition; + void* interopData; + Il2CppClass* klass; + void* fields; + void* events; + void* properties; + void* methods; + Il2CppClass** nestedTypes; + Il2CppClass** implementedInterfaces; + void* interfaceOffsets; }; -struct Il2CppArrayBounds +struct Il2CppClass_2 { - uintptr_t length; - int32_t lower_bound; + void* rgctx_data; + Il2CppClass** typeHierarchy; + uint32_t initializationExceptionGCHandle; + uint32_t cctor_started; + uint32_t cctor_finished; + uint64_t cctor_thread; + int32_t genericContainerIndex; + uint32_t instance_size; + uint32_t actualSize; + uint32_t element_size; + int32_t native_size; + uint32_t static_fields_size; + uint32_t thread_static_fields_size; + int32_t thread_static_fields_offset; + uint32_t flags; + uint32_t token; + uint16_t method_count; + uint16_t property_count; + uint16_t field_count; + uint16_t event_count; + uint16_t nested_type_count; + uint16_t vtable_count; + uint16_t interfaces_count; + uint16_t interface_offsets_count; + uint8_t typeHierarchyDepth; + uint8_t genericRecursionDepth; + uint8_t rank; + uint8_t minimumAlignment; + uint8_t naturalAligment; + uint8_t packingSize; + uint8_t bitflags1; + uint8_t bitflags2; }; -struct Il2CppArray +struct Il2CppClass { - Il2CppObject obj; - Il2CppArrayBounds *bounds; - uintptr_t max_length; + Il2CppClass_1 _1; + void* static_fields; + Il2CppClass_2 _2; + VirtualInvokeData vtable[255]; +}; + +"; + + public readonly static string HeaderV240 = +@"struct Il2CppClass_1 +{ + void* image; + void* gc_desc; + const char* name; + const char* namespaze; + Il2CppType* byval_arg; + Il2CppType* this_arg; + Il2CppClass* element_class; + Il2CppClass* castClass; + Il2CppClass* declaringType; + Il2CppClass* parent; + void *generic_class; + void* typeDefinition; + void* interopData; + void* fields; + void* events; + void* properties; + void* methods; + Il2CppClass** nestedTypes; + Il2CppClass** implementedInterfaces; + void* interfaceOffsets; +}; + +struct Il2CppClass_2 +{ + void* rgctx_data; + Il2CppClass** typeHierarchy; + uint32_t cctor_started; + uint32_t cctor_finished; + uint64_t cctor_thread; + int32_t genericContainerIndex; + int32_t customAttributeIndex; + uint32_t instance_size; + uint32_t actualSize; + uint32_t element_size; + int32_t native_size; + uint32_t static_fields_size; + uint32_t thread_static_fields_size; + int32_t thread_static_fields_offset; + uint32_t flags; + uint32_t token; + uint16_t method_count; + uint16_t property_count; + uint16_t field_count; + uint16_t event_count; + uint16_t nested_type_count; + uint16_t vtable_count; + uint16_t interfaces_count; + uint16_t interface_offsets_count; + uint8_t typeHierarchyDepth; + uint8_t genericRecursionDepth; + uint8_t rank; + uint8_t minimumAlignment; + uint8_t packingSize; + uint8_t bitflags1; + uint8_t bitflags2; +}; + +struct Il2CppClass +{ + Il2CppClass_1 _1; + void* static_fields; + Il2CppClass_2 _2; + VirtualInvokeData vtable[255]; }; "; diff --git a/Il2CppDumper/Outputs/ScriptGenerator.cs b/Il2CppDumper/Outputs/ScriptGenerator.cs index 750f0fe..2d82682 100644 --- a/Il2CppDumper/Outputs/ScriptGenerator.cs +++ b/Il2CppDumper/Outputs/ScriptGenerator.cs @@ -239,7 +239,7 @@ namespace Il2CppDumper AddGenericClassStruct(pointer); } //TODO 处理数组类型 - var preHeader = new StringBuilder(HeaderConstants.HeaderV242); + var preHeader = new StringBuilder(); var headerStruct = new StringBuilder(); var headerClass = new StringBuilder(); foreach (var info in StructInfo) @@ -278,33 +278,56 @@ namespace Il2CppDumper foreach (var field in info.Fields) { - if (field.FieldName == "klass") //hack - { - field.FieldName = "_klass"; - } - if (field.FieldName == "monitor") //hack - { - field.FieldName = "_monitor"; - } - if (field.FieldName == "register") //hack - { - field.FieldName = "_register"; - } - if (field.FieldName == "_cs") //hack - { - field.FieldName = "__cs"; - } headerClass.Append($"\t{field.FieldTypeName} {field.FieldName};\n"); } headerClass.Append("};\n"); } } - var str = preHeader.Append(headerStruct).Append(headerClass).ToString(); - File.WriteAllText("il2cpp.h", str); + var sb = new StringBuilder(); + if (il2Cpp is PE) + { + sb.Append(HeaderConstants.TypedefHeader); + } + sb.Append(HeaderConstants.GenericHeader); + switch (il2Cpp.Version) + { + case 24f: + sb.Append(HeaderConstants.HeaderV240); + break; + case 24.1f: + sb.Append(HeaderConstants.HeaderV241); + break; + case 24.2f: + sb.Append(HeaderConstants.HeaderV242); + break; + default: + sb.Append(HeaderConstants.HeaderV242); + break; + } + sb.Append(preHeader); + sb.Append(headerStruct); + sb.Append(headerClass); + File.WriteAllText("il2cpp.h", sb.ToString()); } private static string FixName(string str) { + if (str == "klass") + { + str = "_klass"; + } + if (str == "monitor") + { + str = "_monitor"; + } + if (str == "register") + { + str = "_register"; + } + if (str == "_cs") + { + str = "__cs"; + } if (Regex.IsMatch(str, "^[0-9]")) { return "_" + str;