private void HookLuaApi(SymbolResolver resolver) { Kernel32.LoadLibrary(Path.Combine(Util.ExtenderDirectory, "Lua.dll")); var luaModule = Util.GetModule("Lua.dll"); var luaResolver = new DiaSymbolResolver(luaModule); luaL_newstate = luaResolver.ResolveFunction <LuaLNewStateDelegate>("luaL_newstate"); luaopen_package = luaResolver.Resolve("luaopen_package"); luaopen_io = luaResolver.Resolve("luaopen_io"); luaopen_os = luaResolver.Resolve("luaopen_os"); db_sethook = luaResolver.Resolve("db_sethook"); using var sw = new StreamWriter("PatchLog.txt"); /* do not hook luaL_openlibs so that the engine will load its own implementation of * luaopen_debug and luaopen_utf8 */ var ignoreSymbols = new string[] { "luaopen_debug", "luaopen_utf8", "luaL_openlibs" }; var symbols = resolver.FindSymbolsMatching(new Regex("lua*")) .Concat(resolver.FindSymbolsMatching(new Regex(@"\?lua*"))) .Where(symbol => !ignoreSymbols.Contains(symbol)); foreach (var symbol in symbols) { var source = resolver.Resolve(symbol); if (!luaResolver.TryResolve(symbol, out var target)) { RegisterErrorHook(symbol, source); sw.WriteLine($"Could not find symbol {symbol} in lua.dll"); continue; } var asm = new string[] { $"use64", Utilities.GetAbsoluteJumpMnemonics(target, is64bit: true) }; var hook = new AsmHook(asm, source.ToInt64(), AsmHookBehaviour.DoNotExecuteOriginal).Activate(); luahooks[symbol] = hook; sw.WriteLine($"hooked lua function {symbol}. 0x{source.ToInt64():X8} -> 0x{target.ToInt64():X8}"); } }
public void Run(RemoteHooking.IContext context) { try { var args = Environment.GetCommandLineArgs(); bool enableDebug = false; foreach (var arg in args) { if (arg == "--launch-debugger") { Debugger.Launch(); } if (arg == "-d" || arg == "--enable-debug") { Debugger.Launch(); } } var kernel = GetKernelModule().BaseAddress; var loadLibraryAFunc = Kernel32.GetProcAddress(kernel, "LoadLibraryA"); var hook = LocalHook.Create(loadLibraryAFunc, new LoadLibraryADelegate(LoadLibraryHook), null); hook.ThreadACL.SetExclusiveACL(Array.Empty <int>()); Hooks.Add("LoadLibraryA", hook); if (Is64Bit) { Kernel32.LoadLibrary("EngineWin64s.dll"); } else { Kernel32.LoadLibrary("EngineWin32s.dll"); } foreach (ProcessModule module in Process.GetCurrentProcess().Modules) { Console.WriteLine($"Module: {module.ModuleName}"); } module = GetEngineModule(); resolver = new DiaSymbolResolver(module); #if DEBUG LogEngineSymbols(resolver); #endif PdbSymbolImporter.ImportSymbols(resolver); LuaHelper.InitHelper(resolver); Hook <InitLuaDelegate>("?InitLua@ScriptManager@sgg@@SAXXZ", InitLua); Hook <ScriptManagerUpdateDelegate>("?Update@ScriptManager@sgg@@SAXAEBM@Z", ScriptManagerUpdate); scriptManager = new ScriptManager(resolver, enableDebug); Console.WriteLine($"Created ScriptManager"); RemoteHooking.WakeUpProcess(); while (true) { var code = Console.ReadLine(); Console.WriteLine("> {0}", code); scriptManager.Eval(code); Thread.Sleep(500); } } catch (Exception ex) { Console.Error.WriteLine(ex); throw; } }