import {soName} from "../config"; import {Il2CppImage} from "./struct/Il2CppImage"; import {Il2CppClass} from "./struct/Il2CppClass"; import {Il2CppType} from "./struct/Il2CppType"; import {Il2CppFieldInfo} from "./struct/Il2CppFieldInfo"; import {Il2CppPropertyInfo} from "./struct/Il2CppPropertyInfo"; import {MethodInfo} from "./struct/MethodInfo"; import {log} from "../logger"; let nativeFunMap = new Map(); export var il2cppApi = { nativeFunNotExistMap: new Map(), il2cpp_array_new:function (klass,size){ let il2cpp_array_new = this.load("il2cpp_array_new",'pointer',['pointer','uint64']); return il2cpp_array_new(klass,size); }, il2cpp_array_get_byte_length:function (array){ let il2cpp_array_get_byte_length = this.load("il2cpp_array_get_byte_length",'uint32',['pointer']); return il2cpp_array_get_byte_length(array); }, il2cpp_domain_get: function () { return this.load("il2cpp_domain_get", 'pointer', []); }, il2cpp_thread_attach: function (domain) { return this.load("il2cpp_thread_attach", 'pointer', ['pointer']); }, il2cpp_string_length: function (Il2cppString) { let il2cpp_string_length = this.load("il2cpp_string_length", "int", ['pointer']); return il2cpp_string_length(Il2cppString); }, il2cpp_string_chars: function (Il2cppString) { let il2cpp_string_chars = this.load("il2cpp_string_chars", "pointer", ['pointer']); return il2cpp_string_chars(Il2cppString); }, il2cpp_string_new: function (str) { let il2cpp_string_new = this.load("il2cpp_string_new", "pointer", ['pointer']); return il2cpp_string_new(str); }, il2cpp_domain_get_assemblies: function (il2Cppdomain, size_t) { let il2cpp_domain_get_assemblies = this.load("il2cpp_domain_get_assemblies", 'pointer', ['pointer', 'pointer']); return il2cpp_domain_get_assemblies(il2Cppdomain, size_t); }, il2cpp_gc_collect_a_little: function () { let il2cpp_gc_collect_a_little = this.load("il2cpp_gc_collect_a_little" + "", 'pointer', ['pointer', 'pointer']); return il2cpp_gc_collect_a_little(il2Cppdomain, size_t); }, il2cpp_assembly_get_image: function (il2Cppassembly) { let il2cpp_assembly_get_image = this.load("il2cpp_assembly_get_image", 'pointer', ['pointer']); try { return new Il2CppImage(il2cpp_assembly_get_image(il2Cppassembly)); } catch (e) { return new Il2CppImage(il2Cppassembly.readPointer()); } }, il2cpp_image_get_class_count: function (image) { // size_t il2cpp_image_get_class_count(const Il2CppImage * image) let il2cpp_image_get_class_count = this.load("il2cpp_image_get_class_count", "pointer", ['pointer']); if (il2cpp_image_get_class_count !== undefined) { return il2cpp_image_get_class_count(image).toUInt32(); } else { return image.getOffsetTypeCount(); } }, il2cpp_image_get_name: function (Il2CppImage) { let il2cpp_image_get_name = this.load("il2cpp_image_get_name", "pointer", ['pointer']); return il2cpp_image_get_name(Il2CppImage); }, il2cpp_image_get_class: function (il2CppImage, index) { // // const Il2CppClass* il2cpp_image_get_class(const Il2CppImage * image, size_t index) let il2cpp_image_get_class = this.load("il2cpp_image_get_class", 'pointer', ['pointer', 'int']); let il2cppImageGetClass = il2cpp_image_get_class(il2CppImage, index); return new Il2CppClass(il2cppImageGetClass); }, il2cpp_class_get_type: function (il2CppClass) { let il2cpp_class_get_type = this.load("il2cpp_class_get_type", 'pointer', ["pointer"]); return new Il2CppType(il2cpp_class_get_type(il2CppClass)); }, il2cpp_class_get_element_class: function (cls) { let il2cpp_class_get_element_class = this.load("il2cpp_class_get_element_class", 'pointer', ["pointer"]); return new Il2CppClass(il2cpp_class_get_element_class(cls)); }, il2cpp_class_get_declaring_type: function (cls) { let il2cpp_class_get_declaring_type = this.load("il2cpp_class_get_declaring_type", 'pointer', ["pointer"]); return new Il2CppClass(il2cpp_class_get_declaring_type(cls)); }, il2cpp_class_from_type: function (Il2CppType) { let il2cpp_class_from_type = this.load("il2cpp_class_from_type", "pointer", ["pointer"]); if (Il2CppType === null) { return null; } return new Il2CppClass(il2cpp_class_from_type(Il2CppType)); }, il2cpp_class_get_image: function (klass) { let il2cpp_class_get_image = this.load("il2cpp_class_get_image", "pointer", ["pointer"]); return new Il2CppImage(il2cpp_class_get_image(klass)); }, il2cpp_class_from_name: function (Il2cppImage, nameSpaze, name) { let il2cpp_class_from_name = this.load("il2cpp_class_from_name", "pointer", ["pointer", "pointer", "pointer"]); let nameSpaze_t = Memory.allocUtf8String(nameSpaze); let name_t = Memory.allocUtf8String(name); return new Il2CppClass(il2cpp_class_from_name(Il2cppImage, nameSpaze_t, name_t)); }, il2cpp_class_enum_basetype: function (Il2CppClass) { let il2cpp_class_enum_basetype = this.load("il2cpp_class_enum_basetype", "pointer", ["pointer"]); return new Il2CppType(il2cpp_class_enum_basetype(Il2CppClass)); }, il2cpp_class_value_size: function (Il2CppClass, align) { let il2cpp_class_value_size = this.load("il2cpp_class_value_size", "int32", ["pointer", "pointer"]); return il2cpp_class_value_size(Il2CppClass); }, il2cpp_class_get_flags: function (Il2CppClass) { let il2cpp_class_get_flags = this.load("il2cpp_class_get_flags", "int", ["pointer"]); return il2cpp_class_get_flags(Il2CppClass); }, il2cpp_class_is_valuetype: function (Il2CppClass) { let il2cpp_class_is_valuetype = this.load("il2cpp_class_is_valuetype", "bool", ["pointer"]); return il2cpp_class_is_valuetype(Il2CppClass); }, il2cpp_class_is_generic: function (Il2CppClass) { let il2cpp_class_is_generic = this.load("il2cpp_class_is_generic", "bool", ["pointer"]); return il2cpp_class_is_generic(Il2CppClass); }, il2cpp_class_is_enum: function (Il2CppClass) { let il2cpp_class_is_enum = this.load("il2cpp_class_is_enum", "bool", ["pointer"]); return il2cpp_class_is_enum(Il2CppClass) }, il2cpp_class_get_name: function (Il2CppClass) { let il2cpp_class_get_name = this.load("il2cpp_class_get_name", "pointer", ["pointer"]); return il2cpp_class_get_name(Il2CppClass); }, il2cpp_class_get_parent: function (Il2CppClass) { let il2cpp_class_get_parent = this.load("il2cpp_class_get_parent", "pointer", ["pointer"]); return il2cpp_class_get_parent(Il2CppClass); }, il2cpp_class_get_interfaces: function (cls, iter) { let il2cpp_class_get_interfaces = this.load("il2cpp_class_get_interfaces", 'pointer', ['pointer', 'pointer']); return new Il2CppClass(il2cpp_class_get_interfaces(cls, iter)); }, il2cpp_class_get_namespace: function (Il2CppClass) { let il2cpp_class_get_namespace = this.load("il2cpp_class_get_namespace", 'pointer', ['pointer']); return il2cpp_class_get_namespace(Il2CppClass); }, il2cpp_class_num_fields: function (Il2CppClass) { let il2cpp_class_num_fields = this.load("il2cpp_class_num_fields", 'size_t', ['pointer']); return il2cpp_class_num_fields(Il2CppClass); }, il2cpp_class_get_fields: function (Il2CppClass, iter) { let il2cpp_class_get_fields = this.load("il2cpp_class_get_fields", 'pointer', ['pointer', 'pointer']); return new Il2CppFieldInfo(il2cpp_class_get_fields(Il2CppClass, iter)); }, il2cpp_class_get_properties: function (Il2CppClass, iter) { let il2cpp_class_get_properties = this.load("il2cpp_class_get_properties", 'pointer', ['pointer', 'pointer']); return new Il2CppPropertyInfo(il2cpp_class_get_properties(Il2CppClass, iter)); }, il2cpp_class_get_methods: function (Il2CppClass, iter) { let il2cpp_class_get_methods = this.load("il2cpp_class_get_methods", 'pointer', ['pointer', 'pointer']); return new MethodInfo(il2cpp_class_get_methods(Il2CppClass, iter)); }, il2cpp_class_get_method_from_name: function (Il2CppClass, name, argsCount) { let il2cpp_class_get_method_from_name = this.load("il2cpp_class_get_method_from_name", 'pointer', ['pointer', 'pointer', "int"]); let name_t = Memory.allocUtf8String(name); return new MethodInfo(il2cpp_class_get_method_from_name(Il2CppClass, name_t, argsCount)); }, il2cpp_type_get_type: function (Il2CppType) { let il2cpp_type_get_type = this.load("il2cpp_type_get_type", 'int', ['pointer']); return il2cpp_type_get_type(Il2CppType); }, /** * 非必要参数 * @param Il2CppType * @returns {number|*} */ il2cpp_type_is_byref: function (Il2CppType) { let il2cpp_type_is_byref = this.load("il2cpp_type_is_byref", "bool", ["pointer"]); // log(" il2cpp_type_is_byref:"+il2cpp_type_is_byref); if (il2cpp_type_is_byref !== undefined) { return il2cpp_type_is_byref(Il2CppType); } return Il2CppType.add(4).readS8(); }, il2cpp_type_get_attrs:function (Il2cppType){ let il2cpp_type_get_attrs = this.load("il2cpp_type_get_attrs", "int32", ["pointer"]); return il2cpp_type_get_attrs(Il2cppType); }, il2cpp_type_get_object: function (Il2CppType) { let il2cpp_type_get_object = this.load("il2cpp_type_get_object", 'pointer', ['pointer']); return il2cpp_type_get_object(Il2CppType); }, il2cpp_type_get_name: function (Il2CppType) { let il2cpp_type_get_name = this.load("il2cpp_type_get_name", 'pointer', ['pointer']); try { return il2cpp_type_get_name(Il2CppType); } catch (e) { return null; } }, il2cpp_field_static_get_value: function (FieldInfo, value) { let il2cpp_field_static_get_value = this.load("il2cpp_field_static_get_value", 'void', ['pointer', 'pointer']); return il2cpp_field_static_get_value(FieldInfo, value); }, il2cpp_field_get_parent: function (FieldInfo) { let il2cpp_field_get_parent = this.load("il2cpp_field_get_parent", 'pointer', ['pointer']); return new Il2CppClass(il2cpp_field_get_parent(FieldInfo)); }, il2cpp_field_get_flags: function (FieldInfo) { let il2cpp_field_get_flags = this.load("il2cpp_field_get_flags", "int", ['pointer']); return il2cpp_field_get_flags(FieldInfo); }, il2cpp_field_get_type: function (FieldInfo) { let il2cpp_field_get_type = this.load("il2cpp_field_get_type", "pointer", ['pointer']); return new Il2CppType(il2cpp_field_get_type(FieldInfo)); }, il2cpp_field_get_name: function (FieldInfo) { let il2cpp_field_get_name = this.load("il2cpp_field_get_name", "pointer", ['pointer']); return il2cpp_field_get_name(FieldInfo); }, il2cpp_field_get_offset: function (FieldInfo) { let il2cpp_field_get_offset = this.load("il2cpp_field_get_offset", "size_t", ['pointer']); return il2cpp_field_get_offset(FieldInfo); }, il2cpp_property_get_get_method: function (PropertyInfo) { let il2cpp_property_get_get_method = this.load("il2cpp_property_get_get_method", "pointer", ['pointer']); return new MethodInfo(il2cpp_property_get_get_method(PropertyInfo)); }, il2cpp_property_get_set_method: function (PropertyInfo) { let il2cpp_property_get_set_method = this.load("il2cpp_property_get_set_method", "pointer", ['pointer']); return new MethodInfo(il2cpp_property_get_set_method(PropertyInfo)); }, il2cpp_property_get_name: function (PropertyInfo) { let il2cpp_property_get_name = this.load("il2cpp_property_get_name", "pointer", ['pointer']); return il2cpp_property_get_name(PropertyInfo); }, il2cpp_method_get_flags: function (method, iflags) { let il2cpp_method_get_flags_api = this.load("il2cpp_method_get_flags", "uint32", ['pointer', 'uint32']); return il2cpp_method_get_flags_api(method, iflags); }, il2cpp_method_get_name: function (method) { let il2cpp_method_get_name = this.load("il2cpp_method_get_name", "pointer", ['pointer']); return il2cpp_method_get_name(method); }, il2cpp_method_get_class: function (method) { let il2cpp_method_get_class = this.load("il2cpp_method_get_class", "pointer", ['pointer']); return il2cpp_method_get_class(method); }, il2cpp_method_get_pointer: function (method) { //版本兼容有问题 let il2cpp_method_get_pointer = this.load("il2cpp_method_get_pointer", "pointer", ['pointer']); if (il2cpp_method_get_pointer !== undefined) { return il2cpp_method_get_pointer(method); } return method.readPointer(); }, il2cpp_method_get_param_count: function (method) { let il2cpp_method_get_param_count = this.load("il2cpp_method_get_param_count", "uint32", ['pointer']); return il2cpp_method_get_param_count(method); }, il2cpp_method_get_return_type: function (method) { let il2cpp_method_get_return_type = this.load("il2cpp_method_get_return_type", "pointer", ['pointer']); return new Il2CppType(il2cpp_method_get_return_type(method)); }, il2cpp_method_get_param: function (method, index) { let il2cpp_method_get_param = this.load("il2cpp_method_get_param", "pointer", ['pointer', 'uint32']); return new Il2CppType(il2cpp_method_get_param(method, index)); }, il2cpp_method_is_generic: function (method) { let il2cpp_method_is_generic = this.load("il2cpp_method_is_generic", "bool", ['pointer']); return il2cpp_method_is_generic(method); }, il2cpp_array_length(arg) { let il2cpp_array_length = this.load("il2cpp_array_length", "uint32", ['pointer']); return il2cpp_array_length(arg); }, il2cpp_method_is_inflated: function (method) { let il2cpp_method_is_inflated = this.load("il2cpp_method_is_inflated", "bool", ['pointer']); return il2cpp_method_is_inflated(method); }, il2cpp_method_get_param_name: function (method, index) { let il2cpp_method_get_param_name = this.load("il2cpp_method_get_param_name", "pointer", ['pointer', 'uint32']); return il2cpp_method_get_param_name(method, index); }, /** * 使用内存缓存加快dump速度 * @param exportName * @param reType * @param argTypes * @returns {any} */ load: function (exportName, reType, argTypes) { // new NativeFunction(Module.findExportByName(soName, "il2cpp_domain_get"), 'pointer', []); let cacheFun = nativeFunMap.get(exportName); if (cacheFun == null) { let isExist = this.nativeFunNotExistMap.get(exportName); if (isExist === -1) { return undefined; } let nativePointer = Module.findExportByName(soName, exportName); if (nativePointer == null) { this.nativeFunNotExistMap.set(exportName, -1); return undefined; } else { cacheFun = new NativeFunction(nativePointer, reType, argTypes); nativeFunMap.set(exportName, cacheFun); } } return nativeFunMap.get(exportName); }, }