Esempio n. 1
0
        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}");
            }
        }
Esempio n. 2
0
        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;
            }
        }