我有一个我想要修改的地址。我有这个过程。我有新的价值。那么现在呢?
// My Process
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();
// Address
var addr = 0x00A66E11;
// Value
var val = 0x63;
如何在另一个进程内存上将0x63
(99)写入此地址?
答案 0 :(得分:11)
打开,关闭和写入签名:
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);
[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(IntPtr hProcess);
标志:
[Flags]
public enum ProcessAccessFlags : uint
{
All = 0x001F0FFF,
Terminate = 0x00000001,
CreateThread = 0x00000002,
VMOperation = 0x00000008,
VMRead = 0x00000010,
VMWrite = 0x00000020,
DupHandle = 0x00000040,
SetInformation = 0x00000200,
QueryInformation = 0x00000400,
Synchronize = 0x00100000
}
让我的生活更轻松:
public static void WriteMem(Process p, int address, long v)
{
var hProc = OpenProcess(ProcessAccessFlags.All, false, (int)p.Id);
var val = new byte[] { (byte)v };
int wtf = 0;
WriteProcessMemory(hProc, new IntPtr(address), val, (UInt32)val.LongLength, out wtf);
CloseHandle(hProc);
}
写入另一个进程内存:
static void Main(string[] args)
{
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();
WriteMem(p, 0x00A66DB9, 99);
}
答案 1 :(得分:4)
在pinvoke.net上查看WriteProcessMemory
这是StackOverflow上的另一个类似的post,但他们谈论的是C ++。您可以使用pinvoke执行相同的操作。
答案 2 :(得分:2)
尽管P / Invoke本机函数(如WriteProcessMemory
)运行良好,但存在专门用于内存编辑的库,使您能够以更简单的方式完成此任务。
使用库MemorySharp,可以概括为:
using(var sharp = new MemorySharp(Process.GetProcessesByName("ePSXe").FirstOrDefault()))
{
sharp[0x00A66E11, false].Write(0x63);
}
前面的代码假定写入值的地址没有重新定位。
答案 3 :(得分:0)
您可以使用WriteProcessMemory,但请注意,您需要启用调试权限,并且它无法在Vista及更高版本中使用大量安全进程。
而且你可能会在脚下射击自己并使事情崩溃几次。我建议您在执行此操作时没有运行任何重要程序。
祝你好运,你需要它。 :)