Как я могу записать в другой процесс памяти? - PullRequest
7 голосов
/ 07 января 2011

У меня есть адрес, который я хотел бы изменить. У меня есть процесс. У меня есть новое значение. И что теперь?

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

// Address
var addr = 0x00A66E11;

// Value
var val = 0x63;

Как мне записать 0x63 (99) по этому адресу в другой памяти процесса?

Ответы [ 4 ]

12 голосов
/ 07 января 2011

@ Харви, из твоего ответа я откопал и нашел много:

Открывать, закрывать и писать подписи:

[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);
}
4 голосов
/ 07 января 2011

Оформить WriteProcessMemory на pinvoke.net

Вот еще один похожий пост в StackOverflow, но они говорят о C ++. Вы можете сделать то же самое, используя pinvoke.

2 голосов
/ 06 сентября 2016

Несмотря на то, что собственные функции P / Invoke, такие как WriteProcessMemory, работают отлично, библиотеки, предназначенные для редактирования памяти, существуют и позволяют выполнять эту задачу проще.

Используя библиотеку MemorySharp , это можно суммировать как:

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

В предыдущем коде предполагается, что адрес, на котором записано значение, не перебазирован.

0 голосов
/ 07 января 2011

Вы можете использовать WriteProcessMemory , но имейте в виду, что вам нужно включить привилегии отладки и что он не будет работать с большим количеством защищенных процессов в Vista и более поздних версиях.что вы, вероятно, выстрелите себе в ногу и разбейте вещи несколько раз.Я предлагаю вам не запускать важные программы, когда вы делаете это.

Удачи, вам это понадобится.:)

...