|
@@ -1,5 +1,6 @@
|
|
using System;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Diagnostics;
|
|
|
|
+using System.IO;
|
|
using System.Linq;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.InteropServices;
|
|
@@ -27,35 +28,67 @@ namespace BepInEx.IL2CPP
|
|
UnityLogSource.LogInfo(log.Trim());
|
|
UnityLogSource.LogInfo(log.Trim());
|
|
}
|
|
}
|
|
|
|
|
|
- [UnmanagedFunctionPointer(CallingConvention.StdCall)]
|
|
|
|
|
|
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
|
|
private delegate IntPtr RuntimeInvokeDetour(IntPtr method, IntPtr obj, IntPtr parameters, IntPtr exc);
|
|
private delegate IntPtr RuntimeInvokeDetour(IntPtr method, IntPtr obj, IntPtr parameters, IntPtr exc);
|
|
|
|
|
|
|
|
+ [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
|
|
|
|
+ private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
|
|
|
|
+
|
|
|
|
+ private static RuntimeInvokeDetour originalInvoke;
|
|
|
|
+
|
|
public unsafe IL2CPPChainloader()
|
|
public unsafe IL2CPPChainloader()
|
|
{
|
|
{
|
|
|
|
+ UnityVersionHandler.Initialize(2019, 3, 15);
|
|
|
|
+ File.AppendAllText("log.log", "Initialized unhollower\n");
|
|
ClassInjector.DoHook = (ptr, intPtr) =>
|
|
ClassInjector.DoHook = (ptr, intPtr) =>
|
|
{
|
|
{
|
|
var detour = new NativeDetour(new IntPtr(*((int**)ptr)), intPtr);
|
|
var detour = new NativeDetour(new IntPtr(*((int**)ptr)), intPtr);
|
|
detour.Apply();
|
|
detour.Apply();
|
|
};
|
|
};
|
|
|
|
|
|
- var gameAssemblyModule = Process.GetCurrentProcess().Modules.Cast<ProcessModule>().First(x => x.FileName.Contains("GameAssembly"));
|
|
|
|
- var functionPtr = DynDll.GetFunction(gameAssemblyModule.BaseAddress, "il2cpp_runtime_invoke");
|
|
|
|
-
|
|
|
|
- RuntimeInvokeDetour originalInvoke = null;
|
|
|
|
- RuntimeInvokeDetour invokeHook = (method, obj, parameters, exc) =>
|
|
|
|
|
|
+ foreach (var processModule in Process.GetCurrentProcess().Modules.Cast<ProcessModule>())
|
|
{
|
|
{
|
|
- UnityLogSource.LogInfo(Marshal.PtrToStringAnsi(UnhollowerBaseLib.IL2CPP.il2cpp_method_get_name(method)));
|
|
|
|
- return originalInvoke(method, obj, parameters, exc);
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- var invokeDetour = new NativeDetour(functionPtr, Marshal.GetFunctionPointerForDelegate(invokeHook), new NativeDetourConfig {ManualApply = true});
|
|
|
|
-
|
|
|
|
|
|
+ File.AppendAllText("wew.log", $"{processModule.ModuleName}\n");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var gameAssemblyModule = Process.GetCurrentProcess().Modules.Cast<ProcessModule>().First(x => x.ModuleName.Contains("GameAssembly"));
|
|
|
|
+ File.AppendAllText("wew.log", $"Got module: {gameAssemblyModule.ModuleName}; addr: {gameAssemblyModule.BaseAddress}\n");
|
|
|
|
+ var functionPtr = GetProcAddress(gameAssemblyModule.BaseAddress, "il2cpp_runtime_invoke"); //DynDll.GetFunction(gameAssemblyModule.BaseAddress, "il2cpp_runtime_invoke");
|
|
|
|
+
|
|
|
|
+ File.AppendAllText("wew.log", $"Got fptr: {functionPtr}\n");
|
|
|
|
+
|
|
|
|
+ // RuntimeInvokeDetour invokeHook = (method, obj, parameters, exc) =>
|
|
|
|
+ // {
|
|
|
|
+ // // UnityLogSource.LogInfo(Marshal.PtrToStringAnsi(UnhollowerBaseLib.IL2CPP.il2cpp_method_get_name(method)));
|
|
|
|
+ // return originalInvoke(method, obj, parameters, exc);
|
|
|
|
+ // };
|
|
|
|
+ // UnhollowerBaseLib.IL2CPP.il2cpp_method_get_name(method)
|
|
|
|
+
|
|
|
|
+ var invokeDetour = new NativeDetour(functionPtr, Marshal.GetFunctionPointerForDelegate(new RuntimeInvokeDetour(OnInvokeMethod)), new NativeDetourConfig {ManualApply = true});
|
|
|
|
+
|
|
|
|
+ File.AppendAllText("log.log", "Got detour\n");
|
|
originalInvoke = invokeDetour.GenerateTrampoline<RuntimeInvokeDetour>();
|
|
originalInvoke = invokeDetour.GenerateTrampoline<RuntimeInvokeDetour>();
|
|
-
|
|
|
|
|
|
+ File.AppendAllText("log.log", "Got trampoline\n");
|
|
|
|
+
|
|
invokeDetour.Apply();
|
|
invokeDetour.Apply();
|
|
|
|
+ File.AppendAllText("log.log", "Applied!\n");
|
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
|
- //UnityVersionHandler.Initialize(2019, 3, 15);
|
|
|
|
|
|
+ private static IntPtr OnInvokeMethod(IntPtr method, IntPtr obj, IntPtr parameters, IntPtr exc)
|
|
|
|
+ {
|
|
|
|
+ lock (originalInvoke)
|
|
|
|
+ {
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ File.AppendAllText("log.log", $"Got call: {Marshal.PtrToStringAnsi(UnhollowerBaseLib.IL2CPP.il2cpp_method_get_name(method))}\n");
|
|
|
|
+ }
|
|
|
|
+ catch (Exception e)
|
|
|
|
+ {
|
|
|
|
+ File.AppendAllText("err.log", e.ToString() + "\n");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return originalInvoke(method, obj, parameters, exc);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
protected override void InitializeLoggers()
|
|
protected override void InitializeLoggers()
|