public void Init(GameState state) { _remoteOps = new RemoteOpsHandler(state.GameProcess); _cmdBufferPtr = IntPtr.Zero; ProcessModuleWow64Safe engine = state.GetModule("engine.dll"); var scanner = new SignatureScanner(state.GameProcess, engine.BaseAddress, engine.ModuleMemorySize); IntPtr ptr = scanner.Scan(new SigScanTarget("68" + scanner.Scan(new SigScanTarget("execing %s\n".ConvertToHex())).GetByteString())); if (ptr == IntPtr.Zero) { goto fail; } byte[] bytes = state.GameProcess.ReadBytes(ptr, 100); for (int i = 0; i < 100; i++) { byte e = bytes[i]; if (e == 0xA1 || (bytes[i] >= 0xB8 && bytes[i] <= 0xBF)) { uint val = state.GameProcess.ReadValue <uint>(ptr + i + 1); if (scanner.IsWithin(val)) { _cmdBufferPtr = (IntPtr)val; Debug.WriteLine("Command buffer found at 0x" + _cmdBufferPtr.ToString("X")); break; } } } GetExecPtr(state); Update(state); SendConsoleMsg("\nSourceSplit Custom Commands are present, enter \"ss_list\" to list them, or \"ss_h\" for help!\n\n"); return; fail: _cmdBufferPtr = IntPtr.Zero; Debug.WriteLine("Failed to initialize custom command handler!"); return; }
private void GetExecPtr(GameState state) { /* * ProcessModuleWow64Safe engine = state.GetModule("engine.dll"); * var scanner = new SignatureScanner(state.GameProcess, engine.BaseAddress, engine.ModuleMemorySize); * * var target = new SigScanTarget(0, ("exec config_default.cfg").ConvertToHex()); * target.OnFound = (f_proc, f_scanner, f_ptr) => * { * SigScanTarget newTarg = new SigScanTarget(0, $"68 {f_ptr.GetByteString()}"); * return f_scanner.Scan(newTarg); * }; * * _cmdExecPtr = scanner.ReadCall(scanner.Scan(target) + 0x5); */ // use export table var tier0 = state.GetModule("tier0.dll"); var tier0Symbols = WinAPI.AllSymbols(state.GameProcess, tier0); _cmdExecPtr = (IntPtr)tier0Symbols.Where(x => x.Name == "ConMsg").FirstOrDefault().Address; }