Frage

ich eine Adresse haben, dass ich ändern möchte. Ich habe den Prozess. Ich habe den neuen Wert. Also was nun?

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

// Address
var addr = 0x00A66E11;

// Value
var val = 0x63;

Wie kann ich schreiben 0x63 (99) an diese Adresse auf einem anderen Prozess-Speicher?

War es hilfreich?

Lösung

@Harvey, aus Ihrer Antwort grub ich auf und fand eine Menge:

Öffnen, Schließen und schreiben Unterschriften:

[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:

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

Machen Sie mein Leben einfache Methode:

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

Das Schreiben in einen anderen Prozess Speicher:

static void Main(string[] args)
{
    var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();

    WriteMem(p, 0x00A66DB9, 99);
}

Andere Tipps

Schauen Sie sich Write bei pinvoke.net

Hier ist eine weitere ähnliche Post auf Stackoverflow, aber sie sprechen über C ++. Sie können das gleiche mit pinvoke tun.

Trotz P / Invoke native Funktionen wie WriteProcessMemory funktioniert perfekt, gewidmet Bibliotheken Speicher Bearbeitung exist und ermöglicht es Ihnen, diese Aufgabe in einer einfacheren Art und Weise zu erreichen.

Mit der Bibliothek MemorySharp , kann dies wie folgt zusammengefasst werden:

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

Der vorherige Code übernimmt die Adresse, wo der Wert geschrieben wird, nicht indexiert wird.

Sie können mit Write sein, aber beachten Sie, dass Sie auf Debug-Privilegien drehen müssen, und dass es nicht Arbeit mit vielen gesicherten Prozessen in Vista und höher.

Und, dass Sie wahrscheinlich selbst in den Fuß schießen werde und die Dinge ein paar Mal zum Absturz bringen. Ich schlage vor, Sie keine wichtigen Programme laufen haben, wenn Sie dies tun.

Viel Glück, Sie werden es brauchen. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top