我有一个想修改的地址。我有这个过程。我有新价值。那么现在怎么办?

// My Process
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();

// Address
var addr = 0x00A66E11;

// Value
var val = 0x63;

我该怎么写 0x63 (99)到另一个过程内存上的这个地址?

有帮助吗?

解决方案

@harvey,从您的答案中,我挖出了很多:

打开,关闭和写签名:

[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);
}

其他提示

查看 WriteProcessMemory 在pinvoke.net

这是另一个类似的 邮政 在Stackoverflow上,但他们正在谈论C ++。您可以使用Pinvoke进行相同的操作。

尽管有P/调用本机功能,例如 WriteProcessMemory 工作完美,存在专门用于内存编辑的库,并使您能够以更轻松的方式完成此任务。

使用库 内存sharp, ,这可以总结为:

using(var sharp = new MemorySharp(Process.GetProcessesByName("ePSXe").FirstOrDefault()))
{
   sharp[0x00A66E11, false].Write(0x63);
}

以前的代码假定未重新编写值的地址。

您可以使用 WriteProcessMemory, ,但是请注意,您需要打开调试特权,并且它不会与Vista及以后的许多有担保流程一起使用。

而且您可能会射击自己,几次崩溃。我建议您在执行此操作时不会运行任何重要的程序。

祝你好运,你需要它。 :)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top