C# 写入内存

还有一些方便的库:

  1. Memory.dll
    https://newagesoldier.com/memory.dll/
    https://github.com/erfg12/memory.dll

  2. EasyHook
    https://easyhook.github.io/
    https://github.com/EasyHook/EasyHook

  3. Vanara.PInvoke
    https://github.com/dahall/Vanara

  4. PInvoke
    https://github.com/dotnet/pinvoke

  5. 通过 kernel32.dll 写入或读取其他进程内存

public class Helper
{
	[DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
	public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, IntPtr lpNumberOfBytesRead);

	[DllImport("kernel32.dll", EntryPoint = "OpenProcess")]
	public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

	[DllImport("kernel32.dll")]
	private static extern void CloseHandle(IntPtr hObject);

	[DllImport("kernel32.dll", EntryPoint = "WriteProcessMemory")]
	public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, int[] lpBuffer, int nSize, IntPtr lpNumberOfBytesWritten);

	public static int ReadMemoryValue(int baseAddress, string processName)
	{
		try
		{
			byte[] buffer = new byte[4];
			IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); //获取缓冲区地址
			IntPtr hProcess = OpenProcess(0x1f0fff, false, GetPidByProcessName(processName));
			ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, 4, IntPtr.Zero); //将制定内存中的值读入缓冲
			CloseHandle(hProcess);
			return Marshal.ReadInt32(byteAddress);
		}
		catch
		{
			return 0;
		}
	}

	public static void WriteMemory(int baseAddress, string processName, int value)
	{
		var hProcess = OpenProcess(0x1f0fff, false, GetPidByProcessName(processName));
		WriteProcessMemory(hProcess, (IntPtr)baseAddress, new int[] { value }, 4, IntPtr.Zero);
		CloseHandle(hProcess);
	}


	public static void KillProcessByPid(int pid)
	{
		var process = Process.GetProcessById(pid);
		process?.Kill();
	}

	public static void KillProcessByWinTitle(string winTitle)
	{
		var processes = Process.GetProcesses();
		var process = processes.FirstOrDefault(z => z.MainWindowTitle.Contains(winTitle));
		process?.Kill();
	}

	public static void KillProcessByProcessName(string processName)
	{
		var processes = Process.GetProcessesByName(processName);
		processes.FirstOrDefault()?.Kill();
	}

	public static int GetPidByWinTitle(string winTitle)
	{
		var processes = Process.GetProcesses();
		return processes.FirstOrDefault(z => z.MainWindowTitle.Contains(winTitle))?.Id ?? 0;
	}

	public static int GetPidByProcessName(string processName)
	{
		var processes = Process.GetProcessesByName(processName);
		return processes.FirstOrDefault()?.Id ?? 0;
	}
}
posted @ 2024-04-25 16:02  灵火  阅读(17)  评论(0编辑  收藏  举报