From 7497beda5a9be165332579578c9258758f067c9a Mon Sep 17 00:00:00 2001 From: Bitl Date: Sat, 9 Mar 2019 10:49:51 -0700 Subject: [PATCH] anti-cheat dll support --- .../NovetusLauncher/LauncherFuncs.cs | 124 ++++++++++++++++++ NovetusLauncher/NovetusLauncher/MainForm.cs | 1 + .../NovetusLauncher/bin/Release/Mono.Nat.dll | Bin 0 -> 47104 bytes 3 files changed, 125 insertions(+) create mode 100644 NovetusLauncher/NovetusLauncher/bin/Release/Mono.Nat.dll diff --git a/NovetusLauncher/NovetusLauncher/LauncherFuncs.cs b/NovetusLauncher/NovetusLauncher/LauncherFuncs.cs index 12a0ab0..cee75f4 100644 --- a/NovetusLauncher/NovetusLauncher/LauncherFuncs.cs +++ b/NovetusLauncher/NovetusLauncher/LauncherFuncs.cs @@ -790,6 +790,15 @@ namespace NovetusLauncher RenameWindow(exe, type); } } + + public static void InjectAntiCheat(Process client) + { + if (client.IsRunning() == true) + { + var injector = new DllInjector(); + injector.Inject(client, GlobalVars.BasePath + "\\soda.dll"); + } + } } public static class RichTextBoxExtensions @@ -1921,6 +1930,121 @@ namespace NovetusLauncher } } + public enum DllInjectionResult + { + DllNotFound, + GameProcessNotFound, + InjectionFailed, + Success + } + + public sealed class DllInjector + { + static readonly IntPtr INTPTR_ZERO = (IntPtr)0; + + [DllImport("kernel32.dll", SetLastError = true)] + static extern IntPtr OpenProcess(uint dwDesiredAccess, int bInheritHandle, uint dwProcessId); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern int CloseHandle(IntPtr hObject); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern IntPtr GetModuleHandle(string lpModuleName); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, IntPtr dwSize, uint flAllocationType, uint flProtect); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern int WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] buffer, uint size, int lpNumberOfBytesWritten); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttribute, IntPtr dwStackSize, IntPtr lpStartAddress, + IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); + + static DllInjector _instance; + + public static DllInjector GetInstance + { + get + { + if (_instance == null) + { + _instance = new DllInjector(); + } + return _instance; + } + } + + public DllInjector() + { + } + + public DllInjectionResult Inject(Process sProcName, string sDllPath) + { + if (!File.Exists(sDllPath)) + { + return DllInjectionResult.DllNotFound; + } + + uint _procId = (uint)sProcName.Id; + + if (_procId == 0) + { + return DllInjectionResult.GameProcessNotFound; + } + + if (!bInject(_procId, sDllPath)) + { + return DllInjectionResult.InjectionFailed; + } + + return DllInjectionResult.Success; + } + + bool bInject(uint pToBeInjected, string sDllPath) + { + IntPtr hndProc = OpenProcess((0x2 | 0x8 | 0x10 | 0x20 | 0x400), 1, pToBeInjected); + + if (hndProc == INTPTR_ZERO) + { + return false; + } + + IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); + + if (lpLLAddress == INTPTR_ZERO) + { + return false; + } + + IntPtr lpAddress = VirtualAllocEx(hndProc, (IntPtr)null, (IntPtr)sDllPath.Length, (0x1000 | 0x2000), 0X40); + + if (lpAddress == INTPTR_ZERO) + { + return false; + } + + byte[] bytes = Encoding.ASCII.GetBytes(sDllPath); + + if (WriteProcessMemory(hndProc, lpAddress, bytes, (uint)bytes.Length, 0) == 0) + { + return false; + } + + if (CreateRemoteThread(hndProc, (IntPtr)null, INTPTR_ZERO, lpLLAddress, lpAddress, 0, (IntPtr)null) == INTPTR_ZERO) + { + return false; + } + + CloseHandle(hndProc); + + return true; + } + } + public static class GlobalVars { public static string RootPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); diff --git a/NovetusLauncher/NovetusLauncher/MainForm.cs b/NovetusLauncher/NovetusLauncher/MainForm.cs index fa873f9..e10987d 100644 --- a/NovetusLauncher/NovetusLauncher/MainForm.cs +++ b/NovetusLauncher/NovetusLauncher/MainForm.cs @@ -844,6 +844,7 @@ namespace NovetusLauncher client.Exited += new EventHandler(ClientExited); client.Start(); SecurityFuncs.RenameWindow(client, ScriptGenerator.ScriptType.Client); + //SecurityFuncs.InjectAntiCheat(client); GlobalVars.presence.details = ""; GlobalVars.presence.state = "In " + GlobalVars.SelectedClient + " Game"; GlobalVars.presence.largeImageText = GlobalVars.PlayerName + " | In " + GlobalVars.SelectedClient + " Game"; diff --git a/NovetusLauncher/NovetusLauncher/bin/Release/Mono.Nat.dll b/NovetusLauncher/NovetusLauncher/bin/Release/Mono.Nat.dll new file mode 100644 index 0000000000000000000000000000000000000000..592850b991023a39e8fc6f4087a7292d2f65cdfa GIT binary patch literal 47104 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

C(X%b^QneI!TjnpS_GVD$ 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�O6oWK6~*q={9Y-1Nlk=yX5%+M(p+d#NVr7 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 FzX1!`*{lEn literal 0 HcmV?d00001