添加更多的头文件版本

This commit is contained in:
Perfare 2020-02-27 14:45:22 +08:00
parent 502f7215bd
commit 805bd90fa2
2 changed files with 219 additions and 33 deletions

View file

@ -8,7 +8,27 @@ namespace Il2CppDumper
{ {
public static class HeaderConstants 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 @"struct VirtualInvokeData
{ {
uintptr_t methodPtr; uintptr_t methodPtr;
@ -23,7 +43,29 @@ struct Il2CppType
struct Il2CppClass; 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* image;
void* gc_desc; void* gc_desc;
@ -67,7 +109,6 @@ struct Il2CppClass_2
int32_t thread_static_fields_offset; int32_t thread_static_fields_offset;
uint32_t flags; uint32_t flags;
uint32_t token; uint32_t token;
uint16_t method_count; uint16_t method_count;
uint16_t property_count; uint16_t property_count;
uint16_t field_count; uint16_t field_count;
@ -76,7 +117,6 @@ struct Il2CppClass_2
uint16_t vtable_count; uint16_t vtable_count;
uint16_t interfaces_count; uint16_t interfaces_count;
uint16_t interface_offsets_count; uint16_t interface_offsets_count;
uint8_t typeHierarchyDepth; uint8_t typeHierarchyDepth;
uint8_t genericRecursionDepth; uint8_t genericRecursionDepth;
uint8_t rank; uint8_t rank;
@ -95,23 +135,146 @@ struct Il2CppClass
VirtualInvokeData vtable[255]; VirtualInvokeData vtable[255];
}; };
struct Il2CppObject ";
public readonly static string HeaderV241 =
@"struct Il2CppClass_1
{ {
Il2CppClass *klass; void* image;
void *monitor; 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; void* rgctx_data;
int32_t lower_bound; 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; Il2CppClass_1 _1;
Il2CppArrayBounds *bounds; void* static_fields;
uintptr_t max_length; 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];
}; };
"; ";

View file

@ -239,7 +239,7 @@ namespace Il2CppDumper
AddGenericClassStruct(pointer); AddGenericClassStruct(pointer);
} }
//TODO 处理数组类型 //TODO 处理数组类型
var preHeader = new StringBuilder(HeaderConstants.HeaderV242); var preHeader = new StringBuilder();
var headerStruct = new StringBuilder(); var headerStruct = new StringBuilder();
var headerClass = new StringBuilder(); var headerClass = new StringBuilder();
foreach (var info in StructInfo) foreach (var info in StructInfo)
@ -278,33 +278,56 @@ namespace Il2CppDumper
foreach (var field in info.Fields) 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($"\t{field.FieldTypeName} {field.FieldName};\n");
} }
headerClass.Append("};\n"); headerClass.Append("};\n");
} }
} }
var str = preHeader.Append(headerStruct).Append(headerClass).ToString(); var sb = new StringBuilder();
File.WriteAllText("il2cpp.h", str); 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) 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]")) if (Regex.IsMatch(str, "^[0-9]"))
{ {
return "_" + str; return "_" + str;