public static bool ExtractResourceToFile(ConsoleContent console, string resourceName, string filename) { using (Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { if (stream == null) { console.Error("cannot find resource " + resourceName); return(false); } using (FileStream fs = new FileStream(filename, FileMode.Create)) { byte[] buf = new byte[stream.Length]; stream.Read(buf, 0, buf.Length); try { fs.Write(buf, 0, buf.Length); } catch (IOException err) { console.Error("cannot write to " + filename + ": " + err); return(false); } } } console.Info("OpenGameCamera extracted to " + filename); return(true); }
public MainWindow() { InitializeComponent(); DataContext = console; console.SetScrollViewer(Scroller); DateTime?buildDate = ResourceExtractor.GetBuildUTCTimestamp(console); if (buildDate != null) { buildTimestampUTC = buildDate.Value; buildVersion = buildDate.Value.ToString("yyyy.MM.dd-HHmmss"); CheckForLatestRelease(); } console.Info("Welcome to OpenGameCamera. To begin, ensure your game is running before starting OGC.\n\n"); }
public static bool Inject(ConsoleContent console, string dll_path) { IntPtr wnd = FindWindow(null, "STAR WARS Battlefront II"); if (wnd == null) { console.Error("failed to find an active Star Wars Battlefront II game: code=" + Marshal.GetLastWin32Error()); return(false); } uint processId = 0; GetWindowThreadProcessId(wnd, out processId); if (processId == 0) { console.Error("failed to obtain process ID for Star Wars Battlefront II game: code=" + Marshal.GetLastWin32Error()); return(false); } console.Info("found SWBF2 at pid " + processId); IntPtr procHandle = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, false, (int)processId ); if (procHandle == null) { console.Error("failed to open pid=" + processId + ": code=" + Marshal.GetLastWin32Error()); return(false); } try { IntPtr loadLibraryPtr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW"); console.Info("LoadLibraryW found at " + loadLibraryPtr.ToInt64().ToString("X16")); byte[] pathBuf = Encoding.Unicode.GetBytes(dll_path); IntPtr targetAddr = VirtualAllocEx( procHandle, IntPtr.Zero, (uint)(pathBuf.Length + Marshal.SizeOf(typeof(ushort))), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE ); if (targetAddr == null) { console.Error("failed to allocate memory in target process: code=" + Marshal.GetLastWin32Error()); return(false); } console.Info("memory allocated in SWBF2: 0x" + targetAddr.ToInt64().ToString("X16")); UIntPtr bytesWritten; if (!WriteProcessMemory(procHandle, targetAddr, pathBuf, (uint)pathBuf.Length, out bytesWritten)) { console.Error("failed to write memory in target process: code=" + Marshal.GetLastWin32Error()); return(false); } console.Info("wrote " + bytesWritten.ToUInt64() + " bytes to allocated memory"); IntPtr threadId; if (CreateRemoteThread(procHandle, IntPtr.Zero, 0, loadLibraryPtr, targetAddr, 0, out threadId) == null) { console.Error("failed to launch remote thread: code=" + Marshal.GetLastWin32Error()); return(false); } console.Info("OGC injected into SWBF2: threadId=" + threadId.ToInt64()); } finally { CloseHandle(procHandle); } return(true); }