public static IntPtr GetIl2CppClass(string assemblyName, string namespaze, string className) { if (!ourImagesMap.TryGetValue(assemblyName, out var image)) { LogSupport.Log($"Assembly {assemblyName} is not registered in il2cpp"); return(IntPtr.Zero); } var clazz = il2cpp_class_from_name(image, namespaze, className); return(clazz); }
static IL2CPP() { var domain = il2cpp_domain_get(); if (domain == IntPtr.Zero) { LogSupport.Log("No il2cpp domain found; sad!"); return; } uint assembliesCount = 0; var assemblies = il2cpp_domain_get_assemblies(domain, ref assembliesCount); for (var i = 0; i < assembliesCount; i++) { var image = il2cpp_assembly_get_image(assemblies[i]); var name = Marshal.PtrToStringAnsi(il2cpp_image_get_name(image)); ourImagesMap[name] = image; } }
public static IntPtr GetIl2CppMethod(IntPtr clazz, string methodName, params string[] argTypes) { if (clazz == IntPtr.Zero) { return(IntPtr.Zero); } for (var index = 0; index < argTypes.Length; index++) { var argType = argTypes[index]; argTypes[index] = Regex.Replace(argType, "\\`\\d+", "").Replace('/', '.'); } var methodsSeen = 0; var lastMethod = IntPtr.Zero; IntPtr iter = IntPtr.Zero; IntPtr method; while ((method = il2cpp_class_get_methods(clazz, ref iter)) != IntPtr.Zero) { if (Marshal.PtrToStringAnsi(il2cpp_method_get_name(method)) != methodName) { continue; } if (il2cpp_method_get_param_count(method) != argTypes.Length) { continue; } methodsSeen++; lastMethod = method; var badType = false; for (var i = 0; i < argTypes.Length; i++) { var paramType = il2cpp_method_get_param(method, (uint)i); var typeName = Marshal.PtrToStringAnsi(il2cpp_type_get_name(paramType)); if (typeName != argTypes[i]) { badType = true; break; } } if (badType) { continue; } return(method); } if (methodsSeen == 1) { return(lastMethod); } LogSupport.Log($"Unable to find method {Marshal.PtrToStringAnsi(il2cpp_class_get_name(clazz))}::{methodName}; signature follows"); foreach (var argType in argTypes) { LogSupport.Log($" {argType}"); } LogSupport.Log("Available methods of this name follow:"); iter = IntPtr.Zero; while ((method = il2cpp_class_get_methods(clazz, ref iter)) != IntPtr.Zero) { if (Marshal.PtrToStringAnsi(il2cpp_method_get_name(method)) != methodName) { continue; } // if(il2cpp_method_get_param_count(method) != argTypes.Length) // continue; var nParams = il2cpp_method_get_param_count(method); LogSupport.Log("Method starts"); for (var i = 0; i < nParams; i++) { var paramType = il2cpp_method_get_param(method, (uint)i); var typeName = Marshal.PtrToStringAnsi(il2cpp_type_get_name(paramType)); LogSupport.Log($" {typeName}"); } return(method); } return(IntPtr.Zero); }