【问题标题】:How can I write on another process memory?如何在另一个进程内存上写入?
【发布时间】:2011-06-05 02:44:16
【问题描述】:

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

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

// Address
var addr = 0x00A66E11;

// Value
var val = 0x63;

如何将0x63 (99) 写入另一个进程内存上的此地址?

【问题讨论】:

  • 不要使用var addr...它默认为int。请改用IntPtr

标签: c# process memory-editing


【解决方案1】:

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

【讨论】:

  • 呃...我可以建议你永远不要,永远再次使用int 来表示内存地址吗?谢谢你。 :)
  • 我懒得输入IntPtr,但我会记住这一点:P
  • 你忘记了 WriteMem() 中的 CloseHandle()
  • 您可能还想检查 WriteProcessMemory() 的返回值,因为 TomTom 指出它确实需要特权才能做到这一点。如果您没有足够的权限,您可能需要调用 AdjustTokenPrivilege。
【解决方案2】:

在 pinvoke.net 上查看WriteProcessMemory

这是 StackOverflow 上另一个类似的 post,但他们在谈论 C++。你可以使用 pinvoke 来做同样的事情。

【讨论】:

【解决方案3】:

尽管诸如 WriteProcessMemory 之类的 P/Invoke 原生函数运行良好,但存在专门用于内存编辑的库,使您能够以更简单的方式完成此任务。

使用库MemorySharp,可以总结为:

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

前面的代码假设写入值的地址没有变基。

【讨论】:

    【解决方案4】:

    您可以使用WriteProcessMemory,但请注意,您需要打开调试权限,并且它不适用于 Vista 及更高版本中的大量安全进程。

    而且您可能会朝自己的脚开枪并撞上几次东西。我建议您在执行此操作时不要运行任何重要程序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多