frida-il2cpp-bridge-my
Version:
(my:Support IOS)Frida module to dump, manipulate and hijack any IL2CPP application at runtime with a high level of abstraction.
1,380 lines (1,316 loc) • 41.1 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Api = void 0;
const decorator_cache_getter_1 = require("decorator-cache-getter");
const extensions_1 = require("../utils/extensions");
const console_1 = require("../utils/console");
const variables_1 = require("./variables");
const native_api_offset_1 = require("./native_api_offset");
class Api {
static get _arrayGetElements() {
return extensions_1.createNF(this.r `array_elements`, "pointer", ["pointer"]);
}
static get _arrayGetLength() {
return extensions_1.createNF(this.r `array_length`, "uint32", ["pointer"]);
}
static get _arrayNew() {
return extensions_1.createNF(this.r `array_new`, "pointer", ["pointer", "uint32"]);
}
static get _assemblyGetImage() {
return extensions_1.createNF(this.r `assembly_get_image`, "pointer", ["pointer"]);
}
static get _assemblyGetName() {
return extensions_1.createNF(this.r `assembly_get_name`, "utf8string", ["pointer"]);
}
static get _classFromName() {
return extensions_1.createNF(this.r `class_from_name`, "pointer", ["pointer", "utf8string", "utf8string"]);
}
static get _classFromType() {
return extensions_1.createNF(this.r `class_from_type`, "pointer", ["pointer"]);
}
static get _classGetArrayClass() {
return extensions_1.createNF(this.r `array_class_get`, "pointer", ["pointer", "uint32"]);
}
static get _classGetArrayElementSize() {
return extensions_1.createNF(this.r `class_array_element_size`, "int", ["pointer"]);
}
static get _classGetAssemblyName() {
return extensions_1.createNF(this.r `class_get_assemblyname`, "utf8string", ["pointer"]);
}
static get _classGetDeclaringType() {
return extensions_1.createNF(this.r `class_get_declaring_type`, "pointer", ["pointer"]);
}
static get _classGetElementClass() {
return extensions_1.createNF(this.r `class_get_element_class`, "pointer", ["pointer"]);
}
static get _classGetFieldCount() {
return extensions_1.createNF(this.r `class_get_field_count`, "uint16", ["pointer"]);
}
static get _classGetFields() {
return extensions_1.createNF(this.r `class_get_fields`, "pointer", ["pointer", "pointer"]);
}
static get _classGetGenericClass() {
return extensions_1.createNF(this.r `class_get_generic_class`, "pointer", ["pointer"]);
}
static get _classGetImage() {
return extensions_1.createNF(this.r `class_get_image`, "pointer", ["pointer"]);
}
static get _classGetInstanceSize() {
return extensions_1.createNF(this.r `class_instance_size`, "uint32", ["pointer"]);
}
static get _classGetInterfaceCount() {
return extensions_1.createNF(this.r `class_get_interface_count`, "uint16", ["pointer"]);
}
static get _classGetInterfaces() {
return extensions_1.createNF(this.r `class_get_interfaces`, "pointer", ["pointer", "pointer"]);
}
static get _classGetMethodCount() {
return extensions_1.createNF(this.r `class_get_method_count`, "uint16", ["pointer"]);
}
static get _classGetMethods() {
return extensions_1.createNF(this.r `class_get_methods`, "pointer", ["pointer", "pointer"]);
}
static get _classGetName() {
return extensions_1.createNF(this.r `class_get_name`, "utf8string", ["pointer"]);
}
static get _classGetNamespace() {
return extensions_1.createNF(this.r `class_get_namespace`, "utf8string", ["pointer"]);
}
static get _classGetParent() {
return extensions_1.createNF(this.r `class_get_parent`, "pointer", ["pointer"]);
}
static get _classGetStaticFieldData() {
return extensions_1.createNF(this.r `class_get_static_field_data`, "pointer", ["pointer"]);
}
static get _classGetType() {
return extensions_1.createNF(this.r `class_get_type`, "pointer", ["pointer"]);
}
static get _classHasStaticConstructor() {
return extensions_1.createNF(this.r `class_has_static_constructor`, "bool", ["pointer"]);
}
static get _classInit() {
return extensions_1.createNF(this.r `runtime_class_init`, "void", ["pointer"]);
}
static get _classIsEnum() {
return extensions_1.createNF(this.r `class_is_enum`, "bool", ["pointer"]);
}
static get _classIsInterface() {
return extensions_1.createNF(this.r `class_is_interface`, "bool", ["pointer"]);
}
static get _classIsStaticConstructorFinished() {
return extensions_1.createNF(this.r `class_is_static_constructor_finished`, "bool", ["pointer"]);
}
static get _classIsStruct() {
return extensions_1.createNF(this.r `class_is_valuetype`, "bool", ["pointer"]);
}
static get _domainGet() {
return extensions_1.createNF(this.r `domain_get`, "pointer", []);
}
static get _domainGetAssemblies() {
function il2cpp_domain_get_assemblies(domain, psize) {
const assemblies = variables_1.library.base.add(native_api_offset_1.NativeApiOffset.offset_s_assemblies).readPointer();
const endAssemblies = variables_1.library.base.add(native_api_offset_1.NativeApiOffset.offset_s_assemblies + 0x08).readPointer();
console.log(`${assemblies}-${endAssemblies}`);
psize.writeInt(endAssemblies.sub(assemblies).toUInt32() / 8);
return assemblies;
}
return il2cpp_domain_get_assemblies;
}
static get _domainGetName() {
return extensions_1.createNF(this.r `domain_get_name`, "utf8string", ["pointer"]);
}
static get _fieldGetClass() {
return extensions_1.createNF(this.r `field_get_parent`, "pointer", ["pointer"]);
}
static get _fieldGetName() {
return extensions_1.createNF(this.r `field_get_name`, "utf8string", ["pointer"]);
}
static get _fieldGetOffset() {
return extensions_1.createNF(this.r `field_get_offset`, "int32", ["pointer"]);
}
static get _fieldGetStaticValue() {
return extensions_1.createNF(this.r `field_static_get_value`, "void", ["pointer", "pointer"]);
}
static get _fieldGetStaticValue2() {
return extensions_1.createNF(this.r `field_static_get_value`, "void", ["pointer", "pointer"]);
}
static get _fieldGetType() {
return extensions_1.createNF(this.r `field_get_type`, "pointer", ["pointer"]);
}
static get _fieldIsInstance() {
return extensions_1.createNF(this.r `field_is_instance`, "bool", ["pointer"]);
}
static get _fieldIsLiteral() {
return extensions_1.createNF(this.r `field_is_literal`, "bool", ["pointer"]);
}
static get _gcCollect() {
return extensions_1.createNF(this.r `gc_collect`, "void", ["int"]);
}
static get _gcCollectALittle() {
return extensions_1.createNF(this.r `gc_collect_a_little`, "void", []);
}
static get _gcDisable() {
return extensions_1.createNF(this.r `gc_disable`, "void", []);
}
static get _gcEnable() {
return extensions_1.createNF(this.r `gc_enable`, "void", []);
}
static get _gcIsDisabled() {
return extensions_1.createNF(this.r `gc_is_disabled`, "bool", []);
}
static get _genericClassGetCachedClass() {
return extensions_1.createNF(this.r `field_is_literal`, "pointer", ["pointer"]);
}
static get _genericClassGetTypesCount() {
return extensions_1.createNF(this.r `generic_class_get_types_count`, "uint32", ["pointer"]);
}
static get _genericClassGetTypes() {
return extensions_1.createNF(this.r `generic_class_get_types`, "pointer", ["pointer"]);
}
static get _imageGetClass() {
return extensions_1.createNF(this.r `image_get_class`, "pointer", ["pointer", "uint"]);
}
static get _imageGetClassCount() {
return extensions_1.createNF(this.r `image_get_class_count`, "uint32", ["pointer"]);
}
static get _imageGetClassStart() {
return extensions_1.createNF(this.r `image_get_class_start`, "uint32", ["pointer"]);
}
static get _imageGetName() {
return extensions_1.createNF(this.r `image_get_name`, "utf8string", ["pointer"]);
}
static get _init() {
return this.r `init`;
}
static get _livenessCalculationBegin() {
return extensions_1.createNF(this.r `unity_liveness_calculation_begin`, "pointer", [
"pointer",
"int",
"pointer",
"pointer",
"pointer",
"pointer"
]);
}
static get _livenessCalculationEnd() {
return extensions_1.createNF(this.r `unity_liveness_calculation_end`, "void", ["pointer"]);
}
static get _livenessCalculationFromStatics() {
return extensions_1.createNF(this.r `unity_liveness_calculation_from_statics`, "void", ["pointer"]);
}
static get _memorySnapshotCapture() {
return extensions_1.createNF(this.r `capture_memory_snapshot`, "pointer", []);
}
static get _memorySnapshotFree() {
return extensions_1.createNF(this.r `free_captured_memory_snapshot`, "void", ["pointer"]);
}
static get _memorySnapshotGetTrackedObjectCount() {
return extensions_1.createNF(this.r `memory_snapshot_get_tracked_object_count`, "uint64", ["pointer"]);
}
static get _memorySnapshotGetObjects() {
return extensions_1.createNF(this.r `memory_snapshot_get_objects`, "pointer", ["pointer"]);
}
static get _methodGetClass() {
return extensions_1.createNF(this.r `method_get_class`, "pointer", ["pointer"]);
}
static get _methodGetName() {
return extensions_1.createNF(this.r `method_get_name`, "utf8string", ["pointer"]);
}
static get _methodGetParamCount() {
return extensions_1.createNF(this.r `method_get_param_count`, "uint8", ["pointer"]);
}
static get _methodGetParameters() {
return extensions_1.createNF(this.r `method_get_parameters`, "pointer", ["pointer", "pointer"]);
}
static get _methodGetPointer() {
return extensions_1.createNF(this.r `method_get_pointer`, "pointer", ["pointer"]);
}
static get _methodGetReturnType() {
return extensions_1.createNF(this.r `method_get_return_type`, "pointer", ["pointer"]);
}
static get _methodIsGeneric() {
return extensions_1.createNF(this.r `method_is_generic`, "bool", ["pointer"]);
}
static get _methodIsInflated() {
return extensions_1.createNF(this.r `method_is_inflated`, "bool", ["pointer"]);
}
static get _methodIsInstance() {
return extensions_1.createNF(this.r `method_is_instance`, "bool", ["pointer"]);
}
static get _objectGetClass() {
return extensions_1.createNF(this.r `object_get_class`, "pointer", ["pointer"]);
}
static get _objectGetHeaderSize() {
return extensions_1.createNF(this.r `object_header_size`, "uint", []);
}
static get _objectNew() {
return extensions_1.createNF(this.r `object_new`, "pointer", ["pointer"]);
}
static get _objectUnbox() {
return extensions_1.createNF(this.r `object_unbox`, "pointer", ["pointer"]);
}
static get _parameterGetName() {
return extensions_1.createNF(this.r `parameter_get_name`, "utf8string", ["pointer"]);
}
static get _parameterGetPosition() {
return extensions_1.createNF(this.r `parameter_get_position`, "int32", ["pointer"]);
}
static get _parameterGetType() {
return extensions_1.createNF(this.r `parameter_get_type`, "pointer", ["pointer"]);
}
static get _stringChars() {
return extensions_1.createNF(this.r `string_chars`, "pointer", ["pointer"]);
}
static get _stringLength() {
return extensions_1.createNF(this.r `string_length`, "int32", ["pointer"]);
}
static get _stringNew() {
return extensions_1.createNF(this.r `string_new`, "pointer", ["utf8string"]);
}
static get _stringSetLength() {
return extensions_1.createNF(this.r `string_set_length`, "void", ["pointer", "int32"]);
}
static get _valueBox() {
return extensions_1.createNF(this.r `value_box`, "pointer", ["pointer", "pointer"]);
}
static get _threadAttach() {
return extensions_1.createNF(this.r `thread_attach`, "void", ["pointer"]);
}
static get _typeGetClassOrElementClass() {
return extensions_1.createNF(this.r `type_get_class_or_element_class`, "pointer", ["pointer"]);
}
static get _typeGetDataType() {
return extensions_1.createNF(this.r `type_get_data_type`, "pointer", ["pointer"]);
}
static get _typeGetGenericClass() {
return extensions_1.createNF(this.r `type_get_generic_class`, "pointer", ["pointer"]);
}
static get _typeGetName() {
return extensions_1.createNF(this.r `type_get_name`, "utf8string", ["pointer"]);
}
static get _typeGetTypeEnum() {
return extensions_1.createNF(this.r `type_get_type`, "int", ["pointer"]);
}
static get _typeIsByReference() {
return extensions_1.createNF(this.r `type_is_byref`, "bool", ["pointer"]);
}
static get _typeOffsetOfTypeEnum() {
return extensions_1.createNF(this.r `type_offset_of_type`, "uint16", []);
}
static get sources() {
return [variables_1.library, createMissingApi()];
}
static my_r(exportName) {
}
static r(exportName) {
const name = "il2cpp_" + exportName;
for (const source of this.sources) {
const result = source instanceof Module ? source.findExportByName(name) : source[name];
if (result)
return result;
}
console_1.raise(`Couldn't resolve export "${name}".`);
}
}
__decorate([
decorator_cache_getter_1.cache
], Api, "_arrayGetElements", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_arrayGetLength", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_arrayNew", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_assemblyGetImage", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_assemblyGetName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classFromName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classFromType", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetArrayClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetArrayElementSize", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetAssemblyName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetDeclaringType", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetElementClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetFieldCount", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetFields", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetGenericClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetImage", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetInstanceSize", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetInterfaceCount", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetInterfaces", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetMethodCount", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetMethods", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetNamespace", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetParent", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetStaticFieldData", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classGetType", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classHasStaticConstructor", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classInit", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classIsEnum", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classIsInterface", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classIsStaticConstructorFinished", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_classIsStruct", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_domainGet", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_domainGetAssemblies", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_domainGetName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_fieldGetClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_fieldGetName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_fieldGetOffset", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_fieldGetStaticValue", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_fieldGetStaticValue2", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_fieldGetType", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_fieldIsInstance", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_fieldIsLiteral", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_gcCollect", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_gcCollectALittle", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_gcDisable", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_gcEnable", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_gcIsDisabled", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_genericClassGetCachedClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_genericClassGetTypesCount", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_genericClassGetTypes", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_imageGetClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_imageGetClassCount", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_imageGetClassStart", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_imageGetName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_init", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_livenessCalculationBegin", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_livenessCalculationEnd", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_livenessCalculationFromStatics", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_memorySnapshotCapture", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_memorySnapshotFree", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_memorySnapshotGetTrackedObjectCount", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_memorySnapshotGetObjects", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodGetClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodGetName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodGetParamCount", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodGetParameters", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodGetPointer", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodGetReturnType", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodIsGeneric", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodIsInflated", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_methodIsInstance", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_objectGetClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_objectGetHeaderSize", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_objectNew", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_objectUnbox", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_parameterGetName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_parameterGetPosition", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_parameterGetType", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_stringChars", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_stringLength", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_stringNew", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_stringSetLength", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_valueBox", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_threadAttach", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_typeGetClassOrElementClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_typeGetDataType", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_typeGetGenericClass", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_typeGetName", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_typeGetTypeEnum", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_typeIsByReference", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "_typeOffsetOfTypeEnum", null);
__decorate([
decorator_cache_getter_1.cache
], Api, "sources", null);
exports.Api = Api;
function createMissingApi() {
const isEqualOrAbove_5_3_2 = +variables_1.unityVersion.isEqualOrAbove("5.3.2");
const isEqualOrAbove_5_3_3 = +variables_1.unityVersion.isEqualOrAbove("5.3.3");
const isEqualOrAbove_5_3_6 = +variables_1.unityVersion.isEqualOrAbove("5.3.6");
const isEqualOrAbove_5_4_4 = +variables_1.unityVersion.isEqualOrAbove("5.4.4");
const isEqualOrAbove_5_5_0 = +variables_1.unityVersion.isEqualOrAbove("5.5.0");
const isEqualOrAbove_5_6_0 = +variables_1.unityVersion.isEqualOrAbove("5.6.0");
const isEqualOrAbove_2017_1_0 = +variables_1.unityVersion.isEqualOrAbove("2017.1.0");
const isEqualOrAbove_2017_1_3 = +variables_1.unityVersion.isEqualOrAbove("2017.1.3");
const isEqualOrAbove_2018_1_0 = +variables_1.unityVersion.isEqualOrAbove("2018.1.0");
const isEqualOrAbove_2018_2_0 = +variables_1.unityVersion.isEqualOrAbove("2018.2.0");
const isEqualOrAbove_2018_3_0 = +variables_1.unityVersion.isEqualOrAbove("2018.3.0");
const isEqualOrAbove_2018_3_8 = +variables_1.unityVersion.isEqualOrAbove("2018.3.8");
const isEqualOrAbove_2019_1_0 = +variables_1.unityVersion.isEqualOrAbove("2019.1.0");
const isEqualOrAbove_2020_2_0 = +variables_1.unityVersion.isEqualOrAbove("2020.2.0");
const isBelow_5_3_3 = +!isEqualOrAbove_5_3_3;
const isBelow_5_3_6 = +!isEqualOrAbove_5_3_6;
const isBelow_5_5_0 = +!isEqualOrAbove_5_5_0;
const isBelow_2018_1_0 = +!isEqualOrAbove_2018_1_0;
const isBelow_2018_3_0 = +!isEqualOrAbove_2018_3_0;
const isBelow_2019_3_0 = +variables_1.unityVersion.isBelow("2019.3.0");
const isBelow_2020_2_0 = +!isEqualOrAbove_2020_2_0;
const isNotEqual_2017_2_0 = +!variables_1.unityVersion.isEqual("2017.2.0");
const isNotEqual_5_5_0 = +!variables_1.unityVersion.isEqual("5.5.0");
return new CModule(`
#include <stdint.h>
#define FIELD_ATTRIBUTE_STATIC 0x0010
#define FIELD_ATTRIBUTE_LITERAL 0x0040
#define METHOD_ATTRIBUTE_STATIC 0x0010
typedef struct _Il2CppObject Il2CppObject;
typedef struct _Il2CppString Il2CppString;
typedef struct _Il2CppArray Il2CppArray;
#if ${isEqualOrAbove_5_3_3}
typedef struct _Il2CppArraySize Il2CppArraySize;
#endif
typedef struct _Il2CppDomain Il2CppDomain;
typedef struct _Il2CppAssemblyName Il2CppAssemblyName;
typedef struct _Il2CppAssembly Il2CppAssembly;
typedef struct _Il2CppImage Il2CppImage;
typedef struct _Il2CppClass Il2CppClass;
typedef struct _Il2CppType Il2CppType;
typedef struct _FieldInfo FieldInfo;
typedef struct _MethodInfo MethodInfo;
typedef struct _ParameterInfo ParameterInfo;
typedef enum _Il2CppTypeEnum Il2CppTypeEnum;
typedef struct _VirtualInvokeData VirtualInvokeData;
typedef struct _Il2CppGenericInst Il2CppGenericInst;
typedef struct _Il2CppGenericClass Il2CppGenericClass;
typedef struct _Il2CppGenericContext Il2CppGenericContext;
typedef uint16_t Il2CppChar;
typedef struct _Il2CppManagedMemorySnapshot Il2CppManagedMemorySnapshot;
typedef struct _Il2CppMetadataSnapshot Il2CppMetadataSnapshot;
typedef struct _Il2CppManagedMemorySection Il2CppManagedMemorySection;
typedef struct _Il2CppManagedHeap Il2CppManagedHeap;
typedef struct _Il2CppStacks Il2CppStacks;
typedef struct _Il2CppGCHandles Il2CppGCHandles;
typedef struct _Il2CppRuntimeInformation Il2CppRuntimeInformation;
enum _Il2CppTypeEnum
{
IL2CPP_TYPE_END = 0x00,
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,
IL2CPP_TYPE_BYREF = 0x10,
IL2CPP_TYPE_VALUETYPE = 0x11,
IL2CPP_TYPE_CLASS = 0x12,
IL2CPP_TYPE_VAR = 0x13,
IL2CPP_TYPE_ARRAY = 0x14,
IL2CPP_TYPE_GENERICINST = 0x15,
IL2CPP_TYPE_TYPEDBYREF = 0x16,
IL2CPP_TYPE_I = 0x18,
IL2CPP_TYPE_U = 0x19,
IL2CPP_TYPE_FNPTR = 0x1b,
IL2CPP_TYPE_OBJECT = 0x1c,
IL2CPP_TYPE_SZARRAY = 0x1d,
IL2CPP_TYPE_MVAR = 0x1e,
IL2CPP_TYPE_CMOD_REQD = 0x1f,
IL2CPP_TYPE_CMOD_OPT = 0x20,
IL2CPP_TYPE_INTERNAL = 0x21,
IL2CPP_TYPE_MODIFIER = 0x40,
IL2CPP_TYPE_SENTINEL = 0x41,
IL2CPP_TYPE_PINNED = 0x45,
IL2CPP_TYPE_ENUM = 0x55
};
struct _Il2CppObject
{
#if ${isEqualOrAbove_2018_1_0}
union
{
Il2CppClass * klass;
struct Il2CppVTable * vtable;
};
#else
Il2CppClass * klass;
#endif
struct MonitorData * monitor;
};
#if ${isBelow_2019_3_0}
size_t
il2cpp_object_header_size (void)
{
return sizeof (Il2CppObject);
}
#endif
struct _Il2CppDomain
{
struct Il2CppAppDomain * domain;
#if ${isEqualOrAbove_5_5_0}
struct Il2CppAppDomainSetup * setup;
#else
Il2CppObject * setup;
#endif
struct Il2CppAppContext * default_context;
const char * friendly_name;
uint32_t domain_id;
#if ${isEqualOrAbove_5_5_0}
volatile int threadpool_jobs;
#endif
#if ${isEqualOrAbove_2018_1_0}
void * agent_info;
#endif
};
const char *
il2cpp_domain_get_name (const Il2CppDomain* domain)
{
return domain->friendly_name;
}
struct _Il2CppAssemblyName
{
#if ${isEqualOrAbove_2018_1_0}
const char * name;
const char * culture;
const char * hash_value;
const char * public_key;
#else
int32_t nameIndex;
int32_t cultureIndex;
int32_t hashValueIndex;
int32_t publicKeyIndex;
#endif
uint32_t hash_alg;
int32_t hash_len;
uint32_t flags;
int32_t major;
int32_t minor;
int32_t build;
int32_t revision;
uint8_t publicKeyToken[8];
};
struct _Il2CppAssembly
{
#if ${isEqualOrAbove_2018_1_0}
Il2CppImage * image;
#else
int32_t imageIndex;
#endif
#if ${isEqualOrAbove_2018_3_0}
uint32_t token;
#else
int32_t customAttributeIndex;
#endif
#if ${isEqualOrAbove_5_3_3}
int32_t referencedAssemblyStart;
int32_t referencedAssemblyCount;
#endif
Il2CppAssemblyName aname;
};
#if ${isEqualOrAbove_2018_1_0}
const char *
il2cpp_assembly_get_name (const Il2CppAssembly * assembly)
{
return assembly->aname.name;
}
#endif
struct _Il2CppImage
{
const char * name;
#if ${isEqualOrAbove_2017_1_3 && isNotEqual_2017_2_0}
const char * nameNoExt;
#endif
#if ${isEqualOrAbove_2018_1_0}
Il2CppAssembly * assembly;
#else
int32_t assemblyIndex;
#endif
#if ${isBelow_2020_2_0}
int32_t typeStart;
#endif
uint32_t typeCount;
#if ${isEqualOrAbove_2017_1_0}
#if ${isBelow_2020_2_0}
int32_t exportedTypeStart;
#endif
uint32_t exportedTypeCount;
#endif
#if ${isEqualOrAbove_2018_3_0}
#if ${isBelow_2020_2_0}
int32_t customAttributeStart;
#endif
uint32_t customAttributeCount;
#endif
#if ${isEqualOrAbove_2020_2_0}
const struct Il2CppMetadataImageHandle * metadataHandle;
struct Il2CppNameToTypeHandleHashTable * nameToClassHashTable;
#else
int32_t entryPointIndex;
struct Il2CppNameToTypeDefinitionIndexHashTable * nameToClassHashTable;
#endif
#if ${isEqualOrAbove_2019_1_0}
const struct Il2CppCodeGenModule * codeGenModule;
#endif
#if ${isEqualOrAbove_5_3_2}
uint32_t token;
#endif
#if ${isEqualOrAbove_2018_1_0}
uint8_t dynamic;
#endif
};
uint32_t
il2cpp_image_get_class_start (const Il2CppImage * image)
{
#if ${isBelow_2020_2_0}
return image->typeStart;
#else
return 0;
#endif
}
#if ${isBelow_2018_3_0}
uint32_t
il2cpp_image_get_class_count (const Il2CppImage * image)
{
return image->typeCount;
}
#endif
struct _Il2CppType
{
union
{
void * dummy;
int32_t klassIndex;
#if ${isEqualOrAbove_2020_2_0}
const struct Il2CppMetadataTypeHandle * typeHandle;
#endif
const Il2CppType * type;
struct Il2CppArrayType * array;
int32_t genericParameterIndex;
#if ${isEqualOrAbove_2020_2_0}
const struct Il2CppMetadataGenericParameterHandle * genericParameterHandle;
#endif
Il2CppGenericClass * generic_class;
} data;
unsigned int attrs: 16;
Il2CppTypeEnum type: 8;
unsigned int num_mods: 6;
unsigned int byref: 1;
unsigned int pinned: 1;
};
uint16_t
il2cpp_type_offset_of_type (void)
{
return (uint16_t) offsetof (Il2CppType, type);
}
const Il2CppType *
il2cpp_type_get_data_type (const Il2CppType * type)
{
return type->data.type;
}
Il2CppGenericClass *
il2cpp_type_get_generic_class (const Il2CppType * type)
{
return type->data.generic_class;
}
#if ${isBelow_2018_1_0}
unsigned int
il2cpp_type_is_byref (const Il2CppType * type)
{
return type->byref;
}
#endif
struct _VirtualInvokeData
{
void * methodPtr;
const MethodInfo * method;
};
struct _Il2CppClass
{
const Il2CppImage * image;
void * gc_desc;
const char * name;
const char * namespaze;
#if ${isEqualOrAbove_2018_1_0}
Il2CppType byval_arg;
Il2CppType this_arg;
#else
const Il2CppType* byval_arg;
const Il2CppType* this_arg;
#endif
Il2CppClass * element_class;
Il2CppClass * castClass;
Il2CppClass * declaringType;
Il2CppClass * parent;
Il2CppGenericClass * generic_class;
#if ${isEqualOrAbove_2020_2_0}
const struct Il2CppMetadataTypeHandle * typeMetadataHandle;
#else
const struct Il2CppTypeDefinition * typeDefinition;
#endif
#if ${isEqualOrAbove_5_6_0}
const struct Il2CppInteropData * interopData;
#endif
#if ${isEqualOrAbove_2018_1_0}
Il2CppClass * klass;
#endif
FieldInfo * fields;
const struct EventInfo* events;
const struct PropertyInfo * properties;
const MethodInfo ** methods;
Il2CppClass ** nestedTypes;
Il2CppClass ** implementedInterfaces;
#if ${isEqualOrAbove_5_3_6 && isBelow_5_5_0}
VirtualInvokeData * vtable;
#endif
#if ${isBelow_5_3_6}
const MethodInfo ** vtable;
#endif
struct Il2CppRuntimeInterfaceOffsetPair * interfaceOffsets;
void * static_fields;
const struct Il2CppRGCTXData * rgctx_data;
Il2CppClass ** typeHierarchy;
#if ${isEqualOrAbove_2019_1_0}
void * unity_user_data;
#endif
#if ${isEqualOrAbove_2018_2_0}
uint32_t initializationExceptionGCHandle;
#endif
uint32_t cctor_started;
uint32_t cctor_finished;
#if ${isEqualOrAbove_2019_1_0}
__attribute__((aligned(8))) size_t cctor_thread;
#else
__attribute__((aligned(8))) uint64_t cctor_thread;
#endif
#if ${isEqualOrAbove_2020_2_0}
const struct Il2CppMetadataGenericContainerHandle * genericContainerHandle;
#else
int32_t genericContainerIndex;
#endif
#if ${isBelow_2018_3_0}
int32_t customAttributeIndex;
#endif
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;
#if ${isEqualOrAbove_5_3_2}
uint32_t token;
#endif
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;
#if ${isEqualOrAbove_5_4_4 && isNotEqual_5_5_0}
uint8_t genericRecursionDepth;
#endif
uint8_t rank;
uint8_t minimumAlignment;
#if ${isEqualOrAbove_2018_3_8}
uint8_t naturalAligment;
#endif
uint8_t packingSize;
#if ${isEqualOrAbove_2018_3_0}
uint8_t initialized_and_no_error: 1;
#endif
uint8_t valuetype: 1;
uint8_t initialized: 1;
uint8_t enumtype: 1;
uint8_t is_generic: 1;
uint8_t has_references: 1;
uint8_t init_pending: 1;
uint8_t size_inited: 1;
uint8_t has_finalize: 1;
uint8_t has_cctor: 1;
uint8_t is_blittable: 1;
#if ${isEqualOrAbove_5_3_3}
uint8_t is_import_or_windows_runtime: 1;
#endif
#if ${isEqualOrAbove_5_5_0}
uint8_t is_vtable_initialized: 1;
#endif
#if ${isEqualOrAbove_2018_2_0}
uint8_t has_initialization_error: 1;
#endif
#if ${isEqualOrAbove_5_5_0}
VirtualInvokeData vtable[32];
#endif
};
uint16_t
il2cpp_class_get_interface_count (const Il2CppClass * klass)
{
return klass->interfaces_count;
}
uint16_t
il2cpp_class_get_method_count (const Il2CppClass * klass)
{
return klass->method_count;
}
uint16_t
il2cpp_class_get_field_count (const Il2CppClass * klass)
{
return klass->field_count;
}
uint8_t
il2cpp_class_has_static_constructor (const Il2CppClass * klass)
{
return klass->has_cctor;
}
uint32_t
il2cpp_class_is_static_constructor_finished (const Il2CppClass * klass)
{
return klass->cctor_finished;
}
#if ${isBelow_2019_3_0}
void *
il2cpp_class_get_static_field_data (const Il2CppClass * klass)
{
return klass->static_fields;
}
#endif
Il2CppGenericClass *
il2cpp_class_get_generic_class (const Il2CppClass * klass)
{
return klass->generic_class;
}
struct _Il2CppGenericInst
{
uint32_t type_argc;
const Il2CppType ** type_argv;
};
struct _Il2CppGenericContext
{
const Il2CppGenericInst * class_inst;
const Il2CppGenericInst * method_inst;
};
struct _Il2CppGenericClass
{
#if ${isEqualOrAbove_2020_2_0}
const Il2CppType * type;
#else
int32_t typeDefinitionIndex;
#endif
Il2CppGenericContext context;
Il2CppClass * cached_class;
};
Il2CppClass *
il2cpp_generic_class_get_cached_class (Il2CppGenericClass * class)
{
return class->cached_class;
}
uint32_t
il2cpp_generic_class_get_types_count (Il2CppGenericClass * class)
{
return class->context.class_inst->type_argc;
}
const Il2CppType **
il2cpp_generic_class_get_types (Il2CppGenericClass * class)
{
return class->context.class_inst->type_argv;
}
struct _FieldInfo
{
const char * name;
const Il2CppType * type;
Il2CppClass * parent;
int32_t offset;
#if ${isBelow_2018_3_0}
int32_t customAttributeIndex;
#endif
#if ${isEqualOrAbove_5_3_2}
uint32_t token;
#endif
};
uint8_t
il2cpp_field_is_instance (FieldInfo * field)
{
return (field->type->attrs & FIELD_ATTRIBUTE_STATIC) == 0;
}
#if ${isBelow_2019_3_0}
uint8_t
il2cpp_field_is_literal (FieldInfo * field)
{
return field->type->attrs & FIELD_ATTRIBUTE_LITERAL;
}
#endif
struct _ParameterInfo
{
const char * name;
int32_t position;
uint32_t token;
#if ${isBelow_2018_3_0}
int32_t customAttributeIndex;
#endif
const Il2CppType * parameter_type;
};
const char *
il2cpp_parameter_get_name(const ParameterInfo * parameter)
{
return parameter->name;
}
const Il2CppType *
il2cpp_parameter_get_type (const ParameterInfo * parameter)
{
return parameter->parameter_type;
}
int32_t
il2cpp_parameter_get_position (const ParameterInfo * parameter)
{
return parameter->position;
}
struct _MethodInfo
{
void * methodPointer;
void * invoker_method;
const char * name;
Il2CppClass * klass;
const Il2CppType * return_type;
const ParameterInfo * parameters;
union
{
const struct Il2CppRGCTXData * rgctx_data;
#if ${isEqualOrAbove_2020_2_0}
const struct Il2CppMetadataMethodDefinitionHandle * methodMetadataHandle;
#else
const struct Il2CppMethodDefinition * methodDefinition;
#endif
};
union
{
const struct Il2CppGenericMethod * genericMethod;
#if ${isEqualOrAbove_2020_2_0}
const struct Il2CppMetadataGenericContainerHandle * genericContainerHandle;
#else
const struct Il2CppGenericContainer * genericContainer;
#endif
};
#if ${isBelow_2018_3_0}
int32_t customAttributeIndex;
#endif
uint32_t token;
uint16_t flags;
uint16_t iflags;
uint16_t slot;
uint8_t parameters_count;
uint8_t is_generic: 1;
uint8_t is_inflated: 1;
#if ${isEqualOrAbove_2018_1_0}
uint8_t wrapper_type: 1;
uint8_t is_marshaled_from_native: 1;
#endif
};
void *
il2cpp_method_get_pointer(const MethodInfo * method)
{
return method->methodPointer;
}
const ParameterInfo *
il2cpp_method_get_parameters (const MethodInfo * method,
void ** iter)
{
uint16_t parameters_count = method->parameters_count;
if (iter != 0 && parameters_count > 0)
{
void* temp = *iter;
if (temp == 0)
{
*iter = (void**) method->parameters;
return method->parameters;
}
else
{
const ParameterInfo * parameterInfo = (ParameterInfo*) *iter + 1;
if (parameterInfo < method->parameters + parameters_count)
{
*iter = (void*) parameterInfo;
return parameterInfo;
}
}
}
return 0;
}
struct _Il2CppString
{
Il2CppObject object;
int32_t length;
Il2CppChar chars[32];
};
void
il2cpp_string_set_length (Il2CppString * string,
int32_t length)
{
string->length = length;
}
struct _Il2CppArray
{
Il2CppObject obj;
struct Il2CppArrayBounds * bounds;
uint32_t max_length;
#if ${isBelow_5_3_3}
double vector[32];
#endif
};
#if ${isEqualOrAbove_5_3_3}
struct _Il2CppArraySize
{
#if ${isEqualOrAbove_2018_1_0}
Il2CppObject obj;
struct Il2CppArrayBounds * bounds;
uint32_t max_length;
__attribute__((aligned(8))) void * vector[32];
#else
Il2CppArray Array;
__attribute__((aligned(8))) void * vector;
#endif
};
#endif
#if ${isEqualOrAbove_5_3_3}
void *
il2cpp_array_elements (Il2CppArraySize * array) {
#if ${isEqualOrAbove_2018_1_0}
return array->vector;
#else
return &array->vector;
#endif
}
#else
void *
il2cpp_array_elements (Il2CppArray * array) {
return (void*) array->vector;
}
#endif
struct _Il2CppMetadataSnapshot
{
uint32_t typeCount;
struct Il2CppMetadataType * types;
};
struct _Il2CppManagedMemorySection
{
uint64_t sectionStartAddress;
uint32_t sectionSize;
uint8_t * sectionBytes;
};
struct _Il2CppManagedHeap
{
uint32_t sectionCount;
Il2CppManagedMemorySection * sections;
};
struct _Il2CppStacks
{
uint32_t stackCount;
Il2CppManagedMemorySection * stacks;
};
struct _Il2CppGCHandles
{
uint32_t trackedObjectCount;
Il2CppObject ** pointersToObjects;
};
struct _Il2CppRuntimeInformation
{
uint32_t pointerSize;
uint32_t objectHeaderSize;
uint32_t arrayHeaderSize;
uint32_t arrayBoundsOffsetInHeader;
uint32_t arraySizeOffsetInHeader;
uint32_t allocationGranularity;
};
struct _Il2CppManagedMemorySnapshot
{
Il2CppManagedHeap heap;
Il2CppStacks stacks;
Il2CppMetadataSnapshot metadata;
Il2CppGCHandles gcHandles;
Il2CppRuntimeInformation runtimeInformation;
void * additionalUserInformation;
};
uint32_t
il2cpp_memory_snapshot_get_tracked_object_count (Il2CppManagedMemorySnapshot * snapshot)
{
return snapshot->gcHandles.trackedObjectCount;
}
Il2CppObject **
il2cpp_memory_snapshot_get_objects (Il2CppManagedMemorySnapshot * snapshot)
{
return snapshot->gcHandles.pointersToObjects;
}
`);
}